9

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); 
     } 
    } 
+0

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

Antwort

7

DeferredResult im Frühjahr 4.1.7:

Subklassen diese Klasse erweitern kann auf einfache Weise zusätzliche Daten oder Verhalten mit dem DeferredResult zu assoziieren. Zum Beispiel könnte man den Benutzer, der zum Erstellen des DeferredResult verwendet wird, assoziieren, indem man die Klasse erweitert und eine zusätzliche Eigenschaft für den Benutzer hinzufügt. Auf diese Weise könnte der Benutzer später leicht erreicht werden, ohne eine Datenstruktur für das Mapping verwenden zu müssen.

Sie können DeferredResult erweitern und den Symbolparameter als Klassenfeld speichern.

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); 
    } 
} 
Verwandte Themen