使用Spring + Jersey的异步API

gre*_*fox 7 spring asynchronous jersey spring-boot

我正在构建可能每秒可能有大量请求的API,而某些请求可能需要大量计算(复杂报告).我被要求组装一个小型原型作为概念证明.我使用带有Jersey的Spring Boot作为我的JAX-RS实现.在过去,我用Spring MVC做过类似的事情.

@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;
}
Run Code Online (Sandbox Code Playgroud)

我在泽西岛试过这个并且看起来很有用,或者至少它没有出错.

    @GET
    public DeferredResult<String> getClients() {
        DeferredResult<String> deferredResult = new DeferredResult<>();
        deferredResult.setResult("Nothing! But I'm Async!");
        return deferredResult;
    }
Run Code Online (Sandbox Code Playgroud)

但是,我在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");
      }
    });
}
Run Code Online (Sandbox Code Playgroud)

我的主要问题是幕后这三个代码片段之间的区别是什么,如果有的话.这些都会完成同样的事情吗?

有没有更好的方法来完成异步?我也看过在Java中使用Future,但从未使用它.

更新:

我的Jersey控制器中有以下代码,它们都在工作.

    @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();
    }
Run Code Online (Sandbox Code Playgroud)

这可以追溯到我的主要问题,这些有什么区别?我的理解是DeferredResult是一个Spring的东西所以不确定它是否适合与Jersey一起使用,尽管我使用的是Jersey + Spring.

Man*_*ane -3

你的理解是完全正确的。两者都在做同样的工作。但实现是不同的。DeferredResult 是 spring 实现。在您的代码库中,大部分都是 JAX-RS 实现。我不确定您是否得到第一服务的回复。

但我的观点是,要么使用 spring 类,要么使用 JAX-RS。但不是用同一种方法。