Der Client ruft regelmäßig eine asynchrone Methode (Long Polling) auf und übergibt ihm den Wert eines Aktiensymbols, mit dem der Server die Datenbank abfragt und das Objekt an den Client zurücksendet.Long Polling mit Spring DeferredResult
Ich verwende Spring DeferredResult Klasse, aber ich bin nicht vertraut mit, wie es funktioniert. Beachten Sie, wie ich die Symboleigenschaft (vom Client gesendet) verwende, um die Datenbank nach neuen Daten abzufragen (siehe unten).
Vielleicht gibt es einen besseren Ansatz für lange Umfrage mit Spring?
Wie übergebe ich die Symboleigenschaft von der Methode deferredResult()
an 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);
}
}
Möchten Sie auf das Ergebnis warten und es an den Client zurückgeben? Wenn nicht, gib einfach null zurück. Wenn ja, verwenden Sie wahrscheinlich besser ein Future, da Sie das Ergebnis anschließend aus dem übergebenden Thread extrahieren können. – Jan