【问题标题】:Long Polling with Spring's DeferredResult使用 Spring 的 DeferredResult 进行长轮询
【发布时间】: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


【解决方案1】:

DeferredResult 在 Spring 4.1.7 中:

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

【讨论】:

    猜你喜欢
    • 2015-10-19
    • 1970-01-01
    • 2017-05-15
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    相关资源
    最近更新 更多