Ответ на веб-сервис на основе ответа, полученного от другого асинхронного веб-сервиса на 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
с любым ответом, который вы хотите отправить клиенту.
Смотрите также: