我正在为WebLogic 11g(WebLogic Server 10.3.6.0)开发JMS客户端。客户端基于wlthint3client.jar
库。客户端使用异步API(侦听器)从JMS队列中读取消息。客户端是多线程的,并使用多个并行JMS使用者。
Weblogic JMS服务器配置为具有10分钟的JMS事务超时,但是我在提交超过6分钟的事务时遇到问题。只有在同时进行许多长事务时才会发生这种情况。
此类案例提交失败,但有以下异常:
weblogic.jms.common.JMSException: weblogic.messaging.dispatcher.DispatcherException: java.rmi.RemoteException: Could not establish a connection with -6273788781435586093S:host:[7001,7001,-1,-1,-1,-1,-1]:domain:server, java.io.IOException: Bootstrap request to JVMID -6273788781435586093S:host:[7001,7001,-1,-1,-1,-1,-1]:domain:server got an error or timed out; nested exception is:
java.io.IOException: Bootstrap request to JVMID -6273788781435586093S:host:[7001,7001,-1,-1,-1,-1,-1]:domain:server got an error or timed out; nested exception is:
java.rmi.ConnectException: Could not establish a connection with -6273788781435586093S:host:[7001,7001,-1,-1,-1,-1,-1]:domain:server, java.io.IOException: Bootstrap request to JVMID -6273788781435586093S:host:[7001,7001,-1,-1,-1,-1,-1]:domain:server got an error or timed out; nested exception is:
java.io.IOException: Bootstrap request to JVMID -6273788781435586093S:host:[7001,7001,-1,-1,-1,-1,-1]:domain:server got an error or timed out
at weblogic.jms.dispatcher.DispatcherAdapter.convertToJMSExceptionAndThrow(DispatcherAdapter.java:116)
at weblogic.jms.dispatcher.DispatcherAdapter.dispatchSyncNoTran(DispatcherAdapter.java:61)
at weblogic.jms.client.JMSSession.commit(JMSSession.java:1224)
at weblogic.jms.client.JMSSession.commit(JMSSession.java:1198)
at weblogic.jms.client.WLSessionImpl.commit(WLSessionImpl.java:108)
其他一些观察:
因此问题的解决方案是在运行客户端应用程序-Dweblogic.ThreadPoolSize=N+1
的JVM上设置属性,其中N是客户端使用的异步侦听器的数量。
如果将其设置为N,并且N消息被接收并且卡住超过4分钟,那么您的提交将因上述异常而失败。
为什么?我想当你让所有的监听器线程忙于处理传入的消息时,没有人在那里与服务器通信并使连接保持活动状态。 Oracle documentation on T3 connection heartbeats证实了这一点:
任何两个具有有效T3连接的Java程序(例如两个服务器实例,或服务器实例和Java客户端)都使用定期的点对点“心跳”来宣布并确定持续可用性[...]
和
服务器实例发出心跳的频率由心跳间隔确定,该间隔默认为60秒。
在确定对等方不可用之前服务器实例等待的对等方丢失的心跳数由心跳周期确定,默认情况下为4.因此,每个服务器实例最多等待240秒或4分钟,否则在确定对等方无法访问之前,来自对等方的消息(心跳或其他通信)。
在另一个地方:
WebLogic客户端线程池的配置与WebLogic服务器线程池的配置不同,并且不是自我调整。 WebLogic客户端具有特定的线程池,用于处理来自服务器的传入请求,例如JMS MessageListener调用。可以通过命令行属性配置此池:
-Dweblogic.ThreadPoolSize =正