如何在部署在该 jboss 服务器上的 application/war 中以编程方式找到 jboss 端口?使用 Java
它是一个运行的网络服务,我们没有任何用户界面
最佳答案
我假设您需要 HTTP 端口。
JBoss 为每个 Web 监听器发布一个 Tomcat 连接器 MBean。 mbean 的 ObjectNames 的命名约定是:
- 域:jboss.web
- 属性:
- address:绑定(bind)地址
- 端口:监听端口
- 类型:连接器
诀窍在于,无需对绑定(bind)地址或端口(绑定(bind)地址可以是 127.0.0.1、0.0.0.0 或主机名)做任何假设,就能找到正确的 MBean。为此,您可以使用指定以下内容的 JMX 查询:
- 已知域名:jboss.web
- 已知类型:连接器
- 地址的通配符:*****
- 端口的通配符:*****
- 一个属性值表达式,指定您正在寻找 HTTP/1.1 协议(protocol)端口(相对于 AJP 端口):Query.match(Query .attr("协议(protocol)"), Query.value("HTTP/1.1"))
一旦您拥有到 JBoss MBeanServer 的 MBeanServerConnection,此语句将返回正确的端口:
String port = server.queryNames(
new ObjectName("jboss.web:type=Connector,address=*,port=*"),
Query.match(Query.attr("protocol"), Query.value("HTTP/1.1")))
.iterator().next().getKeyProperty("port");
如果您试图通过 JBoss JVM 内部运行的代码确定端口,获取 MBeanServerConnection 是微不足道的,因为您可以对 org.jboss.mx.util.MBeanServerLocator.locateJBoss() 进行静态调用。 .
这是一个打印 HTTP 端口号的简单 JSP 示例:
<%@page contentType="text/html" import="java.util.*,org.jboss.mx.util.*,javax.management.*" %>
<html><head><title>JBoss Web Server Port</title></head><body>
<%
try {
MBeanServerConnection server = MBeanServerLocator.locateJBoss();
String port = server.queryNames(
new ObjectName("jboss.web:type=Connector,address=*,port=*"),
Query.match(Query.attr("protocol"), Query.value("HTTP/1.1")))
.iterator().next().getKeyProperty("port");
out.println("<p>Port:" + port + "</p>");
} catch (Exception e) {
e.printStackTrace(System.err);
}
%></body></html>
如果需要远程获取,需要使用JBoss客户端RMIAdaptor . reference Nayan Wadekar 提供的是如何执行此操作的一个很好的示例。
如果您的 JBoss 服务器有一个 org.jboss.mx.remoting.service.JMXConnectorServerService已部署或您正在使用 platform MBeanServer 运行 JBoss ,您还可以使用 native JMX 远程处理。这是一个 Groovy 示例:
import javax.management.*;
import javax.management.remote.*;
conn = null;
try {
url = new JMXServiceURL("service:jmx:rmi://njw810/jndi/rmi://njw810:1090/jmxconnector");
conn = JMXConnectorFactory.connect(url);
server = conn.getMBeanServerConnection();
objectName = new ObjectName("jboss.web:type=Connector,address=*,port=*"); // HTTP/1.1
println server.queryNames(objectName, Query.match(Query.attr("protocol"), Query.value("HTTP/1.1"))).iterator().next().getKeyProperty("port");
} finally {
try { conn.close(); println "Connection Closed"; } catch (Exception e) {}
}
关于java - 获取jboss的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6153661/