2012-01-26 21 views
18

दो कार्यक्रम हैं: ग्राहक और प्रकाशक ... सब्सक्राइबर संदेश को विषय पर रखने में सक्षम है और संदेश सफलतापूर्वक भेजा गया है। जब मैं अपने ब्राउज़र पर activemq सर्वर की जांच करता हूं तो यह 1 संदेश संलग्न करता है। लेकिन जब मैं उपभोक्ता कोड चलाने के लिए, यह संदेशACTIVEMQ- प्रकाशक ग्राहक हैलो वर्ल्ड उदाहरण

यहाँ प्राप्त नहीं हो रही है निर्माता कोड:

import javax.jms.*; 

import org.apache.activemq.ActiveMQConnection; 
import org.apache.activemq.ActiveMQConnectionFactory; 

public class producer { 

    private static String url = ActiveMQConnection.DEFAULT_BROKER_URL; 

    public static void main(String[] args) throws JMSException { 

     ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url); 
     Connection connection = connectionFactory.createConnection(); 
     connection.start(); 

     // JMS messages are sent and received using a Session. We will 
     // create here a non-transactional session object. If you want 
     // to use transactions you should set the first parameter to 'true' 
     Session session = connection.createSession(false, 
       Session.AUTO_ACKNOWLEDGE); 

     Topic topic = session.createTopic("testt"); 

     MessageProducer producer = session.createProducer(topic); 

     // We will send a small text message saying 'Hello' 

     TextMessage message = session.createTextMessage(); 

     message.setText("HELLO JMS WORLD"); 
     // Here we are sending the message! 
     producer.send(message); 
     System.out.println("Sent message '" + message.getText() + "'"); 

     connection.close(); 
    } 
} 

बाद मैं इस कोड को चलाने के कंसोल पर उत्पादन होता है:

26 Jan, 2012 2:30:04 PM org.apache.activemq.transport.failover.FailoverTransport doReconnect 
INFO: Successfully connected to tcp://localhost:61616 
Sent message 'HELLO JMS WORLD' 

और यहां उपभोक्ता कोड है:

import javax.jms.*; 

import org.apache.activemq.ActiveMQConnection; 
import org.apache.activemq.ActiveMQConnectionFactory; 

public class consumer { 
    // URL of the JMS server 
    private static String url = ActiveMQConnection.DEFAULT_BROKER_URL; 

    // Name of the topic from which we will receive messages from = " testt" 

    public static void main(String[] args) throws JMSException { 
     // Getting JMS connection from the server 

     ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url); 
     Connection connection = connectionFactory.createConnection(); 
     connection.start(); 

     Session session = connection.createSession(false, 
       Session.AUTO_ACKNOWLEDGE); 

     Topic topic = session.createTopic("testt"); 

     MessageConsumer consumer = session.createConsumer(topic); 

     MessageListener listner = new MessageListener() { 
      public void onMessage(Message message) { 
       try { 
        if (message instanceof TextMessage) { 
         TextMessage textMessage = (TextMessage) message; 
         System.out.println("Received message" 
           + textMessage.getText() + "'"); 
        } 
       } catch (JMSException e) { 
        System.out.println("Caught:" + e); 
        e.printStackTrace(); 
       } 
      } 
     }; 

     consumer.setMessageListener(listner); 
     connection.close(); 

    } 
}  

इस कोड को चलाने के बाद यह कुछ भी नहीं दिखाता है। क्या कोई इस समस्या को दूर करने में मेरी सहायता कर सकता है?

+1

अनुमान लगाएं कि आप जल्द ही कनेक्शन बंद कर रहे हैं। आपके उपभोक्ता उपभोग शुरू होने से पहले, कनेक्शन बंद हो गया है और मुख्य विधि खत्म हो गई है! –

उत्तर

13

आपकी समस्या यह है कि आपका उपभोक्ता चल रहा है और फिर तुरंत बंद हो रहा है।

अपने उपभोक्ता में इस जोड़ने का प्रयास करें:

consumer.setMessageListener(listner); 

    try { 
     System.in.read(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    connection.close(); 

यह जब तक आप रुकने से पहले एक प्रमुख मारा इंतजार करेंगे।

अन्य बातों पर विचार करने के लिए:

  • एक अंत में करीब
  • जावा नामकरण रिवाजों का एक वर्ग
+0

कोई सर जो आपने उल्लेख किया है वह भी काम नहीं कर रहा है :( कृपया मदद करें ... परियोजना में बुरी तरह फंस गया! –

11

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

+3

क्षमा करें दोस्तों को बग ठीक हो गया .. मैं पहले प्रकाशक मॉड्यूल को निष्पादित कर रहा था तो ग्राहक ... हालांकि यह पहले ग्राहक मॉड्यूल होना चाहिए प्रकाशक ... सुझावों के लिए धन्यवाद :) –

2

बस कुछ:

  • एक कतार नहीं एक विषय के साथ काम करते हैं। जब कोई उपभोक्ता उपलब्ध नहीं होता है तो विषयों में संदेशों को त्याग दिया जाएगा, वे लगातार नहीं हैं।
  • संदेश श्रोता सेट करने के बाद कनेक्शन.स्टार्ट() जोड़ें। जब आप सभी उपभोक्ता/उत्पादक ठीक तरह से स्थापित होते हैं तो आपको कनेक्शन शुरू करना चाहिए।
  • कनेक्शन को बंद करने से पहले कुछ समय पहले प्रतीक्षा करें।

विषय शायद विफलता का आपका सबसे महत्वपूर्ण स्रोत होगा।

2

आपका निर्माता कक्षा सही है। यह सुचारू रूप से चलता है।

लेकिन, आपके उपभोक्ता गलत है & आपको इसे संशोधित करना होगा।

  • पहले, संबंध बनाने वस्तु के बाद setClientID ("any_string_value") जोड़ने;

    जैसे: Connection connection = connectionFactory.createConnection(); // need to setClientID value, any string value you wish connection.setClientID("12345");

  • दूसरी बात, विषय के माध्यम से संदेश प्रसारित करने के कारण createDurableSubscriber() createConsumer() के बजाय विधि का उपयोग करें।

    package mq.test; 
    
    import javax.jms.*; 
    
    import org.apache.activemq.ActiveMQConnection; 
    import org.apache.activemq.ActiveMQConnectionFactory; 
    
    public class consumer { 
        // URL of the JMS server 
        private static String url = ActiveMQConnection.DEFAULT_BROKER_URL; 
    
        // Name of the topic from which we will receive messages from = " testt" 
    
        public static void main(String[] args) throws JMSException { 
         // Getting JMS connection from the server 
    
         ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url); 
         Connection connection = connectionFactory.createConnection(); 
    
         // need to setClientID value, any string value you wish 
         connection.setClientID("12345"); 
    
         try{ 
         connection.start(); 
         }catch(Exception e){ 
          System.err.println("NOT CONNECTED!!!"); 
         } 
         Session session = connection.createSession(false, 
           Session.AUTO_ACKNOWLEDGE); 
    
         Topic topic = session.createTopic("test_data"); 
    
         //need to use createDurableSubscriber() method instead of createConsumer() for topic 
         // MessageConsumer consumer = session.createConsumer(topic); 
         MessageConsumer consumer = session.createDurableSubscriber(topic, 
           "SUB1234"); 
    
         MessageListener listner = new MessageListener() { 
          public void onMessage(Message message) { 
           try { 
            if (message instanceof TextMessage) { 
             TextMessage textMessage = (TextMessage) message; 
             System.out.println("Received message" 
               + textMessage.getText() + "'"); 
            } 
           } catch (JMSException e) { 
            System.out.println("Caught:" + e); 
            e.printStackTrace(); 
           } 
          } 
         }; 
    
         consumer.setMessageListener(listner); 
         //connection.close(); 
    
        } 
    } 
    

    अब, अपने कोड को सफलतापूर्वक चलेंगे:

    MessageConsumer consumer = session.createDurableSubscriber(topic,"SUB1234");

यहाँ संशोधित उपभोक्ताओं वर्ग है।

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