0

EJB 内からスレッド セーフな方法で外部プロセスを呼び出すにはどうすればよいですか?

javadoc に記載されているように、ProcessBuilder はスレッドセーフではありません。Apache commons exec はスレッドセーフについて何も言っておらず、Runtime.exec にも自信がありません。

適切な方法は何ですか?

人々が私が悪用していると思わないように、いくつかのコードを追加させてください。このコードは機能する場合と機能しない場合があります

public int startTask(Logger logger, String expectPath, String expectScriptPath, long ticket) throws IOException {
    Runtime r = Runtime.getRuntime();
    Process p = r.exec(expectPath+" "+expectScriptPath+" "+ticket);

    SessionLogger sysout = new SessionLogger(logger,p.getInputStream());
    sysout.start();

    SessionLogger syserr = new SessionLogger(logger,p.getErrorStream());
    syserr.start();

    try {
        return p.waitFor();
    } catch (InterruptedException e) {
        log.error(e.getMessage(),e);
        return -1;
    }

}

この質問を閉じたり、反対票を投じたりしないでください。

スレッドセーフではないことはわかっています。EJB 内から適切に行う方法を知りたいだけです。

4

1 に答える 1

2

EJB のポイントの 1 つは、並行性について心配する必要がないことです。常に 1 つのスレッドだけが EJB メソッドを呼び出すことが保証されています。ProcessBuilder を静的にするか、EJB の異なるインスタンス間で同じインスタンスを共有しない限り、ProcessBuilder はスレッドセーフである必要はありません。

于 2014-02-13T04:02:54.410 に答える