Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot JMS提交失败_Spring Boot_Jms_Spring Jms_Tibco_Tibco Ems - Fatal编程技术网

Spring boot JMS提交失败

Spring boot JMS提交失败,spring-boot,jms,spring-jms,tibco,tibco-ems,Spring Boot,Jms,Spring Jms,Tibco,Tibco Ems,我们有一个使用JMS和Tibco消息服务器的应用程序。它是用Spring Boot实现的。 我们的会话是事务性会话,确认模式设置为自动。 我们可以接收发送到队列的消息,但由于某种原因,commit()方法失败 这就是错误: 2018-07-13 15:50:35.858 WARN 2576 --- [enerContainer-8] o.s.j.l.DefaultMessageListenerContainer : Execution of JMS message listener fail

我们有一个使用JMS和Tibco消息服务器的应用程序。它是用Spring Boot实现的。 我们的会话是事务性会话,确认模式设置为自动。 我们可以接收发送到队列的消息,但由于某种原因,commit()方法失败

这就是错误:

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'
我应该提到两件事:

  • 只有在调试模式下运行时,我才能看到commit()失败和堆栈跟踪。如果让war运行,我在日志中看不到任何提交失败的痕迹。我可以说我们收到了这些消息,但无法判断commit()是否失败

  • 如果我们使用Spring Boot的默认JMS实现,即ActiveMQ,那么无论是否处于调试模式,commit()都不会失败,它只在Tibco中发生

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

为什么我只在调试模式下看到此错误?或者:确实是这样,当我发动战争但不记录时,会发生这种情况吗

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

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

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

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


要验证制作人的生存时间,请参阅MessageProducer.send()调用或msgProducer.setTimeToLive()的最后一个选项,并注意,这是以毫秒为单位的时间,而不是秒。检查这是否是问题的另一种方法是在调试模式下运行,并在继续执行线程时“非常快”。这可能会改变您的行为。

如上所述:我们设置了这个属性:spring.jms.template.time to live=36000,它会通知jms服务器在36毫秒后使消息过期,因此,一旦消息从队列中被消耗,jms服务器就无法找到任何要确认的消息,从而导致错误。一旦我们摆脱了这个time-to-live属性,我们就可以发送/接收消息,JMS提交也成功了。