2013-05-01 63 views
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請求,讓服務器弄清楚如何在其結束時實現取消。

這種方法的任何問題?

+1

這不是我知道的標準方法,但我們的團隊返回URL/outstandingRequests/requestId,並且對該URL的DELETE是取消,並且GET會在操作完成時檢索包含操作結果的狀態。 (不支持PUT和POST)。 – Pace 2013-05-02 00:43:55

+0

+1。說得通。事實上,我編輯我的帖子,以反映你的建議,並保持開放,尋找更多的投入。 – brainOverflow 2013-05-02 00:52:50

+0

@Pace:我想你已經回答了這個問題。你可以發表你的評論作爲答案,以便我可以接受它! – brainOverflow 2013-05-03 19:25:52

回答

1

當以RESTful方式使用長時間運行的操作/任務時,最好將操作本身視爲資源。操作URL的帖子會返回一個可用於獲取該操作狀態(包括操作完成時的結果)的URL,並且對該URL的DELETE將終止該操作。