Spring JMS で DefaultMessageListenerContainer を TIBCO キューで使用しているときに問題に直面しています。比較的小さなメッセージをキューに入れると、キューのリスナーがメッセージを読み取って処理を完了するまでに数秒かかり、すべてがスムーズに機能します。一方、ビジネス層での処理に時間がかかる可能性のあるリクエストをキューに入れると、処理が開始されてから数分後に次の例外が発生します。
04:38:14.392 [TIBCO EMS TCPLink Reader (Server-34171)] WARN o.s.j.c.CachingConnectionFactory - Encountered a JMSException - resetting the underlying JMS Connection
javax.jms.JMSException: Connection has been terminated
at com.tibco.tibjms.Tibjmsx.buildException(Tibjmsx.java:509) ~[tibjms.jar:6.3.0]
at com.tibco.tibjms.TibjmsConnection._invokeOnExceptionCallback(TibjmsConnection.java:2025) [tibjms.jar:6.3.0]
at com.tibco.tibjms.TibjmsConnection._onDisconnected(TibjmsConnection.java:2394) [tibjms.jar:6.3.0]
at com.tibco.tibjms.TibjmsConnection$ServerLinkEventHandler.onEventDisconnected(TibjmsConnection.java:349) [tibjms.jar:6.3.0]
at com.tibco.tibjms.TibjmsxLinkTcp$LinkReader.work(TibjmsxLinkTcp.java:330) [tibjms.jar:6.3.0]
at com.tibco.tibjms.TibjmsxLinkTcp$LinkReader.run(TibjmsxLinkTcp.java:259) [tibjms.jar:6.3.0]
リスナー側で処理が続行され、リスナーがメッセージの処理を終了すると、次の例外が発生します。
07:28:04.281 [jmsContainer-1] WARN o.s.j.l.DefaultMessageListenerContainer - Execution of JMS message listener failed, and no ErrorHandler has been set.
javax.jms.IllegalStateException: Session is closed
at com.tibco.tibjms.TibjmsxSessionImp.getTransacted(TibjmsxSessionImp.java:4837) ~[tibjms.jar:6.3.0]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_03]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_03]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_03]
at java.lang.reflect.Method.invoke(Method.java:601) ~[na:1.7.0_03]
at org.springframework.jms.connection.CachingConnectionFactory$CachedSessionInvocationHandler.invoke(CachingConnectionFactory.java:344) ~[org.springframework.jms-3.1.0.RELEASE.jar:3.1.0.RELEASE]
at $Proxy20.getTransacted(Unknown Source) ~[na:na]
at org.springframework.jms.listener.AbstractMessageListenerContainer.commitIfNecessary(AbstractMessageListenerContainer.java:572) ~[org.springframework.jms-3.1.0.RELEASE.jar:3.1.0.RELEASE]
at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:481) ~[org.springframework.jms-3.1.0.RELEASE.jar:3.1.0.RELEASE]
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:325) [org.springframework.jms-3.1.0.RELEASE.jar:3.1.0.RELEASE]
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:263) [org.springframework.jms-3.1.0.RELEASE.jar:3.1.0.RELEASE]
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1059) [org.springframework.jms-3.1.0.RELEASE.jar:3.1.0.RELEASE]
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1051) [org.springframework.jms-3.1.0.RELEASE.jar:3.1.0.RELEASE]
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:948) [org.springframework.jms-3.1.0.RELEASE.jar:3.1.0.RELEASE]
at java.lang.Thread.run(Thread.java:722) [na:1.7.0_03]
07:28:04.281 [jmsContainer-1] WARN o.s.j.l.DefaultMessageListenerContainer - Setup of JMS message listener invoker failed for destination 'Queue[cmb.cmbtech.na.bead_153036.rwacalrequest1]' - trying to recover. Cause: Session is closed
javax.jms.IllegalStateException: Session is closed
at com.tibco.tibjms.TibjmsxSessionImp.getTransacted(TibjmsxSessionImp.java:4837) ~[tibjms.jar:6.3.0]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_03]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_03]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_03]
at java.lang.reflect.Method.invoke(Method.java:601) ~[na:1.7.0_03]
at org.springframework.jms.connection.CachingConnectionFactory$CachedSessionInvocationHandler.invoke(CachingConnectionFactory.java:344) ~[org.springframework.jms-3.1.0.RELEASE.jar:3.1.0.RELEASE]
at $Proxy20.getTransacted(Unknown Source) ~[na:na]
at org.springframework.jms.listener.AbstractMessageListenerContainer.commitIfNecessary(AbstractMessageListenerContainer.java:572) ~[org.springframework.jms-3.1.0.RELEASE.jar:3.1.0.RELEASE]
at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:481) ~[org.springframework.jms-3.1.0.RELEASE.jar:3.1.0.RELEASE]
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:325) ~[org.springframework.jms-3.1.0.RELEASE.jar:3.1.0.RELEASE]
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:263) ~[org.springframework.jms-3.1.0.RELEASE.jar:3.1.0.RELEASE]
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1059) ~[org.springframework.jms-3.1.0.RELEASE.jar:3.1.0.RELEASE]
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1051) ~[org.springframework.jms-3.1.0.RELEASE.jar:3.1.0.RELEASE]
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:948) ~[org.springframework.jms-3.1.0.RELEASE.jar:3.1.0.RELEASE]
at java.lang.Thread.run(Thread.java:722) [na:1.7.0_03]
そして最後に、上記の例外の数秒後に、ログに次の情報が記録されます
07:28:04.418 [jmsContainer-1] INFO o.s.j.l.DefaultMessageListenerContainer - Successfully refreshed JMS Connection
問題の原因はよくわかりませんが、リスナーがメッセージを処理するのに数分以上かかるたびに、jms 接続がリセットされているようです。このすべての副作用は、リスナーが処理出力を別のキューに発行して、外部アプリケーションが消費するのに失敗することです。リスナーにトランザクション マネージャーを設定する必要がありますか? または、一定期間接続をリセットしないプロパティを設定する必要がありますか?