2017-06-09 18 views
10

मैं निम्नलिखित js कोड:सदस्यता की प्रतीक्षा कैसे करें?

stompClient.subscribe('/topic/clients', function (calResult) { 
    updateClientsTable(JSON.parse(calResult.body)); 
}); 
$.get("/clients", null); 

और निम्न सर्वर कोड (अंतिम पंक्ति यह आह्वान):

@GetMapping(value = {"/clients"}) 
@ResponseBody 
public void loadClients() { 
     brokerMessagingTemplate.convertAndSend("/topic/clients", clientService.getClientList()); 
} 

कुछ समय सामने के अंत $.get("/clients", null);

का परिणाम याद करते हैं मैं समस्या को समझने के रूप में : परिणामस्वरूप पल के अंत में, सब्सक्रिप्शन नहीं होता है।

कोड में नीचे $.get("/clients", null); डालने के लिए - सभी ठीक काम करता है।

क्या आप समझाए गए सदस्यता की प्रतीक्षा कैसे कर सकते हैं?

+0

मुझे लगता है कि आपके पास पहले से ही एक कार्यरत स्टॉम्प कनेक्शन स्थापित है।कनेक्ट() लेकिन बाद की सदस्यता संदेश प्राप्त करने में विफल रहता है जब तक आप एक बार मेजबान से पूछताछ नहीं करते? STOMP "सफल" सदस्यता के लिए कॉलबैक प्रदान नहीं करता है। – DooMMasteR

+0

यह दृढ़ता से पुन: पेश नहीं करता है। मुझे वाक्यांश समझ में नहीं आया: ** जब तक आप एक बार मेजबान से पूछताछ नहीं करते ** – gstackoverflow

उत्तर

1

मुझे लगता है कि यह इस संदेश पैटर्न के साथ आरईएसटी अनुरोधों को मिश्रण न करने के लिए और अधिक समझदारी होगी।

क्या आपने सॉकजेएस के माध्यम से "अपडेट/एलिमेंट्स क्लाइंट" चैनल में "अपडेट क्लाइंट्स" कमांड भेजने पर विचार किया है जो "/ विषय/क्लाइंट" चैनल को प्रतिसाद देता है?

2

जैसा कि @ light_303 पहले ही उल्लेख किया गया है, अधिसूचना तंत्र के साथ HTTP अनुरोधों को मिलाकर अच्छा नहीं है। क्लाइंट कनेक्ट होने पर आप पल पंजीकृत कर सकते हैं (/clients पर अनुरोध प्राप्त करें), लेकिन डिस्कनेक्ट होने पर आप पंजीकरण नहीं कर सकते।

आपको अगले तरीकों में से एक में सोचना चाहिए। उपयोगकर्ता /topic/clients का सदस्य बनता है:

  1. आप व्यक्तिगत रूप से उसे सभी ग्राहकों की सूची के साथ प्रतिक्रिया भेजने और उसके बाद ही अपडेट धक्का।
  2. आप व्यक्तिगत रूप से उसे वर्तमान सर्वर समय या किसी प्रकार की आईडी भेजते हैं और फिर केवल अपडेट को पुश करते हैं। उपयोगकर्ता /clients पर GET अनुरोध में दिए गए समय/आईडी का उपयोग करता है और उस पल पर पूर्ण ग्राहक सूची प्राप्त करता है। यह विकल्प स्थिति में अच्छा हो सकता है, जब आपके पास वृद्धिशील अपडेट होते हैं (i। ई। सूची में नए तत्व जोड़ना) और अन्यथा इतना अच्छा नहीं है।

इस प्रश्न को जांचें: Sending message to specific user on Spring Websocket

यह वास्तव में हास्यास्पद है, कैसे वसंत चीजों को जटिल बना सकता है। मैं आपको रीयल-टाइम वेब संचार, जैसे वर्ट.एक्स या नेटटी और गो प्रोग्रामिंग भाषा के लिए एक और ढांचे को देखने की सलाह देता हूं। STOMP के बजाय WebSockets या SockJS का उपयोग करें। सभी तकनीकें आपको स्पष्ट तरीके से अधिक लचीला और प्रदर्शन समाधान दे सकती हैं। साथ ही, Centrifugo प्रोजेक्ट की जांच करें, शायद यह आपके कार्य के लिए प्रासंगिक है।

0

आप spring-messaging से @SubscribeMapping एनोटेशन का उपयोग कर सकते हैं।

आप spring-messaging कॉन्फ़िगर किया गया के रूप में वर्णित here और here है, तो सर्वर-साइड कोड ऐसा दिखाई दे सकता है:

@Controller 
public class MessagingController { 
    @SubscribeMapping("/clients") 
    public List<Client> loadClients() { 
     return clientService.getClientList(); 
    } 
} 

इस तरह आप क्योंकि जे एस संदेश हैंडलर का परिणाम प्राप्त करता है $.get("/clients", null); कॉल करने के लिए की जरूरत नहीं है सदस्यता के बाद सही कॉल करें। जेएस कोड इस तरह दिखेगा:

stompClient.subscribe('/topic/clients', function (calResult) { 
    updateClientsTable(JSON.parse(calResult.body)); 
}); 
संबंधित मुद्दे