2017-08-17 12 views
0

JolokiaをRMI-Serviceと共に使用する際に問題があります。 RMIサービスが開始されると、Jolokiaはhttp経由でアクセスできなくなります。RMI-ServerでJolokiaエージェントを使用する

私は問題を再現するサンプルクラスを作成しました:私は、RMI-サービスを開始しないようにmainメソッドを変更した場合は、

package com.example.rmi; 

import java.net.InetAddress; 
import java.rmi.Naming; 
import java.rmi.RemoteException; 
import java.rmi.registry.LocateRegistry; 
import java.rmi.server.UnicastRemoteObject; 

public class RMITest { 

    private class RMIService extends UnicastRemoteObject { 

     private static final long serialVersionUID = 1L; 

     protected RMIService() throws RemoteException { 
      super(); 
     } 

     public void doStuff() { 
      System.out.println("Processing..."); 

     } 

    } 

    public static void main(String[] args) throws RemoteException { 
     RMITest rmiServer = new RMITest(); 
     rmiServer.init(); 
    } 

    private void init() throws RemoteException { 
     RMIService rmiService = new RMIService(); 

     try { 
      System.out.println("Starting RMI-Service..."); 
      String hostname = InetAddress.getLocalHost().getHostName(); 
      System.setProperty("java.rmi.server.hostname", hostname); 

      int port = 2005; 
      LocateRegistry.createRegistry(port); 
      Naming.rebind("rmi://" + hostname + ":" + port 
        + "/RMIService", rmiService); 
      System.out.println("RMI-Service started!"); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Jolokiaが再びのhttp URL http://127.0.0.1:8778/jolokia/経由でアクセス可能です:

public static void main(String[] args) throws RemoteException { 
    RMITest rmiServer = new RMITest(); 
    //rmiServer.init(); 

    while(true) { 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
    } 

サービスは実行可能なjarです。ここで私は、アプリケーションを起動するために使用しているコマンドです:

java -javaagent:jolokia-jvm-1.3.7-agent.jar=port=8778,host=localhost -jar RMITest-0.0.1-SNAPSHOT.jar 

私は公式サイトからjolokiaエージェントをダウンロード:Jolokia Agent Download

答えて

0

私はRMI-サービスを開始した後、プログラムでエージェントを開始することで、回避策を見つけました。

それを行う方法を、次のStackOverflowのポストで説明されていますStarting a Java agent after program start

だから私はINIT-メソッドを実行した後、次の静的メソッドを始めている:

public static void attachGivenAgentToThisVM(String pathToAgentJar) { 
    try { 
     String nameOfRunningVM = ManagementFactory.getRuntimeMXBean().getName(); 
     String pid = nameOfRunningVM.substring(0, nameOfRunningVM.indexOf('@')); 
     VirtualMachine vm = VirtualMachine.attach(pid); 
     vm.loadAgent(pathToAgentJar, ""); 
     vm.detach(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

もあります"tools.jar"への依存関係が必要です:

<dependency> 
    <groupId>com.sun</groupId> 
    <artifactId>tools</artifactId> 
    <version>1.8</version> 
    <scope>system</scope> 
    <systemPath>${java.home}/../lib/tools.jar</systemPath> 
</dependency> 

私は依然としてコマンドラインから直接エージェントを起動することをお勧めします。だから、より良い解決策が大いに評価されます。

関連する問題