我正在使用 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)