JMS/Seam——创建会话时出现异常?
Posted
技术标签:
【中文标题】JMS/Seam——创建会话时出现异常?【英文标题】:JMS/Seam -- Exceptions when creating session? 【发布时间】:2013-01-13 03:57:59 【问题描述】:我有一个 JBoss Seam 2.3 应用程序正在尝试将事件写入 JBoss AS 7.1 上的 JMS 队列。写入发生在无状态 EJB 中,并使用标准 Seam 注入机制。代码看起来像这样(不是确切的代码 sn-p。只是显示我正在做的事情的类型):
@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() 进行一次调用并将消息写入队列没有问题。只有当我对 foo() 方法进行大量顺序调用时才会发生这种情况。
想法?对于我可以尝试的事情或解决此问题的方法有什么建议吗?
更新:我应该提到我使用的消息队列是嵌入在 JBoss AS 7.1 中的 HornetQ。 似乎在我看来是围绕多个线程尝试将消息写入队列的某种问题。除此之外,我没有任何信息,也不知道如何解决这个问题。我非常感谢您能提供的任何帮助。
【问题讨论】:
【参考方案1】:这是 JCA 规范的一部分。当您使用池连接工厂时,您不能创建多个会话,因为内部的 JCA 连接是连接/会话的元组。
JCA Connections 将为您提供一个池以及与 XA 的无缝集成。如果你不需要 XA,你可以使用在你的 Standalone.xml 中定义的常规连接工厂。
如果您确实需要池和 XA,请为每个会话创建一个连接,您应该可以解决这个问题。
【讨论】:
那么我需要做些什么改变来完成这个?这是我需要更改的 JBoss 配置中的内容吗?在我的 Seam components.xml 文件中呢? 首先:你需要确保你没有泄露连接。关闭您的连接和会话...我没有太多材料可看...我需要从您的应用程序中查看更多信息。我无法回答接缝配置,但如果你提供一个可运行的示例,我可以看看。 这可能是 Seam 上的一个错误...如果您为您的示例提供更多代码,那么我可以弄清楚...如果您愿意,您可以将一个正在运行的示例添加到 hornetq 的论坛,我可以回到这里给你确定的答案。 另外——只是为了让我能更多地了解这一点——我什么时候需要 XA 和非 XA?是否有需要一个在另一个上的用例? 这更多是关于池化与非池化的。使用池连接工厂时,您将获得与 XA 的集成。这意味着如果您收到一条消息并在数据库中插入一条记录,事务管理器将保证两个分支都已提交或回滚,这样您就不会从无到有创建数据。以上是关于JMS/Seam——创建会话时出现异常?的主要内容,如果未能解决你的问题,请参考以下文章
实现会话跟踪时出现 NullPointerException
创建会话 IOS 时出现 Quickblox“错误时间戳”错误
使用 Vue Axios (CORS) 发送/存储会话 cookie 时出现问题
运行 Oracle 调度程序时出现错误:ORA-20001:必须从应用程序会话中调用此过程