Клиент периодически вызывает метод асинхронизации (длинный опрос), передавая ему значение символа запаса, который сервер использует для запроса базы данных и возврата объекта обратно клиенту.Длинный опрос с использованием 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);
}
}
Вы хотите дождаться результата и вернуть его клиенту? Если нет, просто верните нуль. Если да, вы, вероятно, лучше используете будущее, потому что впоследствии вы можете извлечь результат из подающего потока. – Jan