非同期サーブレット処理シナリオで、リクエストのキャンセルを実現したいと考えています。(これを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 リクエストを実行し、サーバーにその最後でキャンセルを達成する方法を見つけさせます。
このアプローチに問題はありますか?