2

非同期サーブレット処理シナリオで、リクエストのキャンセルを実現したいと考えています。(これをRESTfulに保つことも望んでいます)

たとえば、次のようなコードがあります。

@RequestMapping("/quotes")
@ResponseBody
public void quotes() {
   //...
   final AsyncContext ac = request.startAsync();
   ac.setTimeout(0);
   RunJob job = new RunJob(ac);
   asyncContexts.add(job);
   pool.submit(job);
};

// In some other application-managed thread with a message-driven bean:
public void onMessage(Message msg) {
   //...
   if (notEndOfResponse) {
     ServletOutputStream out = ac.getResponse().getOutputStream();
     //...
     out.print(message);
   } else {
     ac.complete();
     asyncContexts.remove(ac);
   }
};

クライアントがサーバー側でこの処理をキャンセルすることを決定した場合、クライアントは前の要求を識別する別の HTTP 要求を送信する必要があり、サーバーは前の要求をキャンセルします (つまり、その要求に対するサーバー側の処理を停止し、それに対する応答を完了します)。 )。

これを行う標準的な方法はありますか?これを行うための標準的な方法がなく、各開発者が自分の意志とスキルに従ってそれを行う場合、この問題に対する私の(些細な)アプローチが問題ないかどうかを知りたいです。私のやり方(@Paceの提案の後)は次のとおりです。

  • サーバーで「requestId」を作成し、最初の部分応答の一部として URL/リンクを返します (非同期処理の一部として、1 つの要求に対して多くの部分応答を取得できるため)。
  • リンクは、 たとえば .../outstandingRequests/requestIdのようになります。
  • リクエストをキャンセルする必要がある場合、クライアントは URL に対して DELETE リクエストを実行し、サーバーにその最後でキャンセルを達成する方法を見つけさせます。

このアプローチに問題はありますか?

4

1 に答える 1

2

RESTful な意味で長時間実行される操作/タスクを使用する場合は、操作自体をリソースとして扱うのが最善です。操作 URL へのポストは、その操作のステータス (操作が終了したときの結果を含む) を取得するために使用できる URL を返し、その URL への DELETE は操作を終了します。

于 2013-05-03T20:12:37.327 に答える