0

解決方法がわからない問題があります。1つのシングルスレッドのエグゼキュータサービスを使用してJavaポーリングアプリを作成しました。そのサービスは、いくつかのファイル操作とデータベースの相互作用を行います。

コマンドpromt/実行可能jarからjava-jarmyapp.jarを使用して実行すると、が実行されます。いつでも止めることができます。

次に、ユーザー用に2つのスクリプトを作成する必要があります(Tomcatのように)。1つはアプリを起動するためのもので、もう1つは停止するためのものです。

ただし、ユーザーがスクリプトを実行して停止すると、エグゼキューターサービスのすべてのジョブ/スレッドが終了するまでプロセスが強制終了されないという考えがあります。実行中の状態でプロセスを強制終了すると、ジョブを実行しているシステムが停止する可能性があるため(たとえば、ファイルの移動中)、一貫性のない状態になる可能性があります。

問題は、シェルスクリプトからExecutorServiceの結果にアクセスできないことです。

このアプリを実行し、動作を制御およびアクセスするための2つのスクリプトを作成するにはどうすればよいですか。?

編集:

myapp.jarは定期的なエグゼキュータサービスを実行します。プロセスを強制終了するのではなく、エグゼキュータサービスがタスクを実行していない後にのみ停止できるようにする停止スクリプトを作成する必要があります。なぜなら、操作中にプロセスを強制終了すると、システムの一貫性が失われるからです。私のシステムはファイルを読み取り、それらを別のディレクトリに移動します。途中で強制終了すると、処理されるファイルと処理されないファイルがあります。ユーザーがUNIXシステムから停止スクリプトを実行した場合に、スクリプトがプロセスを強制終了しないか、ジョブが終了するまで待機するソリューションが必要です。

4

1 に答える 1

1

Shutdown Hook がここで必要なソリューションだと思います。シャットダウン フックを使用すると、ユーザーはシャットダウン アクションが実行されるスレッドを完全に制御できます。スレッドは、適切な優先度、コンテキスト、権限などを指定して、適切なスレッド グループに作成できます。

サンプルプログラム

public class ShutDownHook {

    public static void main(String[] args) {
        
        final Thread mainThread = Thread.currentThread();
        Runtime.getRuntime().addShutdownHook(new Thread() {
            public void run() {
                // Add your cleanup logic here
                System.out.println("Shutdown hook is executing");
                try {
                    mainThread.join();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
        
        System.exit(0);
    }
}

出力

Shutdown hook is executing
  • Runtime.getRuntime().addShutdownHook(Thread h)フックを追加し、
  • Runtime.getRuntime().removeShutdownHook(Thread h)パラメータとして指定されたフックを削除します。

上記のように、シャットダウン フックに適切なコード ロジックを追加するだけです。

参照リンクjavadoc1 つのブログ投稿

于 2012-12-05T20:31:21.723 に答える