Запрос сразу после ответа?

Я немного запутался в следующем сценарии:

Мой веб-сервис использует запросы POST с данными формы. Я должен ответить 200 OK, иначе отправители сочтут запрос неудачным.

Сразу после ответа на 200 я хотел бы перейти к вызову другого веб-сервиса на удаленном хосте с некоторыми данными, которые я только что получил.

Мой веб-сервис использует запрос POST с аннотацией @GET. Это работает, я могу читать все данные формы. Чтобы вызвать другой веб-сервис, я использовал API-интерфейс Jersey Client. Это тоже отлично работает.

Я просто не могу понять, как переключиться с одного звонка на другой. Все запрограммировано на Jersey 2 и развернуто в Tomcat, так что настоящего сервера приложений нет. Полный стек Java EE недоступен.

Мне не хватает промежуточного программного обеспечения? Нужно ли мне реализовать собственный цикл событий или какой-нибудь брокер сообщений?


person raupach    schedule 04.11.2014    source источник


Ответы (1)


Не уверен, есть ли стандартный способ справиться с этим, но есть _ 1_, мы можем зарегистрироваться с помощью _ 2_.

CompletionCallback:

Обратный вызов обработки запроса, который получает события завершения обработки запроса.

Обратный вызов завершения вызывается, когда вся обработка запроса завершена, то есть после того, как ответ на запрос был обработан и отправлен обратно клиенту, или когда несопоставленное исключение или ошибка распространяется в контейнер.

AsyncResponse предназначен для асинхронной обработки запросов, но мы можем немедленно вызвать resume, чтобы обрабатывать его так, как будто он был синхронным. Простым примером может быть что-то вроде

@Path("/callback")
public class AsyncCallback {
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public void postWithAsync(@Suspended AsyncResponse asyncResponse,  
                                         SomeObject object) {

        asyncResponse.register(new CompletionCallback() {
            @Override
            public void onComplete(Throwable error) {
                if (error == null) {
                    System.out.println("Processing new Request");
                } else {
                    System.out.println("Exception in Request handling");
                }
            }
        });
        Response response = Response.ok("Success").build();
        // Carry on like nothing happened
        asyncResponse.resume(response);
    }
}

Дополнительные объяснения можно найти на странице Асинхронные обратные вызовы на стороне сервера

person Paul Samsotha    schedule 04.11.2014
comment
Спасибо! Я даже читал эту главу, но полностью упустил из виду эту часть. Просто попробовал. Это, наверное, все, что мне нужно. - person raupach; 05.11.2014