我有一个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。对于我来说,似乎是围绕多个线程尝试将消息写入队列的某种问题。除此之外我没有任何信息,或者任何想法如何解决这个问题。我真的很感激你能给予的任何帮助。
答案 0 :(得分:2)
这是JCA规范的一部分。当你是一个池连接工厂时,你不能创建多个会话,因为内部的JCA连接是一个连接/会话的集合。
JCA Connections将为您提供一个池并与XA无缝集成。如果您不需要XA,则可以使用standalone.xml中定义的常规连接工厂。
如果您确实需要池和XA,请为每个会话创建一个连接,您应该解决此问题。