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