簡潔に、私は春から入手した超簡単なJMS設定を使用します。ガイド:https://spring.io/guides/gs/messaging-jms/。すぐに現在のTXステータスを無視してJMSメッセージを送信する
私の場合は、私はTXが失敗した場合でも、同様STH(kotlinコード)トランザクションメソッドからJMSメッセージを送りたいということです:ない場合
@Service
open class MyService(private val t: JmsTemplate) {
//
@Transactional
open fun go(sth: String) {
val result = // some logic here
t.convertAndSend("NeedsToBeDelivered", result)
// more logic which might fail
}
}
結果は、TXが成功した場合にのみ配信されます - ロジックセクションがさらに失敗する - msgは失われています。 私は多種多様な方法でAMQを設定しようとしていましたが、いくつかのTXの亜種も試しましたが、私の作品はありませんでした。
私は に関心がありますか?TXステータスを無視して 2 /即時配送(現在のTXが終了するまで延期されていません)。
提案?
UPDATE
昨日私はこの1つを試してみましたが、期待通りに動作します。それは、我々はすべてのはconn.close()様混乱と例外処理を避けるため、この方法で行われた - ゲイリーによって提案
@Transactional(propagation = NOT_SUPPORTED)
fun sendNoTx(msg: String, destination: String) = try {
val con = cf.createConnection() // cf stands for connection factory
con.start()
val session = con.createSession(false, AUTO_ACKNOWLEDGE)
val producer = session.createProducer(session.createQueue(destination))
producer.send(session.createTextMessage(msg))
con.close()
} catch (e: Exception) {
LOG.warn("Failed to send NO TX message", e)
}
よりエレガントな解決策は、CFの別のインスタンスでJmsTemplateを供給することです。