使用Spring + Jersey的异步API



我正在构建每秒可能有大量请求的API,其中一些请求可能需要大量计算(复杂的报告)。我被要求制作一个小型原型作为概念验证。我使用Spring Boot与Jersey作为我的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;
}

我用Jersey尝试了这个,似乎可以工作,或者至少它没有抛出错误。

    @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的用法,但从未使用过。

更新:

我有以下代码在我的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();
    }

这又回到了我的主要问题,它们之间的区别是什么?我的理解是DeferredResult是一个Spring的东西,所以不确定是否适合与Jersey一起使用,虽然我正在使用Jersey + Spring。

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

但我的意见是,要么使用spring类,要么使用JAX-RS。但不是用同样的方法。

最新更新