Программная обработка AsyncResponse на Джерси - PullRequest
0 голосов
/ 04 марта 2019

Я работаю на Джерси, используя программный 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 устанавливает значение времени ожидания).После истечения времени ожидания я должен сделать следующее:

  1. В случае, если сценарий настроен на продолжить после истечения времени ожидания Я отправляю http 100 Продолжить с пользовательским сообщением «Обработка еще»и оставь это этому.

  2. В случае, если сценарий настроен на 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. Недоступный ответ.
Есть ли полезная помощь при программной асинхронной обработке, потому что я чувствую, что упускаю несколько вещей, чтобы сделать мое решение надежным.

...