Ответ на веб-сервис на основе ответа, полученного от другого асинхронного веб-сервиса на Java

У меня есть требование, когда в качестве части веб-службы [ Java ] я вводю сведения о задании в базу данных, которая асинхронно обрабатывается службой Windows [ C# ] и выполняет HTTP Restful-вызов веб-службы Java, уведомляя о состоянии работы.

Сценарий:

  • Клиент выполняет синхронный вызов Restful к веб-службе Java.
  • Веб-служба Java вводит сведения о задании в базу данных (подобно асинхронному вызову) и ожидает ответа от службы Windows (который является новым HTTP-запросом к веб-службе Java).
  • На основе полученного ответа веб-служба Java должна ответить клиенту, который ожидает синхронного вызова.

Как мы можем достичь этого в веб-сервисе Java?

РЕДАКТИРОВАТЬ: я реализовал успокоительный веб-сервис с использованием инфраструктуры Джерси и работает на сервере Jetty.

1 ответ

Решение

В зависимости от того, какие версии Jersey и Jetty вы используете, вы можете использовать поддержку асинхронной обработки запросов, добавленных в Servlet 3.0. (Основываясь на странице Jetty Wikipedia, я полагаю, что вам нужен как минимум Jetty 8.x. Основываясь на этой статье, я думаю, что вам нужен как минимум Jersey/JAX-RS 2.0.)

В документации на Джерси и в документации по API JAX-RS есть примеры того, как асинхронно (то есть в другом потоке) выполнить ожидающий запрос:

@Path("/resource")
public class AsyncResource {
    @GET
    public void asyncGet(@Suspended final AsyncResponse asyncResponse) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                String result = veryExpensiveOperation();
                asyncResponse.resume(result);
            }

            private String veryExpensiveOperation() {
                // ... very expensive operation
            }
        }).start();
    }
}

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

Смотрите также:

Какова цель асинхронного JAX-RS

JAX-RS и длинный опрос

Другие вопросы по тегам