WebSphere Liberty连接Apache TomEE Plume的JMS阻塞问题求助
createContext()挂起无响应 场景描述
需从WebSphere Liberty运行的代码连接到Apache TomEE Plume中的MDB,使用activemq-rar-5.16.3组件。代码执行到jmsFactory.createContext()时挂起,无任何异常抛出。TomEE日志显示ActiveMQ监听器已在tcp://127.0.0.1:61616创建,netstat验证端口处于监听状态。Wireshark未捕获到数据,修改Liberty连接工厂指向61615也无变化,推测createContext()尚未发起与broker的连接。代码运行在Liberty的异步CDI事件处理器中,Liberty日志无异常、无FFDC事件。因新版本RAR依赖Java 11,无法升级组件。
Java代码
public void notifyListeners(String caseId) { logger.debug("+notifyListeners"); int timeToLive = 15 * 1000; // 15 seconds try { logger.debug("Creating context"); InitialContext ic = new InitialContext(); logger.debug("Got Initial context"); ConnectionFactory jmsFactory = (ConnectionFactory)ic.lookup("jndi/JMS_BASE_QCF"); logger.debug("Got Factory"); JMSContext context = jmsFactory.createContext(); logger.debug("Creating text message"); TextMessage msg = context.createTextMessage(caseId); logger.debug("Sending text message"); context.createProducer().setTimeToLive(timeToLive).send(jmsSendQueue, msg); logger.debug("Text message sent"); } catch (Throwable e) { logger.error("Caught Exception sending ActiveMQ Message : " + e, e); } logger.debug("-notifyListeners"); }
环境信息
- Liberty: WebSphere Application Server 21.0.0.1 (wlp-1.0.48.cl210120210113-1459)
- Apache TomEE: Apache Tomcat (TomEE)/9.0.52 (8.0.8)
Liberty server.xml相关配置
<!-- Liberty to TomEE JMS over ActiveMQ Config --> <featureManager> <feature>ejbLite-3.2</feature> <feature>jaxws-2.2</feature> <feature>jndi-1.0</feature> <feature>jpa-2.2</feature> <feature>jpaContainer-2.2</feature> <feature>jsp-2.3</feature> <feature>localConnector-1.0</feature> <feature>mdb-3.2</feature> <feature>microProfile-3.3</feature> <feature>monitor-1.0</feature> <feature>wasJmsClient-2.0</feature> <feature>wasJmsSecurity-1.0</feature> <feature>wasJmsServer-1.0</feature> <feature>wmqJmsClient-2.0</feature> <feature>jms-2.0</feature> </featureManager> <resourceAdapter id="activemq" location="C:\apps\liberty\ActiveMQRAR\activemq-rar-5.16.3.rar"> <properties.activemq ServerUrl="tcp://127.0.0.1:61616"/> </resourceAdapter> <jmsQueueConnectionFactory jndiName="jndi/JMS_BASE_QCF"> <properties.activemq serverUrl="tcp://127.0.0.1:61616"/> </jmsQueueConnectionFactory> <jmsQueue jndiName="jndi/worklistQueue"> <properties.activemq PhysicalName="jms/worklistQueue"/> </jmsQueue>
调试思路
1. 排查JMS特性冲突
server.xml中同时启用了wasJmsClient-2.0、wasJmsServer-1.0与jms-2.0特性,WebSphere自有JMS实现会干扰第三方ActiveMQ RAR的加载。建议:
- 移除
wasJmsClient-2.0、wasJmsSecurity-1.0、wasJmsServer-1.0、wmqJmsClient-2.0特性,仅保留jms-2.0及业务必要特性 - 重启Liberty后重新测试
2. 开启ActiveMQ RAR调试日志
添加日志配置捕获连接细节:
<logging traceSpecification="com.ibm.ws.jms*=all, org.apache.activemq*=all"/>
重启Liberty后触发代码执行,查看logs/trace.log,定位挂起环节(如连接池初始化、broker握手等)。
3. 修正RAR配置参数
resourceAdapter中使用了大写开头的ServerUrl,而ActiveMQ 5.16.3 RAR的标准参数名为小写serverUrl,可能导致配置未生效。统一修正为:
<resourceAdapter id="activemq" location="C:\apps\liberty\ActiveMQRAR\activemq-rar-5.16.3.rar"> <properties.activemq serverUrl="tcp://127.0.0.1:61616"/> </resourceAdapter>
同时通过Liberty管理控制台(http://localhost:9080/admin)验证连接工厂是否正确关联ActiveMQ RAR。
4. 测试同步环境下的连接
异步CDI线程可能存在上下文权限问题,编写同步Servlet/JSP调用相同JMS代码:
- 若同步环境正常,说明问题出在异步CDI线程的上下文配置
- 检查Liberty的CDI异步线程权限,确保其拥有JNDI lookup、JMS资源访问权限
5. 验证broker安全配置
若TomEE的ActiveMQ broker启用了认证,需在Liberty连接工厂添加认证信息:
<jmsQueueConnectionFactory jndiName="jndi/JMS_BASE_QCF"> <properties.activemq serverUrl="tcp://127.0.0.1:61616" userName="admin" password="admin"/> </jmsQueueConnectionFactory>
同时确认TomEE的conf/server.xml中broker未启用SSL等额外限制。
6. 分析线程转储
使用Liberty自带命令生成线程转储:
server dump <serverName> --include=threads
分析logs/dump/threaddump文件,找到执行notifyListeners的线程,查看调用栈定位阻塞的具体代码位置(如连接池获取、socket建立等)。
内容的提问来源于stack exchange,提问作者Greycon

