Klient okresowo wywołuje metodę asynchroniczną (long polling), przekazując mu wartość symbolu giełdowego, którą serwer wykorzystuje do zapytania bazy danych i zwrócenia obiektu z powrotem do klienta.Long Polling z Spring DeferredResult
Używam klasy Spring DeferredResult, ale nie jestem zaznajomiony z jej działaniem. Zwróć uwagę, w jaki sposób używam właściwości symbolu (wysłanej z klienta), aby wysłać zapytanie do bazy danych o nowe dane (patrz poniżej).
Być może istnieje lepsze podejście do długiego sondowania ze Spring?
Jak przekazać właściwość symbolu z metody deferredResult()
do 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);
}
}
Czy chcesz poczekać na wynik i odesłać go do klienta? Jeśli nie, po prostu zwróć wartość null. Jeśli tak, prawdopodobnie lepiej użyj Future, ponieważ możesz później wyodrębnić wynik z wątku przesyłania. – Jan