0

私はCDIとEJBの初心者で、jbossWebアプリケーションを作成しました。ただし、さらに、このアプリでrabbitmqメッセージを処理することも必要でした。これらを処理するときは、永続化作業を行いたいと思いますが、@ Startupアノテーションで開始されるアプリケーションスコープのBeanからのrabbitmqメッセージをリッスンしていたため、この範囲内でトランザクションをコミットできませんでした。ある種のスコープ、つまり、アプリケーションスコープから離れているため、このスコープからアノテーションを作成するすべてのBeanがアプリケーションスコープになります。em.getTransaction()とem.commit()を実行しようとすると、JTAトランザクションでgetTransaction()を呼び出せないというコードが表示され、ユーザートランザクションを使用すると、すべての操作が同じトランザクションに適用されるように見えます。最終的にロールバックされ、

4

1 に答える 1

1

CDI Beanは、EJBのようにすぐに使用できるトランザクションをサポートしていません。したがって、オプションは次のいずれかになります。

  1. RabbitMQメッセージを受信したら、永続化作業を行ういくつかのEJBを(直接またはオブザーバーを介して)呼び出します。
  2. 次のいずれかを使用して、既存のCDIBeanにトランザクションサポートを追加します-ApacheDeltaSpikeまたはSeamPersistence

あなたが提供した情報に基づいてあなたに詳細を与えることは確かに非常に難しいです。ただし、概念レベルでは、上記のアプローチの1つでうまくいきます。

また、の概念はevent scope紛らわしいようです。私はあなたがそれを必要としないと言うでしょう。上記のアプローチの1つで十分です。また、CDIイベントもご覧ください。

于 2013-03-19T17:26:20.450 に答える