1

http 要求によってリモートでタスクを実行できるようにするために、サーブレットにラップしたいタスクがあります。

REST API を使用してこれを実現できることはわかっていますが、現在のところ、単純なサーブレットで十分だと思います (間違っている場合は訂正してください)。

私が達成したいことの 1 つは、別の要求がまだ処理されている間にサーブレットへの要求が行われた場合に、「タスクは既に実行されています」という適切な応答を受け取ることです。

実行したい jar を呼び出す単純なサーブレットを servlet-3.0 を使用して作成しましたが、2 つの要求を行うと、最初の要求が完了するまで 2 番目の要求は処理されません。

編集:

私のサーブレットは単純な http サーブレットです。サービス メソッドがオーバーライドされました。最初に system.out.println("a") があります。サーブレットをデバッグ モードで呼び出してから (ブレークポイントで停止している間に) 再度呼び出すと、メッセージは 1 回だけ出力され、ブレークポイントを解放して最初の実行が終了すると 2 回目に出力されます。

4

2 に答える 2

0

たぶんあなたはロックが必要です:

public class Task extends HttpServlet {
    // for singleton
    //private volatile boolean running = false;

    // or try this:

    public static boolean running = false;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
    {
        if(running){
             PrintWriter out = response.getWriter();
             out.println("running");
             return;
        }
        synchronized(Task.class){
            if(!running){
                running = true;
                // run the task
                running = false;
            }
        }
    }
}
于 2013-03-20T07:17:30.110 に答える
0

まず第一に、これはまったく REST とは思えません。本当に (単一の) バックグラウンド タスクを生成したい場合は、リクエスト スレッドではなく、別のワーカー スレッドで実行するようにしてください。

于 2013-03-20T07:15:45.187 に答える