1
在異步servlet處理場景中,我希望取消請求。 (我也希望能保持這種基於REST)取消/中止異步servlet處理的任何問題
說,我有這樣的代碼:
@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請求標識先前的請求,然後服務器取消先前的請求(即停止服務器端處理該請求並完成響應)。
有沒有一個標準的方法來做到這一點? 如果是沒有標準的方法來做到這一點,每個開發人員按照他們的意願和技能來做,我想知道我的(微不足道的)方法是否正確。 我的方式(後@吳佩慈的建議)是:
- 在服務器上創建一個「的requestId」,並返回一個URL /鏈接爲第一部分反應的 部分(因爲我能得到一個 許多部分緩解單個請求作爲異步處理的一部分)。
- 鏈路可以是,例如: .../outstandingRequests /的requestId
- 當需要取消該請求,客戶端在URL上一個DELETE請求,讓服務器弄清楚如何在其結束時實現取消。
這種方法的任何問題?
這不是我知道的標準方法,但我們的團隊返回URL/outstandingRequests/requestId,並且對該URL的DELETE是取消,並且GET會在操作完成時檢索包含操作結果的狀態。 (不支持PUT和POST)。 – Pace 2013-05-02 00:43:55
+1。說得通。事實上,我編輯我的帖子,以反映你的建議,並保持開放,尋找更多的投入。 – brainOverflow 2013-05-02 00:52:50
@Pace:我想你已經回答了這個問題。你可以發表你的評論作爲答案,以便我可以接受它! – brainOverflow 2013-05-03 19:25:52