【问题标题】:Async API using Spring + Jersey使用 Spring + Jersey 的异步 API
【发布时间】:2015-09-28 13:26:46
【问题描述】:

我正在构建每秒可能有大量请求的 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;
}

我在 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");
      }
    });
}

我的主要问题是这三个代码 sn-ps 在幕后有什么区别,如果有的话。这些都会完成同样的事情吗?

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

更新:

我的 Jersey Controller 中有以下代码,它们都可以正常工作。

    @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。

【问题讨论】:

  • 这是我发布的问题之一。看看它.. stackoverflow.com/questions/29563475/… 注意:我仍然没有测试建议的答案是否有效..
  • " new Thread(() -> {" 一个。我觉得它不好。我会创建越来越多的线程而不是重用现有的。

标签: spring asynchronous jersey spring-boot


【解决方案1】:

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

但我的意见是,要么使用 spring 类,要么使用 JAX-RS。但并非两者都采用相同的方法。

【讨论】:

  • 前两个方法不是异步的,它们在客户端可能是异步的(基于请求设置的类型),但在方法完成执行之前在后端是完全同步的。 OP发布的第三种方法是Real Server端异步处理的示例..
猜你喜欢
  • 2014-09-17
  • 1970-01-01
  • 2015-03-12
  • 2021-07-15
  • 1970-01-01
  • 2019-01-09
  • 2014-02-21
  • 1970-01-01
  • 2022-10-26
相关资源
最近更新 更多