2017-12-05 7 views
0

簡潔に、私は春から入手した超簡単な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を供給することです。

答えて

0

JmsTemplateがリスナーコンテナのトランザクションに参加しないように、2つの接続ファクトリを使用する必要があります。

テンプレートは、接続ファクトリでキーされたトランザクションリソース(セッション)のルックアップを実行します。

異なる接続ファクトリを持つ場合は見つからず、代わりに独自のセッションを使用します。

関連する問題