首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JMS提交失败

JMS提交失败
EN

Stack Overflow用户
提问于 2018-07-16 22:57:44
回答 1查看 2.6K关注 0票数 1

我们有一个将JMS与Tibco消息服务器结合使用的应用程序。它是用Spring实现的。我们的会话是经过处理的会话,确认模式设置为auto。我们可以接收发送到队列的消息,但由于某种原因,commit()方法失败了。

这是一个错误:

代码语言:javascript
复制
2018-07-13 15:50:35.858  WARN 2576 --- [enerContainer-8] o.s.j.l.DefaultMessageListenerContainer  : Execution of JMS message listener failed, and no ErrorHandler has been set.

javax.jms.TransactionRolledBackException: Commit failed

2018-07-13 15:50:35.914  WARN 2576 --- [enerContainer-8] o.s.j.l.DefaultMessageListenerContainer  : Setup of JMS message listener invoker failed for destination 'queue' - trying to recover. Cause: Commit failed; nested exception is javax.jms.JMSException: operation='ack' cause='Illegal state' queue='queue'

我应该提两件事:

  • 只有在调试模式下运行时,我才会看到提交()失败和堆栈跟踪。如果我让war只是运行,我就不会在日志中看到任何提交失败的痕迹。我可以告诉您,我们收到了消息,但无法判断commit()是否失败。
  • 如果我们使用Spring的默认JMS实现(即ActiveMQ ),那么无论是否处于调试模式,提交()都不会失败,它只发生在Tibco中。

有人知道为什么commit()失败吗?当提交失败时,事务将回滚,消息将不会从队列中清除。

为什么我只在调试模式中看到此错误?或者:它确实发生在我主持这场战争但没有登录的时候吗?

下面请找到完整的堆栈跟踪:

代码语言:javascript
复制
15:50:35.858 [DefaultMessageListenerContainer-8] WARN  o.s.j.l.DefaultMessageListenerContainer - Execution of JMS message listener failed, and no ErrorHandler has been set.
javax.jms.TransactionRolledBackException: Commit failed
    at com.tibco.tibjms.Tibjmsx.buildException(Tibjmsx.java:596)
    at com.tibco.tibjms.TibjmsxSessionImp._confirmTransacted(TibjmsxSessionImp.java:3251)
    at com.tibco.tibjms.TibjmsxSessionImp._confirm(TibjmsxSessionImp.java:3643)
    at com.tibco.tibjms.TibjmsxSessionImp._commit(TibjmsxSessionImp.java:2898)
    at com.tibco.tibjms.TibjmsxSessionImp.commit(TibjmsxSessionImp.java:4860)
    at org.springframework.jms.support.JmsUtils.commitIfNecessary(JmsUtils.java:218)
    at org.springframework.jms.listener.AbstractMessageListenerContainer.commitIfNecessary(AbstractMessageListenerContainer.java:776)
    at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:680)
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:318)
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:257)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1189)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1179)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1076)
    at java.lang.Thread.run(Unknown Source)
2018-07-13 15:50:35.914  WARN 2576 --- [enerContainer-8] o.s.j.l.DefaultMessageListenerContainer  : Setup of JMS message listener invoker failed for destination 'queue' - trying to recover. Cause: Commit failed; nested exception is javax.jms.JMSException: operation='ack' cause='Illegal state' queue='queue'
2018-07-13 15:50:36.543  INFO 2576 --- [enerContainer-8] o.s.j.l.DefaultMessageListenerContainer  : Successfully refreshed JMS Connection
15:50:36.543 [DefaultMessageListenerContainer-8] INFO  o.s.j.l.DefaultMessageListenerContainer - Successfully refreshed JMS Connection
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-18 07:31:20

当事务中的某些消息在此期间过期时,会发生此EMS异常。我自己也试过这个。

当您在调试模式之外运行时,事情似乎已经足够快了。但是,当您处于调试模式时,提交()之前的时间要长得多。因此,如果您的生产者的生存期在此期间到期,提交将假定有问题(EMS知道该事务中应该有5条消息,但其中一条消息已经过期)并抛出此异常。

要验证生产者的生存时间,请查看MessageProducer.send()调用或msgProducer.setTimeToLive()的最后一个选项,并注意,这是以Mill秒而不是秒为单位的时间。检查这是否是问题的另一种方法是在调试模式下运行,并保持线程的“非常快”。可能会改变你的行为。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51371110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档