5

JBossAS7.1のJMSキューにイベントを書き込もうとしているJBossSeam2.3アプリケーションがあります。書き込みはステートレスEJB内で行われ、標準のSeamインジェクションメカニズムを使用します。コードは次のようになります(正確なコードスニペットではありません。私が行っていることのタイプを示しているだけです)。

@Name("myEjb")
@Stateless
public class MyEjb {

   ...

   @In
   private QueueSession queueSession;

   @In
   private QueueSender myQueueSender;

   ...


   public foo() {
       ...
       // Code to place a TextMessage on the queue
       ...
   }
}

ただし、アプリケーションに負荷がかかっていて、このメソッドが頻繁に呼び出されている場合、ログに次の例外が発生することに気付きました。

21:58:57,800 ERROR [org.hornetq.ra.HornetQRASessionFactoryImpl] (http--0.0.0.0-8080-1) Could not create session: javax.jms.IllegalStateException: Only allowed one session per connection. See the J2EE spec, e.g. J2EE1.4 Section 6.6

at org.hornetq.ra.HornetQRASessionFactoryImpl.allocateConnection(HornetQRASessionFactoryImpl.java:816)

at org.hornetq.ra.HornetQRASessionFactoryImpl.createQueueSession(HornetQRASessionFactoryImpl.java:237)

at org.jboss.seam.jms.QueueSession.create(QueueSession.java:38) [jboss-seam.jar:2.3.0.Final]

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_07]

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_07]

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_07]

at java.lang.reflect.Method.invoke(Method.java:601) [rt.jar:1.7.0_07]

at org.jboss.seam.util.Reflections.invoke(Reflections.java:22) [jboss-seam.jar:2.3.0.Final]

at org.jboss.seam.util.Reflections.invokeAndWrap(Reflections.java:144) [jboss-seam.jar:2.3.0.Final]

at org.jboss.seam.Component.callComponentMethod(Component.java:2313) [jboss-seam.jar:2.3.0.Final]

at org.jboss.seam.Component.callCreateMethod(Component.java:2236) [jboss-seam.jar:2.3.0.Final]

at org.jboss.seam.Component.newInstance(Component.java:2196) [jboss-seam.jar:2.3.0.Final]

at org.jboss.seam.Component.getInstance(Component.java:2034) [jboss-seam.jar:2.3.0.Final]

at org.jboss.seam.Component.getInstance(Component.java:1996) [jboss-seam.jar:2.3.0.Final]

at org.jboss.seam.Namespace.getComponentInstance(Namespace.java:60) [jboss-seam.jar:2.3.0.Final]

at org.jboss.seam.Component.getInstanceInAllNamespaces(Component.java:2427) [jboss-seam.jar:2.3.0.Final]

at org.jboss.seam.Component.getValueToInject(Component.java:2366) [jboss-seam.jar:2.3.0.Final]

at org.jboss.seam.Component.injectAttributes(Component.java:1743) [jboss-seam.jar:2.3.0.Final]

at org.jboss.seam.Component.inject(Component.java:1561) [jboss-seam.jar:2.3.0.Final]

at org.jboss.seam.core.BijectionInterceptor.aroundInvoke(BijectionInterceptor.java:61) [jboss-seam.jar:2.3.0.Final]

at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) [jboss-seam.jar:2.3.0.Final]

at org.jboss.seam.core.MethodContextInterceptor.aroundInvoke(MethodContextInterceptor.java:44) [jboss-seam.jar:2.3.0.Final]

foo()メソッドは、リクエストがRESTfulサービスに送信された後に最終的に呼び出されます。クライアントは、このサービスに対して連続して多数の呼び出しを行う可能性がありますが、それらはすべて別個の呼び出しです。

この例外の原因は何でしょうか?過去にSeamとJMSを問題なく使用できましたが、このアプリケーションは、過去に作成したものよりもかなり多くのJMSキューへの書き込みを行います。私のcomponents.xmlファイルは正しくseutpであり、エラーは発生しません。さらに、foo()を1回呼び出して、キューにメッセージを書き込むのに問題はありません。これは、foo()メソッドを多数連続して呼び出した場合にのみ発生します。

考え?私が試すことができることやこれをトラブルシューティングする方法についての推奨事項はありますか?

更新: 私が使用しているメッセージングキューは、JBossAS7.1に埋め込まれたHornetQです。キューにメッセージを書き込もうとする複数のスレッドに関するある種の問題のように思われます。それ以上の情報はありませんし、この問題を乗り越える方法もわかりません。私はあなたが与えることができるどんな助けにも本当に感謝します。

4

1 に答える 1

3

これはJCA仕様の一部です。プールされた接続ファクトリの場合、JCA接続は内部的に接続/セッションの倍増であるため、複数のセッションを作成することはできません。

JCA Connectionsは、プールとXAとのシームレスな統合を提供します。XAが必要ない場合は、standalone.xmlで定義されている通常の接続ファクトリを使用できます。

プールとXAが必要な場合は、セッションごとに1つの接続を作成すると、この問題を解決できるはずです。

于 2013-02-05T15:34:17.597 に答える