如何在Java EE中以编程方式获取绑定的服务器地址和端口?

12

在启动时,我们需要获取正在运行的应用程序的服务器地址和HTTP端口。直到现在我们都是这样做的:

MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
ObjectName socketBindingMBean = new ObjectName("jboss.as:socket-binding-group=standard-sockets,socket-binding=http");

String  host = (String)  mBeanServer.getAttribute(socketBindingMBean, "boundAddress"),
Integer port = (Integer) mBeanServer.getAttribute(socketBindingMBean, "boundPort"));

迁移自jBoss 7.1.1.Final到7.1.3.Final后,我们遇到了一个问题:服务器启动时MBean未定义。这意味着,如果我将应用程序部署在已运行的jboss服务器上,则一切正常,但是如果我启动服务器并加载应用程序during服务器启动期间,MBeans不在那里。

我不知道为什么,但我有一种感觉,jBoss确保我们的应用程序在大多数MBeans之前启动/加载。我稍微查看了一下并发现以下Mbeans在我们的应用程序之后加载:

  • jboss.as:interface=..
  • jboss.as:socket-binding-group=..
  • jboss.as:subsystem=..
  • jboss.as:core-service=management.. (some)

所以,

  • 如何强制jBoss在我的应用程序之前加载MBeans?
  • 是否有另一种方法/ Mbean可以获取我的信息?

你能解决这个问题吗? - RedEagle
1
回想起来,我们在一年多以前曾经遇到过这个问题 :) 我们通过在新线程中延迟几秒钟调用getAttribute方法来解决了这个问题。虽然不完美,但至今仍在生产环境中运行。 - Marcel
1个回答

8

我在JBOSS Wildfly 8.1中遇到了同样的问题。我使用以下代码解决了该问题,它为我获取了服务器地址和HTTP端口:

//http port
ManagementFactory.getPlatformMBeanServer().getAttribute(new ObjectName("jboss.as:socket-binding-group=standard-sockets,socket-binding=http"), "port");

//http adress
ManagementFactory.getPlatformMBeanServer().getAttribute(new ObjectName("jboss.as:interface=public"), "inet-address");

我已经配置了偏移量为1,但是它得到的是8080而不是8081。 - Jassiel Díaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接