java - funciona - consumidor activemq
ACTIVEMQ- publicista suscriptor hello world ejemplo (4)
El problema principal (además de que la aplicación se cierra rápidamente) es que está enviando a un tema. Los temas no retienen los 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 soluciona el problema de apagado y luego ejecuta el consumidor en un terminal y luego ejecuta el productor, debería ver el mensaje recibido por su consumidor. Si desea retener el mensaje, entonces necesita usar una Cola que retendrá el mensaje hasta que alguien lo consuma.
Hay dos programas: suscriptor y editor ... El suscriptor puede poner el mensaje en el tema y el mensaje se envía correctamente. Cuando verifico el servidor activemq en mi navegador, muestra 1 msg en cola. Pero cuando ejecuto el código del consumidor, no está recibiendo el mensaje
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, el resultado 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 me puede ayudar a superar este problema?
Su problema es que su consumidor se está ejecutando y luego se apaga de inmediato.
Intente agregar esto a su consumidor:
consumer.setMessageListener(listner);
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
connection.close();
Esto esperará hasta que pulses una tecla antes de detenerte.
Otras cosas a considerar:
- Usa un bloque final para el cierre.
- Las convenciones de nomenclatura de Java fomentan el uso de mayúsculas para la primera letra de una clase
Tu clase de productor es correcta. Se ejecuta sin problemas.
Pero, tu consumidor es incorrecto y tienes que modificarlo.
Primero, agregue setClientID ("any_string_value") después de crear el objeto de conexión ;
por ejemplo:
Connection connection = connectionFactory.createConnection(); // need to setClientID value, any string value you wish connection.setClientID("12345");
Connection connection = connectionFactory.createConnection(); // need to setClientID value, any string value you wish connection.setClientID("12345");
en segundo lugar, use el método createDurableSubscriber () en lugar de createConsumer () para transmitir el mensaje a través del tema.
MessageConsumer consumer = session.createDurableSubscriber(topic,"SUB1234");
Aquí está la clase de consumo modificada:
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, su código se ejecutará con éxito.
solo algunos:
- trabajar con una cola no un tema los mensajes en los temas se descartarán cuando no haya un consumidor disponible, NO son persistentes.
- agregue connection.start () después de configurar la escucha de mensajes. debe iniciar una conexión cuando todos los consumidores / productores estén configurados correctamente.
- Espere algún tiempo antes de volver a cerrar la conexión.
El tema probablemente será su fuente más importante de fracaso.