2017-06-16 19 views
0

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()から呼び出されたプロキシが生成されています。

簡単な方法でこれを行う方法はありますか?

答えて

0

Consumerは、オブジェクトがマネージドBeanではないように手作業で作成しています。アプリケーションコンテキストがそのクラスを処理し、そのクラスのプロキシを作成する理由はありません。

メッセージリスナーを作成するには、マネージドBeanを使用する必要があります。あなたが提供したコードを考えると、なぜプログラム的な登録をする必要があるのか​​を理解することは難しいですが、それはまったく別の話題です。

+0

ありがとう、それは私の問題を解決しました。 – dvaneynde

+0

理由については、私も条件付きのものでそれをやっている可能性があります。しかし、私は実際にこれを理解したかったのです。なぜなら、あなたはJDBCとJMSを実行している間にTransactionalを置くので、グローバルなtxを持っていないのです。故障シナリオが実際に動作するかどうかをテストする必要があります。非JEE環境では、それはです。 – dvaneynde

関連する問題