【发布时间】:2015-07-16 15:47:32
【问题描述】:
客户端定期调用异步方法(长轮询),向其传递股票代码的值,服务器使用该值查询数据库并将对象返回给客户端。
我正在使用 Spring 的 DeferredResult 类,但是我不熟悉它的工作原理。请注意我如何使用符号属性(从客户端发送)来查询数据库以获取新数据(见下文)。
也许有更好的方法来使用 Spring 进行长轮询?
如何将符号属性从方法deferredResult() 传递给processQueues()?
private final Queue<DeferredResult<String>> responseBodyQueue = new ConcurrentLinkedQueue<>();
@RequestMapping("/poll/{symbol}")
public @ResponseBody DeferredResult<String> deferredResult(@PathVariable("symbol") String symbol) {
DeferredResult<String> result = new DeferredResult<String>();
this.responseBodyQueue.add(result);
return result;
}
@Scheduled(fixedRate=2000)
public void processQueues() {
for (DeferredResult<String> result : this.responseBodyQueue) {
Quote quote = jpaStockQuoteRepository.findStock(symbol);
result.setResult(quote);
this.responseBodyQueue.remove(result);
}
}
【问题讨论】:
-
是否等待结果返回给客户端?如果不是,则返回 null。如果是,您可能最好使用 Future,因为您可以在之后从提交线程中提取结果。
标签: spring spring-mvc long-polling server-sent-events http-streaming