客户端定期调用异步方法(长轮询),向其传递一个股票代码的值,服务器使用该值来查询数据库并将对象返回给客户端。
我正在使用Spring的DeferredResult课程,但我不熟悉它的工作方式。请注意我如何使用symbol属性(从客户端发送)来查询数据库以获取新数据(见下文)。
使用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);
}
}
答案 0 :(得分:10)
https://wordpress.org/plugins/google-analytics-dashboard-for-wp/:
子类可以扩展此类,以便轻松地将其他数据或行为与DeferredResult相关联。例如,可能希望通过扩展类并为用户添加其他属性来关联用于创建DeferredResult的用户。通过这种方式,用户可以在以后轻松访问,而无需使用数据结构进行映射。
您可以扩展DeferredResult并将符号参数保存为类字段。
static class DeferredQuote extends DeferredResult<Quote> {
private final String symbol;
public DeferredQuote(String symbol) {
this.symbol = symbol;
}
}
@RequestMapping("/poll/{symbol}")
public @ResponseBody DeferredQuote deferredResult(@PathVariable("symbol") String symbol) {
DeferredQuote result = new DeferredQuote(symbol);
responseBodyQueue.add(result);
return result;
}
@Scheduled(fixedRate = 2000)
public void processQueues() {
for (DeferredQuote result : responseBodyQueue) {
Quote quote = jpaStockQuoteRepository.findStock(result.symbol);
result.setResult(quote);
responseBodyQueue.remove(result);
}
}