Я работаю на Джерси, используя программный API (например, Inflector и т. Д.), Мое требование заключается в добавлении обработки тайм-аута в случае, если ответ не возвращается в установленное количество времени для сценария.Поэтому я беру синхронизирующий вызов, но делаю его асинхронным, как показано ниже:
@Inject
private javax.inject.Provider<AsyncResponse> responseProvider;
/**
*
*/
@Override
public Response apply(final ContainerRequestContext context) {
final AsyncResponse asyncResponse = responseProvider.get();
asyncResponse.setTimeoutHandler(new TimeoutHandler() {
@Override
public void handleTimeout(AsyncResponse asyncResponse) {
AbstractPaymentEndpointHandler.this.handleTimeout(asyncResponse);
}
});
enrichContext(context, asyncResponse);
ThreadFactory threadFactory = ThreadFactoryProvider.getProvider().getThreadFactory("default");
ExecutorService service = Executors.newSingleThreadExecutor(threadFactory);
service.submit(new Runnable() {
@Override
public void run() {
Response resp = null;
try {
resp = applyInternal(context);
} catch (StillProcessingException spex) {
asyncResponse.cancel();
createStillProcessingResponse();
}
if (resp != null) {
asyncResponse.resume(resp);
}
}
});
return null;//remember asyncResponse.resume will return the response of this call
}
Любой обработчик, расширяющий этот Inflector, заставит его обрабатывать любые вызовы асинхронно с заданным временем ожидания (enrichContext устанавливает значение времени ожидания).После истечения времени ожидания я должен сделать следующее:
В случае, если сценарий настроен на продолжить после истечения времени ожидания Я отправляю http 100 Продолжить с пользовательским сообщением «Обработка еще»и оставь это этому.
В случае, если сценарий настроен на abort по истечении времени ожидания Я отправляю Http 503 с сообщением «Abort Requested» и оставляю его этому.
Моя реализация обратного вызова handleTimeout делает это:
@Override
protected void handleTimeout(AsyncResponse asyncResponse) {
//if scenario is continue createStillProcessingResponse
asyncResponse.resume(createStillProcessingResponse());
//if scenario is abort createAbortResponse
asyncResponse.resume(createAbortResponse());
}
protected Response createStillProcessingResponse() {
//build 'still processing' type of response
TimeoutResponseMessage message = new TimeoutResponseMessage();
message.setHttpStatus(100);
message.setCode("CONT");
message.setMessage("Still processing");
return Response.status(message.getHttpStatus()).type(MediaType.APPLICATION_JSON).entity(message).build();
}
Это всегда отправляет 200 ответа без ResponseBody, в то время как мне нужно для http продолжения (HTTP 100) с сообщением каквыше.
Во-вторых, это правильный способ отправить ответ, вызвав asyncResponse.resume?Также, если я позвоню отменить после тайм-аута, что произойдет потом.моя обработка будет отменена или она будет продолжена?Потому что, когда я вызываю сервер отмены, отправьте мне обратно сообщение Http 503. Недоступный ответ.
Есть ли полезная помощь при программной асинхронной обработке, потому что я чувствую, что упускаю несколько вещей, чтобы сделать мое решение надежным.