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?
显然有两个问题:
heavyLifting
方法作为AsyncResponse
参数的值提供什么?@Suspended
的方法的返回类型必须无效?另一个问题是如何处理服务方法中的异常。异常是否会自动恢复响应并返回相应的错误状态?