在回复后立即要求?

时间:2014-11-04 15:12:02

标签: java jersey jax-rs jersey-2.0 jersey-client

我对以下情况感到有点迷茫:

我的网络服务使用表单数据消耗POST请求。我必须回复200 OK,否则发件人认为请求失败了。

在回答200之后,我想立即使用我刚收到的一些数据在远程主机上拨打另一个网络服务。

我的webservice使用带有@GET注释的POST请求。这工作我可以阅读所有表格数据。要调用其他Web服务,我使用了Jersey Client API。这也很好。

我无法弄清楚如何从一个呼叫切换到另一个呼叫。所有东西都用Jersey 2编程并部署在Tomcat中,所以没有真正的Application Server。没有完整的Java EE堆栈可用。

我错过了一些中间件吗?我是否需要实现自定义事件循环或某些消息代理?

1 个答案:

答案 0 :(得分:1)

不确定是否有任何"标准" 方式来处理此问题,但我们可以CompletionCallback注册AyncResponse Asynchronous Server-side Callbacks 3}}。

  

<强> 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);
    }
}

您可以在{{3}}

看到更多解释