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

时间:2019-05-09 21:32:29

标签: multithreading wso2 activemq wso2esb

使用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在服务越来越多的消息时最终耗尽线程。消息是异步传递的,因此它们不应该等待确认。

我尝试过的事情:

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

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

1 个答案:

答案 0 :(得分:0)

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

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