Stomp

2015-03-22 5 views
6

खो क्लाइंट पक्ष जावास्क्रिप्ट मैंStomp

stomp.subscribe("/topic/path", function (message) { 
     console.info("message received"); 
    }); 

है और सर्वर साइड

public class Controller { 
    private final MessageSendingOperations<String> messagingTemplate; 
    @Autowired 
    public Controller(MessageSendingOperations<String> messagingTemplate) { 
     this.messagingTemplate = messagingTemplate; 
    } 
    @SubscribeMapping("/topic/path") 
    public void subscribe() { 
    LOGGER.info("before send"); 
    messagingTemplate.convertAndSend(/topic/path, "msg"); 
    } 
} 

इस स्थापना से, मैं कभी कभी एक बार लगभग 30 में हूँ (पर पृष्ठ रीफ्रेश) संदेश छोड़ने का अनुभव कर रहा है, जिसका अर्थ है कि मैं क्लाइंट पक्ष पर न तो "संदेश प्राप्त" संदेश देख सकता हूं और न ही क्रोम डीबगिंग टूल से वेबसाइकिल यातायात देख सकता हूं।

"भेजने से पहले" सर्वर पक्ष पर हमेशा लॉग होता है।

ऐसा लगता है कि संदेश भेजना तैयार नहीं है जब मैं इसे सदस्यता() विधि में कॉल करता हूं। (अगर मैंने थ्रेड स्लीप (50) रखा है; मैसेजिंग कॉल करने से पहले टेम्पलेट.कॉन्टर और भेजें भेजें समस्या गायब हो जाएगी (या पुन: उत्पन्न होने की संभावना कम होगी)

मुझे आश्चर्य है कि अगर किसी ने पहले ऐसा अनुभव किया है और यदि कोई ऐसा ईवेंट है जो मुझे बताओ MessageSendingOperations तैयार है या नहीं।

+0

डोमेन के तैयार होने के बाद stomp.subscribe निष्पादित है? –

+0

@ ᴳᵁᴵᴰᴼ हां। ये सही है। मैं वेबस्क्रिप्ट नेटवर्क यातायात के लिए क्रोम डीबगिंग से सब्सक्राइब संदेश भेजा गया देख सकता हूं। इसलिए मुझे क्लाइंट साइड समस्या नहीं है। – user2001850

उत्तर

4

जो समस्या आप सामना कर रहे हैं वह clientInboundChannel की प्रकृति में बिछा रही है जो डिफ़ॉल्ट रूप से ExecutorSubscribableChannel है।

यह 3 subscribers है:

0 = {[email protected]} "SimpleBroker[DefaultSubscriptionRegistry[cache[0 destination(s)], registry[0 sessions]]]" 
1 = {[email protected]} "UserDestinationMessageHandler[DefaultUserDestinationResolver[prefix=/user/]]" 
2 = {[email protected]} "SimpAnnotationMethodMessageHandler[prefixes=[/app/]]" 

जो taskExecutor भीतर लागू कर रहे हैं, इसलिए एसिंक्रोनस रूप से।

होने वाले पहले व्यक्ति (SimpleBrokerMessageHandler (या StompBrokerRelayMessageHandler) यदि आप broker-relay का उपयोग करें) topic के लिए subscription रजिस्टर करने के लिए जिम्मेदार है।

आपका messagingTemplate.convertAndSend(/topic/path, "msg") ऑपरेशन उस वेबसॉकेट सत्र के सदस्यता पंजीकरण से पहले किया जा सकता है, क्योंकि वे अलग-अलग धागे में किए जाते हैं। इसलिए ब्रोकर हैंडलर आपको सत्र में संदेश भेजने के लिए नहीं जानता है।

@SubscribeMappingreturn के साथ विधि पर कॉन्फ़िगर किया जा सकता है, जहां इस विधि का परिणाम क्लाइंट पर subscription फ़ंक्शन के उत्तर के रूप में भेजा जाएगा।

एचटीएच

+0

मेरी सब्सक्राइब विधि के अंदर, मैं असीमित रूप से सर्विस लेयर को कॉल करने योग्य था जैसे सब्सक्राइबर्स सर्विस.registerAndHandleWith (नया हैंडलर() {})। ताकि मैं इस विधि में तुरंत वापस नहीं आ सकूं। इस परिदृश्य में आप क्या सलाह देंगे? धन्यवाद। – user2001850

+0

'Future.get() 'या' countDownLatch' उस' रजिस्टर और हैंडल विथ 'से। दूसरी तरफ से आप 'SimpleBrokerMessageHandler' तक पहुंच सकते हैं और कुछ कस्टम' एप्लिकेशनवेन्ट 'को कुछ अन्य घटक से सुनने के लिए' एडस्क्रिप्शन इन्टरनेट 'को ओवरराइड करने के लिए' डिफॉल्टस्क्रिप्शन रजिस्ट्री 'के अपने कस्टम इम्प्लेक्ट को पॉप्युलेट कर सकते हैं ताकि किसी अन्य घटक से इसे सुन सकें, जब उस संदेश को विषय पर भेज दिया जाए, 'सदस्यता 'पहले से ही होगी। यह मामले के लिए है, जब आपको वास्तव में एसिंक सामग्री की आवश्यकता होती है और उस 'भविष्य' के लिए प्रतीक्षा करने के लिए 'clientInboundChannel' निष्पादक को अधिभारित नहीं किया जाता है। –

+1

धन्यवाद फिर से आर्टम, मुझे लगता है कि मैं मौजूदा सत्र सदस्यता का उपयोग नहीं कर सकता क्योंकि यह केवल मुझे बताता है कि ग्राहक ने अनुरोध किया है लेकिन इसका मतलब यह नहीं है कि सदस्यता पंजीकरण पूरा हो गया है (सत्र सदस्यता की तरह कुछ अच्छा होगा ** डी * * इवेंट)। – user2001850

0

थोड़ा देर हो गई लेकिन मैंने सोचा कि मैं अपना समाधान जोड़ूंगा। मैसेजिंग टेम्पलेट के माध्यम से डेटा भेजने से पहले मुझे पंजीकृत होने वाली सदस्यता के साथ एक ही समस्या हो रही थी। यह समस्या DefaultSubscriptionRegistry के साथ दौड़ की वजह से शायद ही कभी और अप्रत्याशित हो गई।

दुर्भाग्यवश, मैं केवल @SubscriptionMapping की वापसी विधि का उपयोग नहीं कर सका क्योंकि हम एक कस्टम ऑब्जेक्ट मैपर का उपयोग कर रहे थे जो उपयोगकर्ता के प्रकार (विशेषता फ़िल्टरिंग अनिवार्य रूप से) के आधार पर गतिशील रूप से बदल गया था।

मैंने स्प्रिंग कोड के माध्यम से खोज की और SubscriptionMethodReturnValueHandler सदस्यता मैपिंग के वापसी मूल्य भेजने के लिए ज़िम्मेदार था और मेरे एसिंक नियंत्रक के स्वचालित SimpMessagingTemplate की तुलना में एक अलग संदेश थाम्प्लेट !!

तो समाधान मेरे एसिंक नियंत्रक में MessageChannel clientOutboundChannel को स्वचालित रूप से स्वचालित कर रहा था और इसका उपयोग SimpMessagingTemplate बनाने के लिए किया गया था।(आप सीधे इसे तार नहीं कर सकते क्योंकि आप ब्रोकर को टेम्पलेट जा रहे हैं)।

सदस्यता विधियों में, मैंने तब प्रत्यक्ष टेम्पलेट का उपयोग किया, जबकि अन्य तरीकों से मैंने ब्रोकर में गए टेम्पलेट का उपयोग किया।

संबंधित मुद्दे