2017-06-12 125 views
1

我正在運行springboot服務器。 該服務器有一些web服務。 其中一個服務在收到請求時必須運行外部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; 
} 

} 

如果我的罐子做的很簡單的東西,如創建一個文件,它的作品不錯。但如果它更復雜,線程就停止工作,CPU將降至0%。這取決於我所要求的。對於某些任務問題發生之前爲他人如做

while(true); 

它停了幾秒鐘後它可以運行30-35seconds。

我認爲這就像超時,但實際上它不是一個恆定的時間。也許像內存問題...?我試過在springboot服務器之外運行相同的代碼(在啓動Memory.start()的簡單java項目主體上,它運行良好,所以我認爲這是從我身邊引起的彈簧啓動誤解。知道如何使這個瓶子從springboot服務器獨立運行只是請告訴我。 謝謝。

回答

0

我終於找到了解決辦法,我只好把一個

p.waitFor(); 

因此線程啓動罐子會不停止,然後,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"); 
     } 
    } 
} 
相關問題