使用WSO2 ESB 4.9.0和ActiveMQ 5.15.9。
当我将ESB从4.8.0升级到4.9.0时,一切都开始了。 ESB既充当生产者又充当消费者,并使用无阻塞的tcp或SSL连接。
每次ESB建立连接以产生或使用消息时,都会创建一个临时主题“ ActiveMQ.Advisory.TempQueue,ActiveMQ.Advisory.TempTopic”,它只是坐在那里而没有消息通过,即0入队,0出队。 Here is what it looks like under the connection information.
然后,此临时主题所附加的连接在JVM中仍为RUNNABLE线程,并且永不退出。 ESB和代理均未尝试关闭此连接。线程本身似乎正在读取的套接字上旋转:
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at com.rsa.sslj.x.ap.c(Unknown Source)
at com.rsa.sslj.x.ap.a(Unknown Source)
at com.rsa.sslj.x.ap.b(Unknown Source)
at com.rsa.sslj.x.ap.b(Unknown Source)
at com.rsa.sslj.x.al.read(Unknown Source)
at org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill(TcpBufferedInputStream.java:50)
at org.apache.activemq.transport.tcp.TcpTransport$2.fill(TcpTransport.java:634)
at org.apache.activemq.transport.tcp.TcpBufferedInputStream.read(TcpBufferedInputStream.java:59)
at org.apache.activemq.transport.tcp.TcpTransport$2.read(TcpTransport.java:619)
at java.io.DataInputStream.readInt(DataInputStream.java:387)
at org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:268)
at org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:240)
at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:232)
at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:215)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
这会导致ESB在服务越来越多的消息时最终耗尽线程。消息是异步传递的,因此它们不应该等待确认。
我尝试过的事情:
如何阻止ESB /代理创建这些主题,同时仍然允许在实际队列中生成和使用消息,或者至少让ESB /代理以某种方式关闭连接?
答案 0 :(得分:0)
经过大约一周的诊断,解决方案是将axis2-transport-jms JAR升级到WSO2 Transports GitHub上的最新版本。
必须将其放入$CARBON_HOME/repository/components/lib
目录中,并且必须删除$CARBON_HOME/repository/components/plugins
中的旧目录。