9

Клиент периодически вызывает метод асинхронизации (длинный опрос), передавая ему значение символа запаса, который сервер использует для запроса базы данных и возврата объекта обратно клиенту.Длинный опрос с использованием Spring's DeferredResult

Я использую класс весны DeferredResult, однако я не знаком с тем, как он работает. Обратите внимание, как я использую свойство символа (отправленное от клиента) для запроса базы данных для новых данных (см. Ниже).

Возможно, существует лучший подход для длительного опроса с весной?

Как передать свойство символа из метода 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

Вы хотите дождаться результата и вернуть его клиенту? Если нет, просто верните нуль. Если да, вы, вероятно, лучше используете будущее, потому что впоследствии вы можете извлечь результат из подающего потока. – Jan

ответ

7

DeferredResult весной 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); 
    } 
}