2015-07-09 79 views
7

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

+0

这是我发布的问题之一。看看它.. http://stackoverflow.com/questions/29563475/null-pointer-exception-in-resteasy-asynchronous-request注:我仍然没有测试建议的答案是否工作.. –

回答

-3

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

但我的意见是,无论你使用春季课程或JAX-RS。但不是两种方法相同。

+0

The前两种方法不是异步的,在客户端可能是异步的(基于请求设置的类型),但它在后端完全同步,直到方法完成其执行。 OP公布的第三种方法是Real Server端异步处理的一个例子。 –