1

Web アプリケーションからバックグラウンド プロセスを開始/一時停止/終了できるようにしたいと考えています。プロセスを無期限に実行したい。

ユーザーは Web ページに移動します。ボタンを押してスレッドを開始すると、ユーザーが停止を指示するまでスレッドは実行され続けます。

これを行うための最良のツールを決定しようとしています。私は Quartz のようなものを見てきましたが、Quartz のようなものが不定スレッドに適しているかどうかについての議論は見たことがありません。

このようなことをしたいというのが最初の考えでした。

public class Background implements Runnable{
    private running = true;

    run(){
         while(running){
              //processing 
        }
    }

    stop(){
        running = false;
    }
}

//Then to start
Background background = new Background();
new Thread(background).start();
getServletContext().setAttribute("background", background);

//Then to stop
background = getServletContext().getAttribute("background");
background.stop();

これをテストします。しかし、これを達成するためのより良い方法があるかどうか、私は興味があります。

4

1 に答える 1

1

まず、ObjectContext に入れられるすべての は を実装する必要がありますSerializable

Backgroundオブジェクトをコンテキストに入れることはお勧めしませんが、属性を使用してBackgroundControllerクラスを作成することはお勧めしませんprivate boolean running = true;synchronisedバックグラウンド スレッドと Web リクエスト スレッドが競合しないように、ゲッターとセッターは にする必要があります。同様に、private boolean stopped = false;も同じクラスに入れる必要があります。

他にもいくつか変更を加えました。アクティビティの途中でプロセスを停止できるようにするには、ループ コアを小さな単位 (1 回の反復など) に分割する必要があります。

コードは次のようになります。

public class BackgroundController implements Serializable {
    private boolean running = true;
    private boolean stopped = false;
    public synchronized boolean isRunning() { 
        return running; 
    }
    public synchronized void setRunning(boolean running) { 
        this.running = running; 
    }
    public synchronized boolean isStopped() { 
        return stopped; 
    }
    public synchronized void stop() { 
        this.stopped = true; 
    }
}
public class Background implements Runnable {
    private BackgroundController control;
    public Background(BackgroundController control) {
        this.control = control;
    }

    run(){
         while(!isStopped()){
              if (control.isRunning()) {
                   // do 1 step of processing, call control.stop() if finished
              } else {
                   sleep(100); 
              }
        }
    }

}

//Then to start
BackgroundController control = new BackgroundController();
Background background = new Background(control);
new Thread(background).start();
getServletContext().setAttribute("backgroundcontrol", control);

//Then to pause
control = getServletContext().getAttribute("backgroundcontrol");
control.setRunning(false);

//Then to restart
control = getServletContext().getAttribute("backgroundcontrol");
control.setRunning(true);

//Then to stop
control = getServletContext().getAttribute("backgroundcontrol");
control.stop();
于 2013-02-03T00:16:59.313 に答える