首页 > 解决方案 > WSO2 ESB 在 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出队。 这是连接信息下的样子。

然后,附加此临时主题的连接在 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 在为越来越多的消息提供服务时最终耗尽线程。消息是异步传递的,所以它们不应该等待确认。

我尝试过的事情:

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

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

标签: multithreadingwso2activemqwso2esb

解决方案


经过大约一周的诊断后,解决方案是将 axis2-transport-jms JAR 升级到WSO2 Transports GitHub上的最新版本。

必须将其放入目录中,并且必须删除$CARBON_HOME/repository/components/lib其中的旧目录。$CARBON_HOME/repository/components/plugins


推荐阅读