簡體   English   中英

如何替換當前的Java進程,比如unix風格的exec?

[英]How can I replace the current Java process, like a unix-style exec?

我有一個用Java編寫的服務器作為Windows服務運行(感謝Install4J)。 我希望此服務能夠下載其運行的最新版本的JAR文件,並開始運行新代碼。 縫合是我不希望Windows服務完全退出。

理想情況下,我會通過unix樣式的exec()調用來完成此操作,以停止當前版本並運行新版本。 我怎樣才能最好地完成這個?

據我所知,Java中沒有辦法做到這一點。

我想你可以通過使用Java Runtime.execProcessBuilder的start()命令(啟動新進程)來解決它,然后讓當前結束...文檔狀態

當沒有對Process對象的更多引用時,子進程不會被終止,而是子進程繼續異步執行。

如果父母完成並且是垃圾收集,我假設同樣如此。

捕獲的是Runtime.exec的進程將不再具有有效的輸入,輸出和錯誤流。

這是一種復雜但便攜的方式。

將代碼拆分為兩個罐子。 一個非常小的jar就是為了管理流程啟動。 它創建一個ClassLoader,在其類路徑中保存另一個jar。

如果要加載新版本,可以終止從舊jar運行代碼的所有線程。 從舊jar中取消對類實例的所有引用。 取消對加載舊jar的ClassLoader的所有引用。 此時,如果您沒有遺漏任何內容,舊類和ClassLoader應該有資格進行垃圾回收。

現在,您將重新開始使用指向新jar的新ClassLoader實例,然后重新啟動應用程序代碼。

Java Service Wrapper可以做到這一點以及更多。

您可以使用內置的重新加載功能,例如Tomcat,Jetty或JBoss,它們可以作為服務運行,您不必將它們用作Web容器或Java EE容器。

其他選項是OSGi,以及您自己的類加載功能。

但請注意在生產環境中重新加載。 它並不總是最好的解決方案。

一般的做法:

import java.io.BufferedInputStream;
import java.util.Arrays;

public class ProcessSpawner {    
public static void main(String[] args) {
    //You can change env variables and working directory, and
    //have better control over arguments.
    //See [ProcessBuilder javadocs][1]
    ProcessBuilder builder = new ProcessBuilder("ls", "-l");

    try {
        Process p = builder.start();
        //here we just echo stdout from the process to java's stdout.
        //of course, this might not be what you're after.
        BufferedInputStream stream = 
            new BufferedInputStream(p.getInputStream());
        byte[] b = new byte[80];
        while(stream.available() > 0) {                 
            stream.read(b);
            String s = new String(b);
            System.out.print(s);
            Arrays.fill(b, (byte)0);
        }
        //exit with the exit code of the spawned process.
        System.exit(p.waitFor());

    } catch(Exception e) {
        System.err.println("Exception: "+e.getMessage());
        System.exit(1);
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM