Получить URL-адрес поставщика текущего сервера во время выполнения в weblogic (не устаревший способ)

У меня есть Singleton Service, развернутая на кластер Weblogic, я хотел бы знать URL-адрес провайдера (адрес прослушивания и порт) сервера, на котором развернута одноэлементная служба, из самого синглтона (на стороне сервера, а не в журналах).

Я нашел эту (старую) статью от Oracle и написал этот метод для создания URL-адреса поставщика.

private static String getCurrentServerUrl() throws NamingException {
    weblogic.management.MBeanHome home =
        (weblogic.management.MBeanHome) new Environment().getInitialContext().lookup(weblogic.management.MBeanHome.LOCAL_JNDI_NAME);

    Set mbeanSet = home.getMBeansByType("ServerRuntime");
    Iterator mbeanIterator = mbeanSet.iterator();

    while (mbeanIterator.hasNext()) {
        ServerRuntimeMBean serverRuntime = (ServerRuntimeMBean) mbeanIterator.next();
        if (serverRuntime.getState().equals(ServerStates.RUNNING)) {
            return serverRuntime.getURL("t3");
        }
    }

    return null;
}

Проблема в том, что этот код устарел (см. MBeanHome, MBeanHome #getMBeansByType(String) и MBeanHome #LOCAL_JNDI_NAME).

Каков неустаревший способ сделать это?

PS: я не хочу вводить какой-либо адрес (будь то адрес сервера или адрес службы JMX, поскольку приложение предназначено для переноса с сервера на сервер без перекомпиляции или перенастройки самого приложения).

Спасибо за вашу помощь.


person clapsus    schedule 26.08.2015    source источник
comment
Что именно вам нужно знать? Имя хоста? Порт? Корень контекста? Определить, на каком хосте вы находитесь, так же просто, как InetAddress.getLocalHost().getHostName()   -  person Display Name is missing    schedule 27.08.2015
comment
Мне нужно знать адрес прослушивания и порт прослушивания текущего сервера переносимым способом (и я не хочу, чтобы этот адрес прослушивания был локальным адресом хоста). На самом деле я хочу получить объект RMI, хранящийся на JNDI определенного сервера (в кластере), для этого я сохраняю URL-адрес сервера в общей базе данных, чтобы я мог получить контекст сервера с других серверов кластер. Если у вас есть лучший вариант сделать это, я готов попробовать.   -  person clapsus    schedule 27.08.2015
comment
Возможно, вы уже видели это (или другие примеры): middlewaremagic.com/weblogic/?p=210 Я думаю, вы захотите подключиться к серверу администратора и получить DomainRuntimeServiceMBean. Все более новые примеры веб-логики указывают на что-то вроде этого: docs.oracle.com/cd/E23943_01/web.1111/e13728/ Он должен быть переносимым, если вы ссылаетесь на переменные среды и т. д. для URL-адреса администратора.   -  person Display Name is missing    schedule 27.08.2015
comment
Здесь у нас должен быть URL-адрес администратора, порт, имя хоста и пароль, которых у меня нет.   -  person clapsus    schedule 28.08.2015
comment
URL-адрес администратора должен автоматически устанавливаться в переменной среды ADMIN_URL при запуске управляемого сервера с помощью сценария startManagedWebLogic. Как вы собираетесь запускать сервер, не зная этой информации?   -  person Display Name is missing    schedule 28.08.2015
comment
Я не запускаю сервер, у меня просто есть доступ к одному развернутому в нем приложению   -  person clapsus    schedule 28.08.2015


Ответы (1)


Вы можете найти исполняемый JMX, который одинаков для всех приложений. Нет необходимости вводить адрес, пользователя или пароль.

1) Найдите MBeanServer

InitialContext ctx = new InitialContext();
MBeanServer mBeanServer = (MBeanServer) ctx.lookup("java:comp/env/jmx/runtime");

2) Затем вам нужно получить имя сервера, на котором запущено приложение. Тут есть два пути (а может и больше).

Простейший

String serverName = System.getProperty("weblogic.Name");

Но я не знаю, надежный ли это способ.

Другой способ получить имя сервера — найти его в атрибутах службы времени выполнения.

ObjectName serviceObjectName = new ObjectName("com.bea:Name=RuntimeService,Type=weblogic.management.mbeanservers.runtime.RuntimeServiceMBean");
String serverName = (String) mBeanServer.getAttribute(serviceObjectName, "ServerName");

3) Теперь мы можем создать исполняемый сервер ObjectName...

ObjectName serverRuntime = new ObjectName("com.bea:Name="+serverName+",Type=ServerRuntime");

4) ... и получаем нужные нам атрибуты

String listenAddress = mBeanServer.getAttribute(serverRuntime, "ListenAddress");
Integer listenPort = mBeanServer.getAttribute(serverRuntime, "ListenPort");

rem: listenAddress отформатирован как hostname/IP, вам нужно манипулировать им, чтобы получить только IP или хост

Оттуда вы можете получить доступ к большому количеству информации; например, адрес сервера администрирования, который управляет сервером среды выполнения, кластером среды выполнения и т. д.

Вот список, который я получаю из консоли WLST (WL12.2.1), не проверял, есть ли у нас доступ ко всем атрибутам/MBean.

dr--   ApplicationRuntimes
dr--   AsyncReplicationRuntime
dr--   BatchJobRepositoryRuntime
dr--   ClassLoaderRuntime
dr--   ClusterRuntime
dr--   ConcurrentManagedObjectsRuntime
dr--   ConnectorServiceRuntime
dr--   DefaultExecuteQueueRuntime
dr--   EntityCacheCumulativeRuntime
dr--   EntityCacheCurrentStateRuntime
dr--   EntityCacheHistoricalRuntime
dr--   ExecuteQueueRuntimes
dr--   JDBCServiceRuntime
dr--   JMSRuntime
dr--   JTARuntime
dr--   JVMRuntime
dr--   JoltRuntime
dr--   LibraryRuntimes
dr--   LogBroadcasterRuntime
dr--   LogRuntime
dr--   MANAsyncReplicationRuntime
dr--   MANReplicationRuntime
dr--   MailSessionRuntimes
dr--   MaxThreadsConstraintRuntimes
dr--   MessagingBridgeRuntime
dr--   MessagingBridgeRuntimes
dr--   MinThreadsConstraintRuntimes
dr--   PartitionRuntimes
dr--   PathServiceRuntime
dr--   PathServiceRuntimes
dr--   PersistentStoreRuntimes
dr--   RequestClassRuntimes
dr--   SAFRuntime
dr--   SNMPAgentRuntime
dr--   ServerChannelRuntimes
dr--   ServerLogRuntime
dr--   ServerSecurityRuntime
dr--   ServerServices
dr--   SingleSignOnServicesRuntime
dr--   ThreadPoolRuntime
dr--   TimerRuntime
dr--   WANReplicationRuntime
dr--   WLDFRuntime
dr--   WTCRuntime
dr--   WebServerRuntimes
dr--   WorkManagerRuntimes
dr--   WseeClusterFrontEndRuntime
dr--   WseeWsrmRuntime

-r--   ActivationTime                               
-r--   AdminServer                                  
-r--   AdminServerHost                              
-r--   AdminServerListenPort                        
-r--   AdminServerListenPortSecure                  
-r--   AdministrationPort                           
-r--   AdministrationPortEnabled                    
-r--   AdministrationURL                            
-r--   AsyncReplicationRuntime                      
-r--   ClusterRuntime                               
-r--   CurrentDirectory                             
-rw-   CurrentMachine
-r--   DefaultExecuteQueueRuntime                   
-r--   DefaultURL                                   
-r--   EntityCacheCumulativeRuntime                 
-r--   EntityCacheCurrentStateRuntime               
-r--   EntityCacheHistoricalRuntime                 
-r--   HealthState                                  
-r--   HealthStateJMX                               
-r--   JoltRuntime                                  
-r--   ListenAddress                                
-r--   ListenPort                                   
-r--   ListenPortEnabled                            
-r--   MANAsyncReplicationRuntime                   
-r--   MANReplicationRuntime                        
-r--   MessagingBridgeRuntime                       
-r--   MiddlewareHome                               
-r--   Name                                         
-r--   OpenSocketsCurrentCount                      
-r--   OracleHome                                   
-r--   OverallHealthState                           
-r--   OverallHealthStateJMX                        
-rw-   Parent                                       
-r--   PathServiceRuntime                           
-r--   RestartRequired                              
-r--   RestartsTotalCount                           
-r--   SSLListenAddress                             
-r--   SSLListenPort                                
-r--   SSLListenPortEnabled                         
-r--   ServerClasspath                              
-r--   SocketsOpenedTotalCount                      
-r--   State                                        
-r--   StateVal                                     
-r--   Type                                         
-r--   WANReplicationRuntime                        
-r--   WeblogicHome                                 
-r--   WeblogicVersion                              
-r--   WseeClusterFrontEndRuntime
person Zou    schedule 05.07.2017
comment
Я не думаю, что clapsus пробовал мое решение, так как между его запросом и моим ответом прошло 2 года. - person Zou; 01.02.2018