2011-05-27 113 views
8

如何在部署在该jboss服务器上的application/war中以编程方式查找jboss端口?使用Java获取有关jboss的信息

它是一个Web服务运行,我们没有任何用户界面

+1

在哪个上下文中?如果你在一个servlet请求上下文中,简单地调用request.getLocalPort()应该会给你你想要的。 – pap 2011-05-27 14:41:29

+0

@pap我没有servlet请求上下文 – 2011-05-27 15:57:29

+0

类似的问题,请看http://stackoverflow.com/questions/4466518/how-do-i-find-out-what-port-my-jboss-server-是听-上编程,全光照/ 4508602#4508602 – 2011-05-27 19:33:00

回答

7

我假设你想要的HTTP端口。

JBoss为每个Web侦听器发布一个Tomcat连接器MBean。的MBean的ObjectName的命名规则是:

  • 域:jboss.web
  • 属性:
    • 地址:装订地址
    • 端口:侦听端口
    • 类型:连接器

诀窍是,在不对绑定地址或端口(绑定地址可能是127.0.0.1或0.0.0.0或主机名)做任何假设的情况下,找到正确的MBean。要做到这一点,你可以用一个JMX查询指定:

  1. 已知域名:jboss.web
  2. 已知类型:连接器
  3. 通配符的地址:* ****
  4. 通配符的端口:*****
  5. 一个属性值表达式,指定你正在寻找的HTTP/1.1协议端口(而不是在 AJP端口):Query.match(Query.attr( “协议”),Query.value( “HTTP/1.1”))

一旦你有一个MBeanServerConnection到JBoss MBeanServer中,这一声明将返回正确的端口:

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()

下面是一个简单的JSP示例打印的HTTP端口号:

<%@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。 Nayan Wadekar提供的reference是如何做到这一点的一个很好的例子。

如果您的JBoss服务器部署了org.jboss.mx.remoting.service.JMXConnectorServerService或者您使用platform MBeanServer运行JBoss,那么您还可以使用本地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) {} 
}