9

ग्राहक समय-समय पर एक एसिंक विधि (लंबी मतदान) कहता है, जो इसे स्टॉक प्रतीक का मान पास करता है, जो सर्वर डेटाबेस से पूछताछ करने के लिए उपयोग करता है और ऑब्जेक्ट को क्लाइंट पर वापस लौटाता है।वसंत के DeferredResult के साथ लंबे मतदान मतदान

मैं वसंत के DeferredResult कक्षा का उपयोग कर रहा हूं, हालांकि मैं इस बात से परिचित नहीं हूं कि यह कैसे काम करता है। ध्यान दें कि मैं नए डेटा के लिए डेटाबेस से पूछने के लिए प्रतीक संपत्ति (क्लाइंट से भेजा गया) का उपयोग कैसे कर रहा हूं (नीचे देखें)।

शायद वसंत के साथ लंबे मतदान के लिए एक बेहतर दृष्टिकोण है?

मैं विधि deferredResult() से 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

क्या आप परिणाम के लिए प्रतीक्षा करना चाहते हैं और इसे ग्राहक को वापस कर सकते हैं? यदि नहीं, तो बस शून्य वापस आओ। यदि हां, तो आप शायद भविष्य का बेहतर उपयोग कर सकते हैं क्योंकि आप बाद में जमा करने वाले थ्रेड से परिणाम निकाल सकते हैं। – Jan

उत्तर

7

वसंत 4.1.7 में DeferredResult:

उपवर्गों इस वर्ग आसानी से DeferredResult साथ अतिरिक्त डेटा या व्यवहार संबद्ध करने के लिए विस्तार कर सकते हैं। उदाहरण के लिए, कोई भी कक्षा को विस्तारित करके और उपयोगकर्ता के लिए अतिरिक्त संपत्ति जोड़कर DeferredResult बनाने के लिए उपयोग किए गए उपयोगकर्ता को जोड़ना चाहता है। इस तरह, मैपिंग करने के लिए डेटा संरचना का उपयोग किए बिना उपयोगकर्ता को बाद में आसानी से पहुंचा जा सकता है।

आप DeferredResult का विस्तार कर सकते हैं और प्रतीक फ़ील्ड को वर्ग फ़ील्ड के रूप में सहेज सकते हैं।

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); 
    } 
} 
संबंधित मुद्दे