2016-10-30 6 views
0

いくつかの情報を保持するテキストファイルをロードし、その情報に基づいて複数のスレッドを実行するプログラムがあります。各スレッドはプロセスです。ここに私のコードです:私はrunMultiClientクラスからその変数に到達することができますどのような方法がありますプロセスのCPU使用率を取得する

OperatingSystemMXBean osBean = ManagementFactory.getPlatformMXBean(OperatingSystemMXBean.class); 
      cpuLoad = osBean.getProcessCpuLoad(); 

:私のClient.jarファイル内

public class runMultiClient { 
public static void main(String[] args){ 
    List<Process> PRlist = new ArrayList<Process>(); 
    List<String[]> commandsList = new ArrayList<String[]>(); 
    boolean running = true; 

    if (args.length == 2 && args[0].matches("-f")){ 
     String dir = System.getProperty("user.dir"); 
     String path = dir + "/" + args[1]; 
     FileReader fr; 
     try { 
      fr = new FileReader(path); 
      BufferedReader bf = new BufferedReader(fr); 

      String line = ""; 
      while ((line = bf.readLine()) != null){ 
       String[] tk = line.split(" "); 
       String[] cmd = {"java", "-jar", "Client.jar", "-a", tk[0], "-p", tk[1], 
         "-u", tk[2], "-pw", tk[3], "-m", tk[4], "-s", tk[5]}; 
       Process pr = new ProcessBuilder().inheritIO().command(cmd).start(); 
       PRlist.add(pr); 
       commandsList.add(cmd); 
       System.out.println(tk[4] + " streaming process is established."); 
      } 
     } 
     catch (FileNotFoundException ex) {ex.printStackTrace();} 
     catch (IOException ex) {ex.printStackTrace();} 
    } else { 
     System.out.println("No stream file was specified."); 
    } 
}} 

、私は、そのクラスのCPU負荷を監視する変数を持っています? そうでない場合は、実行中のプロセスでOperatingSystemMXBeanを使用する方法はありますか? 私はpr.getClass()を試しましたが、それはどこにもありません。 ご協力いただければ幸いです。

+0

は、あなたがそのすなわち、cpuload変数の完全なクラスを提供することができます位置しています ? – developer

+0

私はできますが、それはどのようにあなたを助けますか? –

+0

'cpuLoad'は他のクラスのパブリック変数です。 –

答えて

2

オプション#1:エージェント・ライブラリーを追加し、HTTP

上でJMXを公開あなたは他の同じようなことがSimpleJMXである(あなたの監視対象のアプリケーションでJolokiaエージェントをバンドルすることができますこれは、HTTP/JSON上でJMX Beanを公開するので、これはとの対話のために動作します。 。。他のPythonなどの言語からJMX(超快適のようなコマンドからトラブルシューティング)その後、あなたは、Apache HTTPクライアント等を介して、あなたの興味のMBeanにアクセスすることができます

オプション#2:JMXクライアント

は、リモート許可します次のパラメータを追加して接続するwあなたの監視対象アプリケーションを起動編:

-Dcom.sun.management.jmxremote.port=9999 \ 
-Dcom.sun.management.jmxremote.authenticate=false \ 
-Dcom.sun.management.jmxremote.ssl=false 

次に、あなたはthe tutorial

+0

私は遠隔地から監視する必要はありません。 'client'のために計算された値にアクセスするために' runMultiClient'クラスが必要です。 –

+0

@DanyLavrovここでのリモート・ワードは、呼び出し元がMBeanと同じVMに存在しないという事実を強調するためのものです。ランチャープロセスは、この場合はtcpソケット経由で起動アプリケーションと通信します。 – Ivan

+1

@DanyLavrov同じプロセスにない場合は、リモートです。 Javaは共有メモリーを一般的には使用しません。 –

1

ないあなたには、いくつかの他の要件のためにProcessBuilder().inheritIO()を呼び出す必要があるかどうかわからのように、jconsoleをして手書きのJMXクライアントコードでMBeanにアクセスすることができるはずです、そうでない場合は、定期的にCPU負荷をSystem.outに書き込むClient.jarプロセスでデーモンスレッドを開始することができます。次に、runMultiClientスレッド[s]は、プロセスのSystem.outを表すInputStreamからスレッドを読み取ることができます。または、スレッドがコマンドを受け入れ、それに応じて印刷させる。ラフ例:生み出しclient.jarの中

を実行し、この:

public static void startCmdListener() { 
    try { 
     Thread t = new Thread("CmdListener") { 
      BufferedReader br = null; 
      InputStreamReader isr = null; 
      final OperatingSystemMXBean os = (OperatingSystemMXBean) ManagementFactoryHelper.getOperatingSystemMXBean(); 
      public void run() { 
       try { 
        isr = new InputStreamReader(System.in); 
        br = new BufferedReader(isr); 
       } catch (Exception ex) { 
        ex.printStackTrace(System.err); 
        return; 
       } 
       try { 
        String cmd = null; 
        while(true) { 
         cmd = br.readLine(); 
         if("cpu".equalsIgnoreCase(cmd)) { // cpu command, print the process load 
          System.out.println(os.getProcessCpuLoad()); 
         } else if("exit".equalsIgnoreCase(cmd)) { // exit command, break 
          break; 
         } 
        } 
       } catch (Exception ex) { 
        ex.printStackTrace(System.err); 
        return; 
       } 

      } 
     }; 
     t.setDaemon(true); 
     t.start(); 
    } catch (Exception ex) { 
     ex.printStackTrace(System.err); 
    } 
} 

を実行し、このrunMultiClientでCPU負荷を取得する:

public static double getCpu(OutputStream processIn, InputStream processOut) { 
    PrintStream ps = null; 
    BufferedReader br = null; 
    InputStreamReader isr = null; 

    try { 
     ps = new PrintStream(processIn); 
     isr = new InputStreamReader(processOut); 
     br = new BufferedReader(isr); 
     ps.println("cpu"); 
     ps.flush();   
     return Double.parseDouble(br.readLine()); 
    } catch (Exception ex) { 
     throw new RuntimeException(ex); 
    } finally { 
     if(ps!=null) try { ps.close(); } catch (Exception x) {} 
     if(br!=null) try { br.close(); } catch (Exception x) {} 
     if(isr!=null) try { isr.close(); } catch (Exception x) {} 
    } 
} 
+0

これは良い回避策のようです。私はそれを試してみると思います。ありがとうございました –

関連する問題