9

Il client chiama periodicamente un metodo async (polling lungo), passandogli un valore di un simbolo di serie, che il server utilizza per interrogare il database e restituire l'oggetto al client.Polling lungo con Spring's DeferredResult

Sto usando la classe DeferredResult di Spring, tuttavia non ho familiarità con il suo funzionamento. Si noti come sto usando la proprietà del simbolo (inviata dal client) per interrogare il database per i nuovi dati (vedi sotto).

Forse c'è un approccio migliore per il polling lungo con Spring?

Come si passa la proprietà del simbolo dal metodo deferredResult() a 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

Vuoi attendere il risultato e restituirlo al cliente? In caso contrario, basta restituire null. In caso affermativo, è preferibile utilizzare un futuro perché in seguito è possibile estrarre il risultato dal thread di invio. – Jan

risposta

7

DeferredResult nella primavera 4.1.7:

sottoclassi possono estendere questa classe per associare facilmente i dati o comportamenti aggiuntivi con l'DeferredResult. Ad esempio, si potrebbe voler associare l'utente utilizzato per creare DeferredResult estendendo la classe e aggiungendo una proprietà aggiuntiva per l'utente. In questo modo, l'utente potrebbe essere facilmente accessibile in seguito senza la necessità di utilizzare una struttura dati per eseguire la mappatura.

È possibile estendere DeferredResult e salvare il parametro symbol come campo di classe.

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); 
    } 
} 
Problemi correlati