我正在构建可能每秒有大量请求的API,并且某些请求可能需要大量计算(复杂报告)。我被要求将一个小原型作为概念证明。我将Jersey Boot和Jersey一起用作我的JAX-RS实现。在过去,我使用Spring MVC做了这样的事情。使用Spring + Jersey的异步API
@RequestMapping(value = "/dashboard", method = RequestMethod.GET)
public DeferredResult<String> showDashboard(Model model) {
DeferredResult<String> result = new DeferredResult<>();
model.addAttribute("testObj", new User());
result.setResult("home/dashboard");
return result;
}
我试过这个与泽西岛和似乎工作,或者至少它没有抛出一个错误。
@GET
public DeferredResult<String> getClients() {
DeferredResult<String> deferredResult = new DeferredResult<>();
deferredResult.setResult("Nothing! But I'm Async!");
return deferredResult;
}
然而,我看到在Jersey中异步处理操作的所有例子都是这样的。
Produces(MediaType.TEXT_PLAIN)
public void get(@Suspended final AsyncResponse response) {
// This call does not block.
client.callExternalService(
// This callback is invoked after the external service responds.
new Callback<string>() {
public void callback(String result) {
response.resume("Result: " + result + ".n");
}
});
}
我的主要问题是这三个代码片段在幕后有什么区别,如果有的话。这些都会完成同样的事情吗?
有没有更好的方法来完成异步?我也看到了Java中Future的使用,但从未使用它。
UPDATE:
我在新泽西控制器下面的代码是所有工作。
@GET
public String getClients() {
return "Nothing, I'm Sync!";
}
@GET
@Path("/deferred")
public DeferredResult<String> getClientsAsync() {
DeferredResult<String> deferredResult = new DeferredResult<>();
deferredResult.setResult("Nothing! But I'm Async!");
return deferredResult;
}
@GET
@Path("/async")
public void getClientsJAXRSAsync(@Suspended AsyncResponse response) {
new Thread(() -> {
response.resume("I am Async too! But I am using @Suspended");
}).start();
}
回到我的主要问题,这些有什么区别?我的理解是DeferredResult是Spring的东西,所以不确定它是否适合与Jersey一起使用,虽然我使用的是Jersey + Spring。
这是我发布的问题之一。看看它.. http://stackoverflow.com/questions/29563475/null-pointer-exception-in-resteasy-asynchronous-request注:我仍然没有测试建议的答案是否工作.. –