Сборка JMX-клиента в сервлете, установленном в Deployment Manager - PullRequest
0 голосов
/ 06 мая 2010

Я создаю приложение мониторинга в виде сервлета, работающего на моем администраторе развертывания websphere 7 ND. Инструмент использует JMX для запроса менеджера развертывания для получения различных данных. Глобальная безопасность включена на dmgr.

У меня проблемы с тем, чтобы заставить это работать, однако. Моей первой попыткой было использование клиентского кода websphere:

String sslProps = "file:" + base +"/properties/ssl.client.props";
System.setProperty("com.ibm.SSL.ConfigURL", sslProps);
String soapProps = "file:" + base +"/properties/soap.client.props";   
System.setProperty("com.ibm.SOAP.ConfigURL", pp);

Properties connectProps = new Properties();
connectProps.setProperty(AdminClient.CONNECTOR_TYPE, AdminClient.CONNECTOR_TYPE_SOAP);
connectProps.setProperty(AdminClient.CONNECTOR_HOST, dmgrHost);
connectProps.setProperty(AdminClient.CONNECTOR_PORT, soapPort);
connectProps.setProperty(AdminClient.CONNECTOR_SECURITY_ENABLED, "true");
AdminClient adminClient = AdminClientFactory.createAdminClient(connectProps) ;

Это приводит к следующему исключению:

Caused by: com.ibm.websphere.management.exception.ConnectorNotAvailableException: ADMC0016E: The system cannot create a SOAP connector to connect to host ssunlab10.apaceng.net at port 13903.
    at com.ibm.ws.management.connector.soap.SOAPConnectorClient.getUrl(SOAPConnectorClient.java:1306)
    at com.ibm.ws.management.connector.soap.SOAPConnectorClient.access$300(SOAPConnectorClient.java:128)
    at com.ibm.ws.management.connector.soap.SOAPConnectorClient$4.run(SOAPConnectorClient.java:370)
    at com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java:118)
    at com.ibm.ws.management.connector.soap.SOAPConnectorClient.reconnect(SOAPConnectorClient.java:363)
    ... 22 more
Caused by: java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
    at java.net.Socket.connect(Socket.java:519)
    at java.net.Socket.connect(Socket.java:469)
    at java.net.Socket.<init>(Socket.java:366)
    at java.net.Socket.<init>(Socket.java:209)
    at com.ibm.ws.management.connector.soap.SOAPConnectorClient.getUrl(SOAPConnectorClient.java:1286)
    ... 26 more

Итак, я попытался сделать это через RMI, но добавив в среду sas.client.properties и установив тип разъема в коде как CONNECTOR_TYPE_RMI. Теперь, хотя я получил исключение NameNotFoundException из CORBA:

Caused by: javax.naming.NameNotFoundException: Context: , name: JMXConnector: First component in name JMXConnector not found. [Root exception is org.omg.CosNaming.NamingContextPackage.NotFound: IDL:omg.org/CosNaming/NamingContext/NotFound:1.0]

Чтобы проверить, была ли это проблема IBM, я попытался использовать стандартный соединитель JMX, но с тем же результатом (замените AdminClient на JMXConnector в приведенной выше ошибке)

        JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/JMXConnector");
        Hashtable h = new Hashtable();
        String providerUrl = "corbaloc:iiop:" + dmgrHost + ":" + rmiPort + "/WsnAdminNameService";
        h.put(Context.PROVIDER_URL, providerUrl);

        // Specify the user ID and password for the server if security is enabled on server.
        String[] credentials = new String[] { "***", "***" };
        h.put("jmx.remote.credentials", credentials);

        // Establish the JMX connection.
        JMXConnector jmxc = JMXConnectorFactory.connect(url, h);

        // Get the MBean server connection instance.
        mbsc = jmxc.getMBeanServerConnection();

В этот момент в отчаянии я написал сценарий wsadmin для запуска методов RMI и SOAP. К моему изумлению, это прекрасно работает. Поэтому мой вопрос: почему код не работает в сервлете, установленном на dmgr?

С уважением,

Тревор

1 Ответ

0 голосов
/ 06 мая 2010

При ошибке SOAP ConnectException выглядит так, как будто неправильный хост / порт SOAP был использован для dmgr. Я бы дважды проверил логи сервера на наличие порта SOAP. Для ошибки RMI (NameNotFoundException) похоже, что вы пытаетесь использовать JMXConnectorFactory, который не поддерживается WAS.

Если ваше приложение установлено в dmgr, вероятно, проще всего использовать AdminServiceFactory.getAdminService для получения внутрипроцессной ссылки на AdminService, а не пытаться открыть новое соединение с тем же процессом:

http://publib.boulder.ibm.com/infocenter/wasinfo/fep/topic/com.ibm.websphere.javadoc.doc/web/apidocs/com/ibm/websphere/management/AdminServiceFactory.html

...