JMSリスナエンドポイントをプログラムで登録すると、トランザクションのサポートはもうありません。Spring JMSプログラムリスナのエンドポイントとトランザクション
私はJTAがないように素敵なグローバル・トランザクションを与えるJDBCデータソースとJMS、(1PCグローバルTX)でTransactionAwareConnectionFactoryProxyを使用しています。アノテーションを使用すると、正常に動作します。
@JmsListener(containerFactory = "jmsQueueListenerContainerFactory", destination = "queue/exampleQueue")
@Transactional
public void onQueueMessage(Message message, Session session) {...}
しかし、プログラムによるエンドポイント登録では機能しません。エンドポイントの登録コード:
@Override
public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) {
registrar.setContainerFactory(jmsListenerContainerFactory());
SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint();
endpoint.setId("Oelieboeliwieli");
endpoint.setDestination("queue/exampleQueue");
endpoint.setMessageListener(new Consumer());
registrar.registerEndpoint(endpoint);
}
そしてリスナーだけです:
@Transactional
public void onMessage(Message message) { ... }
他のすべてが2例でも同じです。私の推測では、グローバルトランザクションを処理するonMessage()
メソッドに対してプロキシが生成されていないということです。注釈付きソリューションでは、invokeWithinTransaction()
から呼び出されたプロキシが生成されています。
簡単な方法でこれを行う方法はありますか?
ありがとう、それは私の問題を解決しました。 – dvaneynde
理由については、私も条件付きのものでそれをやっている可能性があります。しかし、私は実際にこれを理解したかったのです。なぜなら、あなたはJDBCとJMSを実行している間にTransactionalを置くので、グローバルなtxを持っていないのです。故障シナリオが実際に動作するかどうかをテストする必要があります。非JEE環境では、それはです。 – dvaneynde