单笔交易中的Alpakka JMS和Slick

时间:2017-12-15 09:52:51

标签: scala jms slick oracle-aq alpakka

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

0 个答案:

没有答案