0

我正在使用Alpakka JMS连接器从Oracle AQ中取出项目,并使用Slick进行数据库操作,队列和表位于同一架构上。

我需要以事务方式进行出队和数据库操作,所以如果一个失败,另一个也会失败。有没有办法实现这个功能?

到目前为止我想出的是有两个单独的交易,这是不安全的:

val source: Source[Message, NotUsed] = JmsSource(
    JmsSourceSettings(connectionFactory)
        .withQueue("My_Queue").withBufferSize(10)
        .withAcknowledgeMode(AcknowledgeMode.ClientAcknowledge)
)

val sink = Sink.foreach { m: Message =>
    val txtMessage = m.asInstanceOf[TextMessage].getText

    // commits only for Slick
    val dbResult = db.run(
        (for{
            tableUpdate <- updateTable()
            result <- updateAnotherTable()
        } yield result).transactionally
    )

    dbResult.map { _ =>
        // commits only for JMS
        m.acknowledge() 
    }
}

source.runWith(sink)
4

0 回答 0