【发布时间】:2019-09-27 18:56:31
【问题描述】:
使用 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 最终耗尽线程,因为它服务的消息越来越多。消息是异步传递的,因此它们不应等待确认。
我尝试过的事情:
- 在代理配置中添加advisorySupport="false",在客户端连接URL 中添加jms.watchTopicAdvisories=false。这实际上完全阻止了 ESB 连接到代理。
- 将代理配置中的身份验证和授权插件设置为不允许客户端创建“ActiveMQ.Advisory.>”队列或主题。这只是阻止了 ESB 创建任何队列。
如何防止 ESB/代理创建这些主题,同时仍然允许在实际队列上生成和使用消息,或者至少让 ESB/代理以某种方式关闭连接?
【问题讨论】:
标签: multithreading wso2 activemq wso2esb