2012-01-26 27 views
18

Hay dos programas: suscriptor y editor ... El suscriptor puede poner el mensaje en el tema y el mensaje se envía con éxito. Cuando reviso el servidor activemq en mi navegador, muestra 1 msg en cola. Pero cuando corro el código de consumo, que no está recibiendo el mensajeACTIVEMQ- suscriptor editorial hello world ejemplo

Aquí está el código del productor:

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

después de ejecutar este código la salida en la consola es:

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' 

Y aquí está el código del consumidor:

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

    } 
}  

Después de ejecutar este código, no muestra nada. ¿Alguien puede ayudarme a superar este problema?

+1

supongo que está cerrando la conexión demasiado pronto. ¡Antes de que su consumidor comience a consumir, la conexión se cierra y el método principal ha terminado! –

Respuesta

13

Su problema es que su consumidor se está ejecutando y luego se está cerrando inmediatamente.

Trate de añadir esto a su consumidor:

consumer.setMessageListener(listner); 

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

    connection.close(); 

Esto va a esperar hasta que pulse una tecla antes de detenerse.

Otras cosas a considerar:

  • Use un bloque finally para el cierre
  • Java convenciones de nombres fomentan el uso de mayúsculas para la primera letra de una clase
+0

no señor el código anterior que usted mencionó también no está funcionando :( por favor AYUDA ... muy atascado en el proyecto! –

11

El principal problema (además de la la aplicación se cierra rápidamente) es que está enviando a un tema. Los temas no retienen mensajes por lo que si ejecuta la aplicación que produce y luego ejecuta el consumidor, el consumidor no recibirá nada porque no estaba suscrito al tema en el momento en que se envió el mensaje. Si arreglas el problema de apagado y luego ejecutas al consumidor en un terminal y luego ejecutas el productor, entonces debes ver el mensaje que recibe tu consumidor. Si desea la retención de mensajes, deberá usar una Cola que retendrá el mensaje hasta que alguien lo consuma.

+3

amigos amigos el error se solucionó .. estaba ejecutando el módulo editor primero y luego el suscriptor ... sin embargo, debería ser el módulo de suscriptor primero, luego el editor ... gracias por las sugerencias :) –

2

sólo algunas:

  • no trabajo con una cola de un tema. los mensajes en los temas se descartarán cuando no haya ningún consumidor disponible, NO se mantendrán.
  • añada connection.start() después de configurar el detector de mensajes. debe comenzar una conexión cuando todos los consumidores/productores estén configurados correctamente.
  • espere un tiempo antes antes de volver a cerrar la conexión.

El tema probablemente sea la fuente de error más importante.

2

Su productor clase es correcta. Funciona sin problemas.

Pero, su consumidor es incorrecto & tiene que modificarlo.

  • En primer lugar, añadir SetClientID ("any_string_value") después de crear conexión objeto;

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

  • en segundo lugar, utilizar el método en lugar de createConsumer() createDurableSubscriber() para transmitir el mensaje a través de tema.

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

Aquí es el modificado comsumer clase:

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

    } 
} 

Ahora, el código se ejecutará correctamente.