2011-05-27 116 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) {} 
}