2012-01-26 17 views
18

Esistono due programmi: abbonato ed editore ... L'abbonato è in grado di mettere il messaggio sull'argomento e il messaggio viene inviato con successo. Quando controllo il server activemq sul mio browser mostra 1 msg enqueued. Ma quando si esegue il codice del consumo, non sta ricevendo il messaggioACTIVEMQ- abbonato editore ciao esempio mondo

Qui è il codice del produttore:

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(); 
    } 
} 

Dopo ho eseguito questo codice l'output alla console è:

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' 

Ed ecco il codice del consumatore:

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(); 

    } 
}  

Dopo aver eseguito questo codice non mostra nulla. Qualcuno può aiutarmi a superare questo problema?

+1

indovina che stai chiudendo la connessione troppo presto. Prima che il tuo consumatore inizi a consumare, la connessione è chiusa e il metodo principale è finito! –

risposta

13

Il problema è che il vostro utente è in esecuzione e quindi si sta spegnendo immediatamente.

Prova ad aggiungere questo nel vostro consumatore:

consumer.setMessageListener(listner); 

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

    connection.close(); 

Questo attenderà fino a quando si preme un tasto prima di fermarsi.

Altre cose da considerare:

  • Utilizzare un blocco finally per gli stretti
  • Java convenzioni di denominazione incoraggiano utilizzando maiuscolo per la prima lettera di una classe
+0

no signore il codice sopra menzionato non ha funzionato :( per favore AIUTO ... malamente bloccato nel progetto! –

11

Il problema principale (oltre al app che si chiude rapidamente) è che stai inviando a un argomento. Gli argomenti non conservano i messaggi quindi se si esegue l'applicazione che produce e quindi si esegue il consumatore, il consumatore non riceverà nulla perché non è stato sottoscritto all'argomento al momento dell'invio del messaggio. Se correggi il problema dell'arresto e poi esegui l'utente in un unico terminale e poi esegui il produttore, dovresti vedere il messaggio ricevuto dal tuo consumatore. Se si desidera la conservazione dei messaggi, è necessario utilizzare una coda che manterrà il messaggio finché qualcuno non lo consuma.

+3

scusate amici il bug è stato risolto .. stavo eseguendo prima il modulo editore quindi l'abbonato ... tuttavia dovrebbe essere il modulo subscriber prima poi l'editore ... grazie per i suggerimenti :) –

2

solo alcuni:

  • lavoro con un non coda di un argomento. i messaggi negli argomenti saranno scartati quando nessun consumatore è disponibile, NON sono persistenti.
  • aggiungere connection.start() dopo aver impostato il listener dei messaggi. dovresti iniziare una connessione quando tutti i consumatori/produttori sono impostati correttamente.
  • attendere qualche tempo prima di chiudere nuovamente la connessione.

l'argomento sarà probabilmente la più importante fonte di errore.

2

Il tuo produttore classe è corretto. Funziona senza problemi.

Tuttavia, il tuo consumatore non è corretto & devi modificarlo.

  • Innanzitutto, aggiungere SetClientID ("any_string_value") dopo creare connessione oggetto;

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

  • secondo luogo, utilizzare il metodo al posto di createConsumer() createDurableSubscriber() per la trasmissione di un messaggio tramite argomento.

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

Ecco la modifica comsumer classe:

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(); 

    } 
} 

Ora, il codice verrà eseguito correttamente.