Как получить связанный адрес и порт сервера программно в Java EE?

При запуске нам нужно получить адрес сервера и порт 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, но если я запустил сервер и приложение загрузилось во время запуска сервера, MBeans там нет.

Я не знаю, почему, но у меня такое чувство, что jBoss гарантирует, что приложение запускается/загружается перед большинством MBeans. Я немного поглядел и узнал, что после того, как Mbeans загрузились после нашего приложения:

  • jboss.as:interface =..
  • jboss.as:socket-binding-group =..
  • jboss.as:subsystem =..
  • jboss.as:core-service=management.. (некоторые)

Итак,

  • Как заставить jBoss загружать MBeans перед моим приложением?
  • Есть ли другой способ /mbean, где я могу получить информацию?

Ответ 1

У меня такая же проблема в 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");