開發 Liberty 的 JMX Java 用戶端

您可以開發 Java™ 管理延伸 (JMX) 用戶端應用程式來存取 Liberty 的安全 REST 連接器。

關於這項作業

您可以利用 JMX 遠端用戶端應用程式,透過 JMX 程式設計來管理 Liberty

程序

  1. 請從下列範例應用程式碼開始。在應用程式類別路徑 liberty_home/clients/restConnector.jar 中,新增 Liberty REST 連接器用戶端程式庫。
    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 值。使用伺服器的管理者使用者 ID 和密碼。
  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. 選擇性的: 停用 Secure Sockets Layer (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. 選擇性的: 利用環境 Map 來配置 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 Socket Factory 來取得 Socket。如果顯示異常狀況 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,然後透過 REST 連接器,從該環境定義使用 SocketFactory。
    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