JMS / Seam - 创建会话时的例外情况?

时间:2013-01-29 14:32:40

标签: jboss queue jms seam hornetq

我有一个JBoss Seam 2.3应用程序试图将事件写入JBoss AS 7.1上的JMS队列。写入发生在无状态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]

在将请求发送到RESTful服务后,最终会调用foo()方法。客户端可能会连续多次调用此服务,但它们都是不同的调用。

知道会导致此异常的原因吗?我在过去成功地使用了Seam和JMS没有问题,但是这个应用程序对JMS队列的写入比我过去编写的要多得多。我的components.xml文件是正确的seutp,我没有在那里得到任何错误。另外,我可以单独调用foo()并将消息写入队列。只有在我对foo()方法进行大量顺序调用时才会发生这种情况。

思考?我可以尝试的任何建议或解决方法吗?

更新:我应该提到我正在使用的消息队列是嵌入在JBoss AS 7.1中的HornetQ。对于我来说,似乎是围绕多个线程尝试将消息写入队列的某种问题。除此之外我没有任何信息,或者任何想法如何解决这个问题。我真的很感激你能给予的任何帮助。

1 个答案:

答案 0 :(得分:2)

这是JCA规范的一部分。当你是一个池连接工厂时,你不能创建多个会话,因为内部的JCA连接是一个连接/会话的集合。

JCA Connections将为您提供一个池并与XA无缝集成。如果您不需要XA,则可以使用standalone.xml中定义的常规连接工厂。

如果您确实需要池和XA,请为每个会话创建一个连接,您应该解决此问题。