使用Spring的DeferredResult进行长轮询

客户端定期调用异步方法(长时间轮询),并向其传递一个股票代号的值,服务器使用该值来查询数据库并将对象返回给客户端。

我正在使用Spring的DeferredResult类,但是我不熟悉它的工作方式。请注意,我是如何使用symbol属性(从客户端发送的)来查询数据库中的新数据(请参见下文)。

也许有一种更好的方法可以对Spring进行长时间轮询?

如何将symbol属性从方法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);

}

}

回答:

Spring

4.1.7中的DeferredResult:

子类可以扩展此类,以轻松地将其他数据或行为与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);

}

}

以上是 使用Spring的DeferredResult进行长轮询 的全部内容, 来源链接: utcz.com/qa/428254.html

回到顶部