2017-02-21 14 views
14

से कनेक्ट करने के लिए आवेदन में आईबीएम एमक्यू क्लाइंट जार का उपयोग करते समय कोई प्रतिक्रिया नहीं है मैं जिस एप्लिकेशन पर काम कर रहा हूं उसे दूरस्थ स्थान पर एक आईबीएम एमक्यू सर्वर से संवाद करने की आवश्यकता है। वर्तमान में हमारे पास सक्रिय एमक्यू का उपयोग कर एक कार्य प्रणाली है जो ब्रोकर का उपयोग करती है, और इस रिमोट आईबीएम एमक्यू सर्वर से कनेक्ट करने के लिए एक पुल है और ठीक काम कर रही है।आईबीएम एमक्यू सर्वर

कुछ नए संवर्द्धन के कारण, अब हम सक्रिय एमक्यू के बजाय आईबीएम क्लाइंट जार का उपयोग करके इसे प्राप्त करने की कोशिश कर रहे हैं।

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

पुराना सक्रिय एमक्यू दूरस्थ रूप से रिमोट आईबीएम एमक्यू सर्वर से कनेक्ट करने के लिए पुल का उपयोग करता है जो कि मैं जिस नए कोड का उपयोग कर रहा हूं, ठीक उसी तरह कॉन्फ़िगर किया गया है।

मैंने इंटरनेट से कई कोडों की कोशिश की है और खुद को ओवरफ्लो ढेर कर दिया है और हमेशा मैं कनेक्ट करने में सक्षम हूं लेकिन कोई प्रतिक्रिया नहीं प्राप्त कर रहा हूं।

इसके अलावा, मुझे दूरस्थ आईबीएम एमक्यू भेजने या प्राप्त करने का प्रयास करते समय कोई त्रुटि या अपवाद नहीं मिलता है।

मैं एक नमूना कोड पेस्ट करूंगा जिसे मैं काम करने की कोशिश कर रहा हूं। मैंने कोड में कुछ कॉन्फ़िगरेशन मान बदल दिए हैं।

मेरे संदेह निम्नलिखित हैं।

  1. सभी मैं इस के लिए कर रहा हूँ आवेदन में आईबीएम MQ ग्राहक जार को कॉपी करने और दूरदराज के MQ के लिए संदेश भेजने के लिए कोड का उपयोग कर रहा है। मैंने कोई अन्य एप्लिकेशन इंस्टॉल नहीं किया है। क्या ऐसी प्रणाली काम करेगी या हमेशा सक्रिय एमक्यू जैसे कुछ मध्यवर्ती कार्यक्रम होना चाहिए?

  2. एक ही कोड आईबीएम एमक्यू सर्वर से भेजने और प्राप्त करने में सक्षम है जिसे मैंने अपने स्थानीय नेटवर्क में स्थापित किया है लेकिन रिमोट सर्वर से प्रतिक्रिया प्राप्त करने में विफल रहता है? अगर मुझे कॉन्फ़िगरेशन में कुछ याद आ रहा है तो इससे मुझे विश्वास होता है? कोड के अलावा कुछ और कॉन्फ़िगर किया जाना चाहिए?

  3. मुझे कोई त्रुटि या अपवाद नहीं दिखता है। हमेशा संदेश भेजा जाता है लेकिन प्रतिक्रिया शून्य है। मैंने किसी भी उपयोगकर्ता नाम-पासवर्ड या सार्वजनिक-निजी कुंजी प्रमाणीकरण का उपयोग नहीं देखा है। क्या स्रोत की जांच करने के लिए सामान्य रूप से उपयोग किया जाने वाला कोई प्रमाणीकरण है। ?

  4. मैं आईबीएम एमक्यू क्लाइंट 5.3 संस्करण का उपयोग कर रहा हूं जो मुझे पता है पुराना है। लेकिन इसका उपयोग किया जाता है क्योंकि वे सक्रिय एमक्यू सेटअप काम करते हैं, वही काम करते हैं और सही तरीके से काम कर रहे हैं। मुझे यह जानने का कोई तरीका नहीं है कि रिमोट मशीन पर आईबीएम एमक्यू सर्वर पर कौन सा संस्करण मौजूद है। अगर हम सर्वर एमक्यू संस्करण के संस्करण की तुलना में एक अलग क्लाइंट एमक्यू संस्करण का उपयोग करते हैं तो क्या कोई समस्या है। ?

नमूना कोड जो स्थानीय पर्यावरण यानी में मेरे लिए काम करता एक आईबीएम MQ सर्वर मैं स्थानीय नेटवर्क में एक और मशीन में स्थापित किया है से भेजने और प्राप्त करने में सक्षम है। जब मैं रिमोट आईबीएम एमक्यू सर्वर के साथ इसका उपयोग करने की कोशिश कर रहा हूं तो वही कोड शून्य प्रतिक्रिया प्राप्त करेगा।

import javax.jms.*; 
import javax.jms.JMSException; 
import com.ibm.mq.jms.*; 
import com.ibm.jms.JMSMessage; 
import javax.jms.TextMessage; 

public class SendReceive { 
    private MQQueueConnectionFactory connectionFactory; 
    private MQQueueConnection connection; 

    private void runTest() { 
     try { 
      connect(); 
      connection.start(); 
      MQQueueSession session = (MQQueueSession) connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); 
      MQQueue queue = (MQQueue) session.createQueue("INBOUND_QUEUE");  /* values replaced with correct values in deployment server */ 
      MQQueue queue2 = (MQQueue) session.createQueue("OUTBOUND_QUEUE"); /* values replaced with correct values in deployment server */ 
      MQQueueSender sender = (MQQueueSender) session.createSender(queue);  

      MQQueueReceiver receiver = (MQQueueReceiver) session.createReceiver(queue2); 

      //TextMessage message = session.createTextMessage("yesyesyes"); 
      String stt = "Test Message";  // 

      TextMessage message = session.createTextMessage(stt); 
      message.setJMSReplyTo(queue2); 
      sender.send(message); 
      System.out.println("Sent: " + message); 

      Message msg1 = receiver.receive(5000); 
      if(msg1!=null){ 
       String responseMsg = ((TextMessage) msg1).getText(); 
       System.out.println("Received: " + responseMsg); 
      }else{ 
       System.out.println("Message received is null"); 
      } 
     }catch(Exception e){ 
      System.out.println("Exception caught in program : " + e); 
      e.printStackTrace(); 
     } 
    } 

    public boolean connect() { 
     boolean connected = false; 
     try { 
      /* values below are replaced with correct values in deployment server */ 

      connectionFactory = new MQQueueConnectionFactory();    
      connectionFactory.setPort(1515); 
      connectionFactory.setHostName("192.168.1.23"); // 
      connectionFactory.setQueueManager("QCCMGR"); 
      connectionFactory.setChannel("QCHANNEL");    
      connectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP); 

      connection = (MQQueueConnection) connectionFactory.createQueueConnection(); 
      connected = true; 
     } catch (Exception e) { 
      connected = false; 
     } 
     return connected; 
    } 

    public static void main(String[] args) { 
     new SendReceive().runTest(); 
    } 

} 
+0

@JoshMc नमूना प्रोग्राम उसी उपयोगकर्ता पर समान कॉन्फ़िगरेशन के साथ उसी मशीन पर चलाया जाता है। जब मैं भेजने या प्राप्त करने के लिए कनेक्ट करने का प्रयास करता हूं तो यह एक त्रुटि या अपवाद देता है। जिस रिमोट सिस्टम को मैं संदेश भेज रहा हूं वह उस कंपनी के स्वामित्व में नहीं है जिसके लिए मैं काम कर रहा हूं, इसलिए मेरे पास यह जांचने का कोई तरीका नहीं है कि वे इसे प्राप्त करते हैं या नहीं। लेकिन रिमोट सर्वर सक्रिय एमक्यू पुल से भेजे गए संदेशों को प्रतिक्रिया देता है जो एमक्यू 5.3 जार का उपयोग करता है। मैंने 5.3 का उपयोग करने का कारण केवल इसलिए किया है क्योंकि पुरानी कार्य प्रणाली इसका उपयोग कर रही थी। मैं नए संस्करण को आजमाने का इरादा रखता हूं, लेकिन किसी भी तरह मुझे लगता है कि मुझे कुछ चरण या कॉन्फ़िगरेशन याद आ रही है – Raj

+0

@ जोशएमसी भी पुराना सक्रिय एमक्यू पुल सेटअप दो प्रोग्रामों को भेजने के लिए एक और एक प्राप्त करने के लिए उपयोग करता है। अगर मैं पुराने एसीव एमक्यू पुल सेटअप का उपयोग भेजता हूं तो मुझे यकीन है कि संदेश रिमोट तक पहुंचता है। मैंने पुराने सिस्टम का उपयोग करके भेजने की कोशिश की है और फिर मेरे नमूना कार्यक्रम का उपयोग करके प्रतिक्रिया प्राप्त करने का प्रयास किया है। फिर भी मुझे प्रतिक्रिया के रूप में खाली या शून्य मूल्य मिलता है। लेकिन यदि मैं उसके बाद प्राप्त करने के लिए पुराना पीजीएम चलाता हूं, तो मुझे संदेश भेजा गया संदेश का जवाब मिलेगा जिसका मतलब है कि रिमोट कतार में संदेश मौजूद था लेकिन किसी कारण से मेरे पास नहीं भेजा गया है नमूना पीजीएम। ऐसा क्यों होता है मैं समझने में सक्षम नहीं हूं। – Raj

+0

@ जोशएमसी पुरानी प्रणाली 5 सेकंड का उपयोग करती है। मैंने 10,15,30 सेकेंड के साथ प्रयास किया है लेकिन अभी भी प्रतिक्रिया के रूप में केवल शून्य प्राप्त होता है, इसलिए मुझे नहीं लगता कि टाइम आउट एक मुद्दा है।मैंने भाग भेजने और केवल प्रोग्राम का हिस्सा प्राप्त करने के लिए कोड पर टिप्पणी करने का प्रयास किया है, लेकिन कनेक्ट होने पर फिर से कोई त्रुटि नहीं है लेकिन प्रतिक्रिया शून्य है। – Raj

उत्तर

2

एमक्यू v5.3 2 9 नवंबर 2002 को जारी किया गया था और 28 सितंबर 2007 (लगभग 9 साल) के बाद से समर्थन से बाहर हो गया है। संस्करण में आपके मुद्दे के साथ कुछ भी नहीं हो सकता है लेकिन मैं दृढ़ता से सुझाव दूंगा कि आप एमक्यू क्लाइंट के समर्थित संस्करण पर जाएं। नए एमक्यू क्लाइंट संस्करण पुराने एमक्यू कतार प्रबंधकों से जुड़ सकते हैं।आप एक जावा केवल नीचे दिए गए लिंक पर 9.0 जार फ़ाइलों MQ 8.0 या MQ के स्थापित डाउनलोड कर सकते हैं:


मैं कुछ पुराने धागे पर पढ़ा है कि इस होने और उसी सत्र में रिसीवर ने टाइमआउट निर्दिष्ट होने पर समस्याएं उत्पन्न कीं। रिसीवर के लिए एक और सत्र जोड़ने का प्रयास करें।

private void runTest() { 
     try { 
      connect(); 
      connection.start(); 
      MQQueueSession session = (MQQueueSession) connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); 
      MQQueueSession session2 = (MQQueueSession) connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); 
      MQQueue queue = (MQQueue) session.createQueue("INBOUND_QUEUE");  /* values replaced with correct values in deployment server */ 
      MQQueue queue2 = (MQQueue) session2.createQueue("OUTBOUND_QUEUE"); /* values replaced with correct values in deployment server */ 
      MQQueueSender sender = (MQQueueSender) session.createSender(queue);  

      MQQueueReceiver receiver = (MQQueueReceiver) session2.createReceiver(queue2); 

      //TextMessage message = session.createTextMessage("yesyesyes"); 
      String stt = "Test Message";  // 

      TextMessage message = session.createTextMessage(stt); 
      message.setJMSReplyTo(queue2); 
      sender.send(message); 
      System.out.println("Sent: " + message); 

      Message msg1 = receiver.receive(5000); 
      if(msg1!=null){ 
       String responseMsg = ((TextMessage) msg1).getText(); 
       System.out.println("Received: " + responseMsg); 
      }else{ 
       System.out.println("Message received is null"); 
      } 
     }catch(Exception e){ 
      System.out.println("Exception caught in program : " + e); 
      e.printStackTrace(); 
     } 
    } 

जावा अनुप्रयोग के निष्पादन के लिए निम्न को जोड़कर एक JMS निशान लेने की कोशिश करें:

-DMQJMS_TRACE_LEVEL=base 
-DMQJMS_TRACE_DIR=/tracedirectory 

पूर्व: java -DMQJMS_TRACE_LEVEL=base -DMQJMS_TRACE_DIR=/tracedirectory JavaApp

यह एक फ़ाइल है कि मैं समाप्त होता है का मानना ​​है कि उत्पादन करना चाहिए आपके द्वारा निर्दिष्ट निर्देशिका में .trc में।

आप इसकी त्रुटियों के लिए समीक्षा कर सकते हैं जो आपको सही दिशा में इंगित करने में मदद कर सकते हैं।


सुझाव:

connection = (MQQueueConnection) connectionFactory.createQueueConnection("", ""); 

इस बंद करने की कोशिश के बाद sender.send

sender.close(); 

कहा जाता है:

अपने कार्यक्रम के एक खाली उपयोगकर्ता नाम भेजने के लिए इसका मजबूर करने के लिए परिवर्तित करने का प्रयास

आगे की जानकारी के साथ कारण निर्धारित करना मुश्किल है। अधिक जानकारी आप बेहतर इकट्ठा कर सकते हैं।

+0

मैंने रिसीवर केवल उन कार्यक्रमों का प्रयास किया है जहां सत्र केवल प्राप्त करने के लिए उपयोग किया जाता है, इसलिए ऐसा कोई समस्या नहीं है। लेकिन निश्चित रूप से यह एक कोशिश दे देंगे। – Raj

+0

मुझे केवल एक सप्ताह या उसके बाद ही तैनाती प्रणाली तक पहुंच प्राप्त होगी क्योंकि या वहां कुछ अन्य काम चल रहे हैं। मैं तब एक निशान पाने की कोशिश करूंगा। और मुझे यकीन है कि प्रतिक्रिया प्राप्त करने वाला कोई अन्य ऐप कनेक्ट नहीं है। अगर मैं पुरानी प्रणाली का उपयोग भेजता हूं और नई प्रणाली का उपयोग करने का प्रयास करता हूं, तो कोई प्रतिक्रिया नहीं, लेकिन उसके बाद अगर मैं पुरानी प्रणाली प्राप्त करने की कोशिश करता हूं, तो मुझे प्रतिक्रिया मिल जाएगी। तो रिमोट कतार में प्रतिक्रिया थी लेकिन नई प्रणाली को नहीं भेजा गया था या कुछ कारणों से पारगमन में खो जाना था। – Raj

+0

@राज मुझे लगता है कि ये दो चीजें एक अच्छा संकेत प्रदान करती हैं कि न तो भेजना या प्राप्त करना काम कर रहा है। 1. पुरानी प्रणाली से भेजें, और नई प्रणाली से प्राप्त करने का प्रयास करें, कोई प्रतिक्रिया नहीं, पुराने सिस्टम रिसीवर शुरू करें और संदेश मौजूद है। 2. नई प्रणाली से भेजें, पुराने सिस्टम रिसीवर द्वारा कुछ भी प्राप्त नहीं होता है। – JoshMc

0

यह कुछ नेटवर्क से संबंधित कॉन्फ़िगरेशन समस्या हो सकता है या शायद विंडोज मैसेजिंग अच्छी तरह से कॉन्फ़िगर नहीं किया जा सकता है। आप यह सुनिश्चित करने के लिए आईबीएम द्वारा WebSphere MQ - Message Test Utility देने पर विचार कर सकते हैं कि सिस्टम या नेटवर्क कॉन्फ़िगरेशन समस्याएं मौजूद नहीं हैं।

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