2017-06-12 11 views
1

私はspringbootサーバーを実行しています。 このサーバーにはいくつかのWebサービスがあります。 これらのサービスの1つは、要求を受け取ったときに外部jarを実行する必要があります。実際には、サーバーは計算エンジン(jar)とユーザーの間のインターフェイスです。 コードがあります:springbootサーバーからjarアプリケーションを実行します。

public class Launcher extends Thread{ 

@Override 
public void run() { 
    // TODO Auto-generated method stub 
    runJar(this.getJar(), this.getArgs()); 

} 






private void runJar(String jar, String[] args){ 
    try { 
     String[] s = new String[4+args.length]; 
     s[0] = "nohup"; 
     s[1] = "java"; 
     s[2] = "-jar"; 
     s[3] = jar; 
     for(int i = 0; i < args.length; i++){ 
      s[i+4] = args[i]; 
     } 
     Process p = Runtime.getRuntime().exec(s); 

     //Process exec = Runtime.getRuntime().exec(new String[] {"mkdir", "monTest"}); 


    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     System.out.println("failed"); 
     e.printStackTrace(); 
    } 
} 
} 

public class Memory { 

private ArrayList<Integer> startedIds; 

public ArrayList<Integer> getStartedIds() { 
    return startedIds; 
} 

public void setStartedIds(ArrayList<Integer> startedIds) { 
    this.startedIds = startedIds; 
} 

public Memory() { 
    this.startedIds = new ArrayList<>(); 
} 

public Memory(ArrayList<Integer> arr) { 
    this.startedIds = arr; 
} 

public int start() { 
    int id = this.findAvailableId(); 
    this.getStartedIds().add(id); 
    System.out.println("i'm going to start with a big command!+uhpop"); 
    String[] args = {"arg1","arg2", "arg3", "&"}; 
    Launcher launcher = new Launcher("myJar.jar", args); 
    launcher.start(); 


    return id; 
} 

private int findAvailableId() { 
    int id = 0; 
    while(this.getStartedIds().contains(id)){ 
     id++; 
    } 
    return id; 
} 

} 

私のjarファイルは、このようなファイルを作成するなど、本当に簡単な何かをする場合、それは素敵な作品。しかし、それがより複雑な場合、スレッドは動作を停止し、CPUは0%に低下します。それは私が尋ねるものに依存します。いくつかのタスクでは、実行中に問題が発生する前に30〜35秒かかることがあります。

while(true); 

これは数秒後に停止しました。

タイムアウトのようなものだと思っていましたが、実際は一定の時間ではありません。メモリ問題のようなものかもしれない...?

私はspringbootサーバー(Memory.start()を起動する単純なJavaプロジェクトのメインフレーム)で同じコードを実行しようとしましたが、うまくいきます。このjarは私をしてください教えてspringbootサーバーから独立して実行させる方法を知っている。 ありがとう。

答えて

0

私が最終的に解決策を見つけた。私は、スレッドがjarファイルを起動する

p.waitFor(); 

を配置しなければならなかっただろうjarファイルの入出力にはjarの入力と出力が接続されていませんそれから、私はjarの出力を監視するために別のスレッドを作成しなければなりませんでした(実際にはメインスレッドで表示されます)。 http://labs.excilys.com/2012/06/26/runtime-exec-pour-les-nuls-et-processbuilder/ springbootサーバの外で働いていた理由はまだ分かりませんが、実際には実行してはいけません。

誰かが興味があれば、私のコードはここにあります。

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 

class AfficheurFlux implements Runnable { 

private final InputStream inputStream; 

AfficheurFlux(InputStream inputStream) { 
    this.inputStream = inputStream; 
} 

private BufferedReader getBufferedReader(InputStream is) { 
    return new BufferedReader(new InputStreamReader(is)); 
} 

@Override 
public void run() { 
    BufferedReader br = getBufferedReader(inputStream); 
    String ligne = ""; 
    try { 
     while ((ligne = br.readLine()) != null) { 
      System.out.println(ligne); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
} 


public class Memory { 

private ArrayList<Integer> startedIds; 

public ArrayList<Integer> getStartedIds() { 
    return startedIds; 
} 

public void setStartedIds(ArrayList<Integer> startedIds) { 
    this.startedIds = startedIds; 
} 

public Memory() { 
    this.startedIds = new ArrayList<>(); 
} 

public Memory(ArrayList<Integer> arr) { 
    this.startedIds = arr; 
} 

public int startJar() { 
    int id = this.findAvailableId(); 
    this.getStartedIds().add(id); 
    System.out.println("i'm going to start with a big command!"); 
    String[] args = {"arg1","arg2", "arg3"}; 
    Launcher launcher = new Launcher("myJar.jar", args); 
    launcher.start(); 
    return id; 
} 

private int findAvailableId() { 
    int id = 0; 
    while(this.getStartedIds().contains(id)){ 
     id++; 
    } 
    return id; 
} 






public class Launcher extends Thread{ 

private String jar; 
private String[] args; 

public AntLauncher(String jar, String[] args) { 
    super(); 
    this.jar = jar; 
    this.args = args; 
} 

@Override 
public void run() { 
    runJar(this.getJar(), this.getArgs()); 

} 

private void runJar(String jar, String[] args){ 
    try { 
     String[] s = new String[3+args.length]; 
     s[0] = "java"; 
     s[1] = "-jar"; 
     s[2] = jar; 
     for(int i = 0; i < args.length; i++){ 
      s[i+3] = args[i]; 
     } 
     Process p = Runtime.getRuntime().exec(s); 
     AfficheurFlux fluxSortie = new AfficheurFlux(p.getInputStream()); 
     AfficheurFlux fluxErreur = new AfficheurFlux(p.getErrorStream()); 

      new Thread(fluxSortie).start(); 
      new Thread(fluxErreur).start(); 

      p.waitFor(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     System.out.println("Fin du programme"); 
     } 
    } 
} 
関連する問題