multithreading - 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 在为越来越多的消息提供服务时最终耗尽线程。消息是异步传递的,所以它们不应该等待确认。
我尝试过的事情:
- 在代理配置和 jms.watchTopicAdvisories=false 中添加advisorySupport="false" 到客户端连接URL。这实际上完全阻止了 ESB 连接到代理。
- 将代理配置中的身份验证和授权插件设置为不允许客户端创建“ActiveMQ.Advisory.>”队列或主题。这只是阻止了 ESB 创建任何队列。
如何防止 ESB/代理创建这些主题,同时仍然允许在实际队列上生成和使用消息,或者至少让 ESB/代理以某种方式关闭连接?
解决方案
经过大约一周的诊断后,解决方案是将 axis2-transport-jms JAR 升级到WSO2 Transports GitHub上的最新版本。
必须将其放入目录中,并且必须删除$CARBON_HOME/repository/components/lib
其中的旧目录。$CARBON_HOME/repository/components/plugins
推荐阅读
- powershell - 如何从 Powershell 复制树命令?
- php - 有没有办法在 foreach 循环中将数值显示为“Min - Max”?
- firebase - 为什么我不能在 Flutter 中更新 Firestore 字符串值?
- python - 如何从文件中的命名元组列表中解压缩命名元组
- javascript - 根据移动设备或桌面附加类名
- c++ - 将字符串转换为可移植文件名
或 Boost.Filesystem - c++ - 代理未定义类型
- qt - 如何在主 QLabel 中包含一个小部件子集(例如 QListView 和 QLabels)
- node.js - 使用 Handlebars ( express + mongoose) 渲染填充的对象属性
- java - 如何生成我的代码以输出特定次数