如何通过Java程序获取JBOSS EJB线程列表
连接JBOSS EAP 7.1.4并获取指定EJB线程的方法
一、配置JBOSS EAP的远程JMX访问
要通过Java程序远程连接JBOSS EAP并获取线程信息,需先开启JBOSS的远程JMX服务:
- 修改JBOSS配置文件(
standalone.xml或domain.xml):- 在
<socket-binding-group>节点下添加远程JMX的socket绑定:<socket-binding name="remoting-jmx" port="9990"/> - 在
<subsystem xmlns="urn:jboss:domain:jmx:1.3">节点下开启远程连接器:<expose-resolved-model/> <expose-expression-model/> <remoting-connector use-management-endpoint="true"/>
- 在
- 创建具有
monitor角色的JMX访问用户:- 执行JBOSS_HOME/bin目录下的
add-user.sh(Linux)或add-user.bat(Windows) - 选择"Management User"类型,设置用户名和密码,并分配
monitor角色
- 执行JBOSS_HOME/bin目录下的
二、Java代码实现连接与线程过滤
依赖准备
将JBOSS_HOME/bin/client目录下的jboss-client.jar加入项目类路径,该Jar包含JBOSS远程JMX连接所需的客户端库。
示例代码
import javax.management.MBeanServerConnection; import javax.management.ObjectName; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; import java.util.HashMap; import java.util.Map; public class JBossEJBThreadFetcher { public static void main(String[] args) throws Exception { // JMX连接参数 String jmxServiceUrl = "service:jmx:remote+http://localhost:9990"; String jmxUser = "你的monitor角色用户名"; String jmxPassword = "对应密码"; // 设置连接环境 Map<String, Object> env = new HashMap<>(); env.put(JMXConnector.CREDENTIALS, new String[]{jmxUser, jmxPassword}); // 建立连接并获取线程信息 try (JMXConnector connector = JMXConnectorFactory.connect(new JMXServiceURL(jmxServiceUrl), env)) { MBeanServerConnection mBeanConn = connector.getMBeanServerConnection(); ObjectName threadMBean = new ObjectName("java.lang:type=Threading"); // 获取所有线程ID long[] allThreadIds = (long[]) mBeanConn.getAttribute(threadMBean, "AllThreadIds"); // 过滤并输出名称以tSA开头的线程 for (long threadId : allThreadIds) { // 调用MBean方法获取线程名称 String threadName = (String) mBeanConn.invoke(threadMBean, "getThreadInfo", new Object[]{threadId}, new String[]{"long"}); if (threadName != null && threadName.startsWith("tSA")) { System.out.printf("线程ID: %d,线程名称: %s%n", threadId, threadName); } } } } }
三、注意事项
- 确保JBOSS EAP已启动,且配置的
remoting-jmx端口(默认9990)未被占用 - 运行代码时需保证
jboss-client.jar在类路径中,例如Linux下运行命令:java -cp .:/path/to/jboss-client.jar JBossEJBThreadFetcher - 若使用域模式,需调整连接地址为域控制器的地址,并对应修改域配置文件中的JMX相关设置
内容的提问来源于stack exchange,提问作者Manohar Amkem
相关产品推荐
相关产品推荐

