WSO2 ESB 在 ActiveMQ 中创建了太多的临时咨询主题

WSO2 ESB Creates Too Many Temporary Advisory Topics in ActiveMQ

使用 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.fill(TcpTransport.java:634)
        at org.apache.activemq.transport.tcp.TcpBufferedInputStream.read(TcpBufferedInputStream.java:59)
        at org.apache.activemq.transport.tcp.TcpTransport.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 在服务越来越多的消息时最终 运行 线程不足。消息是异步传递的,因此它们不应等待确认。

我尝试过的事情:

  1. 将 advisorySupport="false" 添加到代理配置,并将 jms.watchTopicAdvisories=false 添加到客户端连接 URL。这实际上完全阻止了 ESB 连接到代理。
  2. 在代理配置中设置身份验证和授权插件以不允许客户端创建 "ActiveMQ.Advisory.>" 队列或主题。这完全阻止了 ESB 创建任何队列。

如何防止 ESB/broker 创建这些主题,同时仍然允许在实际队列中生成和使用消息,或者至少让 ESB/broker 以某种方式关闭连接?

经过大约一周的诊断,解决方案是将 axis2-transport-jms JAR 升级到 WSO2 Transports GitHub.

上的任何最新版本

要放到$CARBON_HOME/repository/components/lib目录下,$CARBON_HOME/repository/components/plugins里面的旧的要删除