2016-08-08 14 views
18

मुझे वेबस्केट मैसेजिंग पर STOMP का उपयोग करके स्प्रिंग के साथ कार्यान्वित एक वेब एप्लिकेशन प्राप्त हुआ, जैसा कि here (बैकएंड पर RabbitMQ के साथ) का वर्णन किया गया है। यह टॉमकैट पर चलता है, और मैं नियमित यूआरएल (उदाहरण के लिए http://host/server/) का उपयोग कर एप्लिकेशन से कनेक्ट कर सकता हूं। मुझे डेमो क्लाइंट भी दिया गया - एक जेएसपीएक्स पेज, जो मॉडर्नइज़र वेबसाकेट्स और सॉकजेएस का उपयोग करता है। डेमो क्लाइंट में कनेक्शन कोड इस तरह दिखता है:जावा क्लाइंट से स्प्रिंग 4 का उपयोग करके लागू वेबस्केट पर स्टॉम्प से कनेक्ट करना

if (Modernizr.websockets) { 
    socket = new WebSocket('ws://host/server/endpointx'); 
} 
else { 
    socket = new SockJS('/server/endpointy'); 
} 

stompClient = Stomp.over(socket); 
stompClient.connect(headers, function(frame) { ... }); 
.... 

डेमो ग्राहक ठीक काम करता है (जब मैं ब्राउज़र में JSPX पृष्ठ लोड, मैं सर्वर से कनेक्ट कर सकते हैं)। लेकिन मेरा लक्ष्य कुछ जावा STOMP लाइब्रेरी का उपयोग कर उसी सर्वर से कनेक्ट करना है। समस्या यह है, पुस्तकालयों मैंने कोशिश की, मेजबान और कनेक्शन पैरामीटर के रूप में बंदरगाह आवश्यकता होती है: उदाहरण के लिए ActiveMQ Stomp library साथ: यदि मैं port61613 के रूप में, कनेक्शन सफल होता है निर्दिष्ट

StompConnection connection = new StompConnection(); 
connection.open("host", port); 
connection.connect(new HashMap<String, String>()); 

, लेकिन मैं RabbitMQ सीधे मारा, नहीं मेरी सर्वर (यह वही नहीं है जो मैं चाहता हूं)। अगर मैं 8080 (या 80) निर्दिष्ट करें, कनेक्शन पर मैं org.apache.activemq.transport.stomp पर java.io.DataInputStream.readByte (अज्ञात स्रोत) में एक त्रुटि

java.io.EOFException मिल .StompWireFormat.unmarshal (StompWireFormat.java:137) org.apache.activemq.transport.stomp.StompConnection.receive (StompConnection.java:77) पर org.apache.activemq.transport.stomp.StompConnection.receive पर (StompConnection .java: 68) org.apache.activemq.transport.stomp.StompConnection.connect (StompConnection.java:139) पर .... stomp.impl.activemq.ActiveMQStompDriver.connect (ActiveMQStompDriver.java:39) ... 25 अधिक

और ट्रेस पता चलता है कि इस वजह से CONNECT फ्रेम कभी नहीं प्राप्त करता है एक उम्मीद CONNECTED फ्रेम (वास्तव में, यह कुछ भी वापस प्राप्त नहीं होता है)।

तो मैं परेशान हूं: क्या मैं गलत बंदरगाह का उपयोग कर रहा हूं? या कुछ पुस्तकालय असंगतता से निपटने? या मुझे किसी भी तरह टोमकैट को इंगित करने की ज़रूरत है कि मैं upgrade HTTP connection to WebSockets करना चाहता हूं?

यदि उपरोक्त प्रश्न का उत्तर देना मुश्किल है, तो यह एक समान रूप से उपयोगी है: मैं जावा का उपयोग कर टॉमकैट पर चल रहे वेबसाकेट मैसेजिंग चैनल पर STOMP के साथ स्प्रिंग एप्लिकेशन से कैसे कनेक्ट करूं?

उत्तर

0

मुझे वेबस्केट मैसेजिंग पर STOMP का उपयोग करके वसंत के साथ लागू एक वेब एप्लिकेशन प्राप्त हुआ, जैसा कि यहां वर्णित है (बैकएंड पर खरगोश एमक्यू के साथ)। यह टॉमकैट पर चलता है, और मैं नियमित URL (उदा। http://host/server/) का उपयोग कर एप्लिकेशन से कनेक्ट कर सकता हूं।

यह सिर्फ बाद में जवाब में संदर्भ के लिए है:

Browser -> WebSocket -> Spring STOMP Broker Relay -> RabbitMQ 

काम कर उदाहरण अंत उपयोगकर्ता के ब्राउज़र में एक Javscript ग्राहक बनाता है। यह आपके ऐप में स्प्रिंग STOMP ब्रोकर रिले को आपके टॉमकैट सर्वर & पर वेबस्केट्स के माध्यम से जोड़ता है। रिले, जैसा कि इसके नाम से तात्पर्य है, एसटीओएमपी संदेशों को रीसेट करता है जो इसे वेब सॉकेट के माध्यम से वास्तविक सॉकेट में प्राप्त करता है जो कि खरगोश एमक्यू (एसटीओएमपी के माध्यम से भी) से जुड़ा होता है।

मुझे डेमो क्लाइंट भी दिया गया - एक जेएसपीएक्स पेज, जो मॉडर्नइज़र वेबसाकेट्स और सॉकजेएस का उपयोग करता है।

उत्तर के लिए प्रासंगिक नहीं है, लेकिन आपको यह जांचने की आवश्यकता नहीं है कि क्लाइंट ब्राउज़र में WebSockets समर्थित हैं या नहीं। सॉकजेएस आपके लिए यह करेगा और स्वचालित रूप से उपयोग करने के लिए सबसे अच्छा चैनल चुनें। किसी भी आधुनिक ब्राउज़र में एक प्रतिबंधक प्रॉक्सी के पीछे नहीं, यह वेबसाकेट होगा।

लेकिन मेरा लक्ष्य कुछ जावा STOMP लाइब्रेरी का उपयोग कर उसी सर्वर से कनेक्ट करना है। समस्या पुस्तकालयों मैंने कोशिश की, कनेक्शन के रूप में मानकों

मेजबान और बंदरगाह की आवश्यकता होती है मुझे शक है एक stomp जावा ग्राहक इस परिदृश्य में काम करने के लिए तैयार किया जा रहा है, है (हालांकि कुछ भी संभव है)। आम तौर पर, एक जावा स्टॉम्प क्लाइंट सर्वर की तरफ चलाने जा रहा है या कहीं कहीं यह सीधे आपके STOMP सर्वर से कनेक्ट होगा, जिसका मतलब है कि सीधे RabbitMQ से कनेक्ट करना होगा।

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

एक और समाधान जावा क्लाइंट का उपयोग करना होगा जो WebSockets & STOMP के माध्यम से संवाद करने में सक्षम है। मैं केवल इसकी अनुशंसा करता हूं यदि आपका जावा कोड किसी दूरस्थ ग्राहक के रूप में कहीं चल रहा है और उसे सीधे RabbitMQ से बात करने की पहुंच नहीं होगी।

तो मुझे परेशान है: क्या मैं गलत बंदरगाह का उपयोग कर रहा हूं? या कुछ पुस्तकालय असंगतता से निपटने? या क्या मुझे किसी भी तरह टोमकैट को इंगित करने की ज़रूरत है कि मैं वेब कनेक्शन को HTTP कनेक्शन अपग्रेड करना चाहता हूं?

61613 यदि आप ऐसा करना चाहते हैं तो सीधे खरगोश एमक्यू के साथ संवाद करने का सही बंदरगाह है। वेबस्केट कनेक्शन स्थापित करने के लिए पोर्ट केवल मानक HTTP या HTTPS पोर्ट है जिस पर टॉमकैट कनेक्शन के लिए सुन रहा है (डिफ़ॉल्ट 8080/8443 होगा)। आप सीधे टॉमकैट पर STOMP नहीं बोल सकते हैं, यह प्रोटोकॉल को समझ में नहीं आता है। आपको वेबस्केट कनेक्शन शुरू करना होगा और फिर अपने आवेदन पर STOMP बोलना होगा (यानी स्प्रिंग स्टॉम्प ब्रोकर रिले)।

ऐसा करने के लिए, आपको एक क्लाइंट की आवश्यकता है जो वेबसाकेट & क्लाइंट को बोलने के बारे में जानता है जो वेबसॉकेट चैनल पर STOMP बोल सकता है। आपका वर्तमान ग्राहक टॉमकैट को नियमित सॉकेट कनेक्शन बनाने का प्रयास कर रहा है, न कि वेबस्केट कनेक्शन। सफलतापूर्वक होने के लिए, इसे पहले वेबस्केट कनेक्शन शुरू करने की आवश्यकता होगी, फिर वेबसॉकेट कनेक्शन पर STOMP संदेश भेजें।

जब आपका डेमो ब्राउज़र में चलता है, तो वेबस्केट कनेक्शन आपके ब्राउज़र और सॉकजेएस द्वारा संभाला जाता है, और आपका जावास्क्रिप्ट STOMP क्लाइंट STOMP (ऊपर ASCII आरेख देखें) के माध्यम से ऐप के वेबस्केट कनेक्शन पर वार्तालाप करता है।

ऊपर सवाल का जवाब देने के लिए मुश्किल है, तो यह एक समान रूप से उपयोगी है: मैं कैसे चैनल जावा का उपयोग कर बिलाव पर चल रहे संदेश WebSockets पर stomp के साथ आवेदन वसंत के कनेक्ट करते हैं?

मुझे नहीं लगता कि आप आमतौर पर ऐसा करना चाहते हैं।यदि आपके पास टोमकैट पर जावा कोड चल रहा है, तो यह आपके जावा STOMP क्लाइंट के साथ सीधे RabbitMQ (यानी आपका STOMP सर्वर) से कनेक्ट करने के लिए अधिक कुशल होगा।

वेबस्केट्स पर STOMP मुख्य रूप से ऐसा है कि ब्राउज़र-आधारित क्लाइंट दूरस्थ रूप से चल रहे हैं आसानी से और सुरक्षित रूप से कनेक्ट और संदेश भेज सकते हैं बिना आपके RabbitMQ सर्वर तक सीधे पहुंच की आवश्यकता के।

आशा है कि मदद करता है!

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