2013-05-01 2 views
1

В сценарии обработки сервлета Async я хочу добиться отмены запросов. (Am также надеется сохранить этот RESTful)Любые проблемы с этим подходом к отмене/прерыванию обработки сервлета Async

Say, у меня есть следующий код:

@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/ссылку как часть первых частичных ответов (потому что я мог бы получить много частичных ответов на один запрос как часть обработки Async).
  • Связь может быть, напр: .../outstandingRequests/RequestID
  • При необходимости отменить запрос, клиент делает запрос DELETE на URL, и пусть фигуру сервера, как добиться отмены в конце.

Любые проблемы с этим подходом?

+1

Это не стандартный подход, о котором я знаю, но наша команда возвращает URL/выдающийся запросRequests/requestId, а DELETE к этому URL-адресу - это отмена, а GET возвращает статус, который включает результаты операции, когда операция завершена. (PUT и POST не поддерживаются). – Pace

+0

+1. Имеет смысл. Infact, я редактирую свой пост, чтобы отразить ваше предложение и держать его открытым, чтобы искать дополнительные ресурсы. – brainOverflow

+0

@Pace: Я думаю, вы ответили на вопрос. Можете ли вы опубликовать свой комментарий в качестве ответа, чтобы я мог его принять! – brainOverflow

ответ

1

При использовании длинных операций/задач в смысле RESTful лучше всего рассматривать операцию как ресурс. Сообщение на URL-адрес операции возвращает URL-адрес, который вы можете использовать для получения статуса этой операции (включая результаты при завершении операции), и DELETE на этот URL-адрес завершит операцию.

Смежные вопросы