Liberty 开发 JMX Java 客户机

您可以开发 Java™ 管理扩展 (JMX) 客户机应用程序,以访问 Liberty 的受保护 REST 连接器。

关于此任务

借助 JMX 远程客户机应用程序,您可以通过 JMX 编程来管理 Liberty

过程

  1. 从以下样本应用程序代码开始。将 Liberty REST 连接器客户机库添加至应用程序类路径 liberty_home/clients/restConnector.jar
    import javax.management.remote.JMXServiceURL;
    import javax.management.MBeanServerConnection;
    import javax.management.remote.JMXConnector;
    import javax.management.remote.JMXConnectorFactory;
    import java.util.HashMap;
    
    
    public class Test { 
    
      public static void main(String[] args) {
        System.setProperty("javax.net.ssl.trustStore", <truststore location>);
        System.setProperty("javax.net.ssl.trustStorePassword", <truststore password>);
    
        //If the type of the trustStore is not jks, which is default, 
        //set the type by using the following line.
        System.setProperty("javax.net.ssl.trustStoreType", <truststore type>);
       
             try {
          HashMap<String, Object> environment = new HashMap<String, Object>();
          environment.put("jmx.remote.protocol.provider.pkgs", "com.ibm.ws.jmx.connector.client");
          environment.put(JMXConnector.CREDENTIALS, new String[] { "userid", "password" });
    
          JMXServiceURL url = new JMXServiceURL("service:jmx:rest://localhost:9443/IBMJMXConnectorREST");
          JMXConnector connector = JMXConnectorFactory.newJMXConnector(url, environment);
          connector.connect();
          MBeanServerConnection mbsc = connector.getMBeanServerConnection();
        } catch(Throwable t) {
             ...
        }
      }
    }
  2. 如果服务器为非生产环境生成服务器密钥库,那么将该密钥库用作应用程序客户机信任库。 服务器为非生产环境生成的密钥库包含客户机证书。缺省情况下,应用程序客户机信任库文件为 ${server.output.dir}/resources/security/key.jks
  3. 设置 javax.net.ssl.trustStoreType 属性。如果您使用缺省 Java 密钥库 (JKS) 类型,那么移除此行。
  4. 替换 JMXConnector.CREDENTIALS 属性的 useridpassword 值。对服务器使用管理员用户标识和密码。
  5. 在 JMXServiceURL 构造函数中,使用下列其中一种方法来设置服务器的主机名和端口号。
    1. 使用 HTTPS 端口号。缺省端口号为 9443
    2. 使用 ${server.output.dir}/logs/state/com.ibm.ws.jmx.rest.address 文件的内容作为 JMXServiceURLconstructor 参数。当服务器以所配置的 restConnector-2.0 功能部件启动,并且包含 REST 端点(例如,service:jmx:rest://localhost:9443/IBMJMXConnectorREST)时,程序将编写此文件。
  6. 要在另外的主机上运行客户机应用程序,请配置服务器 HTTP 端点以接受来自远程主机的连接。 例如,使用星号 (*) 作为 defaultHttpEndpoint 端点的 host 属性。
    <httpEndpoint id="defaultHttpEndpoint"
         httpPort="9080"
         httpsPort="9443"
         host="*" />
  7. 可选: 对安全套接字层 (SSL) 证书禁用主机名验证。随 Liberty 安装的证书可能不包含运行服务器的主机的名称。如果要禁用 SSL 证书的主机名验证,可以将系统属性 com.ibm.ws.jmx.connector.client.disableURLHostnameVerification 设置为 true,这会对所有连接禁用主机名验证。要以每个连接为基础禁用主机名验证,请在创建 JMX 连接时传递该属性作为新的 environment
    HashMap<String, Object> environment = new HashMap<String, Object>();
    environment.put("jmx.remote.protocol.provider.pkgs", "com.ibm.ws.jmx.connector.client");
    environment.put("com.ibm.ws.jmx.connector.client.disableURLHostnameVerification", Boolean.TRUE);
    environment.put(JMXConnector.CREDENTIALS, new String[] { "userid", "password" });
    ...
  8. 可选: 使用环境映射来配置 JMX REST 连接器设置。
    ...
    HashMap<String, Object> environment = new HashMap<String, Object>();
    environment.put("com.ibm.ws.jmx.connector.client.rest.maxServerWaitTime", 0);
    environment.put("com.ibm.ws.jmx.connector.client.rest.notificationDeliveryInterval", 65000);
    ...
  9. 可选: Liberty REST 连接器允许使用特定定制 SSL 套接字工厂来获取套接字。如果显示 javax.net.ssl.SSLHandshakeException: com.ibm.jsse2.util.j: PKIX path building failed: java.security.cert.CertPathBuilderException: unable to find valid certification path to requested target 异常,那么您可以从自己的密钥库创建自己的 SSLContext,然后将该上下文中的 SocketFactory 与 REST 连接器配合使用。
    KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
    InputStream inputStream = new FileInputStream("myTrustStore.jks");
    trustStore.load(inputStream, "password".toCharArray());
    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    trustManagerFactory.init(trustStore);
    TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
    SSLContext sslContext = SSLContext.getInstance("SSL");
    sslContext.init(null, trustManagers, null);
     
    Map<String, Object> environment = new HashMap<String, Object>();
    environment.put(ConnectorSettings.CUSTOM_SSLSOCKETFACTORY, sslContext.getSocketFactory()); 
    environment.put(ConnectorSettings.DISABLE_HOSTNAME_VERIFICATION, true); 
    environment.put("jmx.remote.protocol.provider.pkgs", "com.ibm.ws.jmx.connector.client");
    environment.put(JMXConnector.CREDENTIALS, new String[] { "userid", "password" });          
    JMXServiceURL url = new JMXServiceURL("REST", "localhost", 9443, "/IBMJMXConnectorREST"); 
    jmxConn = JMXConnectorFactory.connect(url, environment);

下一步做什么

要在应用程序中访问 JMX Mbean,请参阅有关访问 MBean 属性和操作的示例

用于指示主题类型的图标 任务主题

文件名:twlp_dev_jmxclient.html