CXF代理客户端和@Suspended AsyncResponse

时间:2017-03-16 21:37:02

标签: java spring asynchronous jax-rs cxf-client

使用JAX-RS 2.0长时间运行的服务端点的

I recently learned可以使用@Suspended注释和AsyncResponse为传入请求释放资源,而实际工作在后台完成。所有客户端示例 - 至少是我到目前为止找到的示例 - 要么直接调用这些端点(普通的http-call),要么使用JAX-RS客户端API。但是我无法弄清楚如何在基于代理的API中使用它。

给定使用@Suspended的REST端点:

public interface HeavyLiftingService {
  @GET
  @Path("/heavylifting")
  public void heavyLifting(@Suspended final AsyncResponse aResponse);
}

使用Spring实现它:

@Component
public class HeavyLiftingServiceImpl implements HeavyLiftingService {
  @Override
  @Async
  public void heavyLifting(@Suspended final AsyncResponse aResponse) {
    final Result result = doHeavyLifting();
    aResponse.resume(result);
  }
}

一个基于代理的客户端,想要获得结果:

HeavyLiftingService proxy = JAXRSClientFactory.create("https://some-server.xyz", HeavyLiftingService.class);
proxy.heavyLifting(null); // what to put in here?
Result result = null; // how can I get the result?

显然有两个问题:

  1. 我需要将heavyLifting方法作为AsyncResponse参数的值提供什么?
  2. 我如何获得结果,因为使用@Suspended的方法的返回类型必须无效?
  3. 另一个问题是如何处理服务方法中的异常。异常是否会自动恢复响应并返回相应的错误状态?

0 个答案:

没有答案