响应基于从Java中的另一个异步Web服务接收的响应的Web服务

时间:2014-01-22 21:46:34

标签: java web-services rest jersey orchestration

我有一个要求,作为Web服务[Java]的一部分,我将作业的详细信息输入到数据库中,该服务由Windows服务[C#]异步处理,并对Java Web服务进行HTTP Restful调用通知工作状态。

情景:

  • 客户端对Java Web Service进行同步Restful调用。
  • Java Web Service将作业详细信息输入数据库(类似于进行异步调用),并等待Windows Service的响应(这是对Java Web Service的新HTTP请求)。
  • 根据收到的响应,Java Web Service需要回复正在等待同步调用的客户端。

我们如何在Java Web Service中实现这一目标?

编辑:我使用Jersey框架实现了restful web-service,并在Jetty服务器上运行。

1 个答案:

答案 0 :(得分:0)

根据您使用的Jersey和Jetty版本,您可以使用Servlet 3.0中添加的asynchronously handling requests支持。 (基于Jetty Wikipedia page,我相信你至少需要Jetty 8.x.基于this article,我相信你至少需要Jersey / JAX-RS 2.0。)

Jersey documentationJAX-RS API docs有关于如何异步(即在另一个线程中)完成未完成请求的示例:

@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对象,一旦您收到来自其他Web服务的响应,您可以通过调用resume来完成请求,并提供您想要的任何响应发送给客户。

另见:

What is the purpose of asynchronous JAX-RS

JAX-RS and Long Polling