You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Java程序获取JBOSS EJB线程列表

连接JBOSS EAP 7.1.4并获取指定EJB线程的方法

一、配置JBOSS EAP的远程JMX访问

要通过Java程序远程连接JBOSS EAP并获取线程信息,需先开启JBOSS的远程JMX服务:

  1. 修改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"/>
      
  2. 创建具有monitor角色的JMX访问用户:
    • 执行JBOSS_HOME/bin目录下的add-user.sh(Linux)或add-user.bat(Windows)
    • 选择"Management User"类型,设置用户名和密码,并分配monitor角色

二、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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 15:46:09