Отправка сообщения нескольким потребителям в ActiveMQ

1

Я новичок в ActiveMQ. Я попытался внедрить производителя-потребителя (отправителя-получателя) в activemq. В моем коде я могу легко отправлять и получать сообщения от одного производителя до одного пользователя через ActiveMQ. Но проблема в том, что я не могу отправить сообщение нескольким потребителям от того же производителя.

Вот мой производитель и потребительский класс.

MsgProducer.java

package jms_service;

import javax.jms.JMSException;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;

public class MsgProducer {

      private static String url = "failover://tcp://localhost:61616";
      public static javax.jms.ConnectionFactory connFactory;
      public static javax.jms.Connection connection;
      public static javax.jms.Session mqSession;
      public static javax.jms.Topic topic;
      public static javax.jms.MessageProducer producer;

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

          connFactory = new ActiveMQConnectionFactory(url);  
          connection = connFactory.createConnection("system","manager");
          connection.start(); 
          mqSession = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);  

          topic = mqSession.createTopic("RealTimeData");
          producer = mqSession.createProducer(topic);                  
          producer.setTimeToLive(30000);

          TextMessage message = mqSession.createTextMessage();      

          int seq_id =1;

          while(true)
            {             
                message.setText("Hello world | " +"seq_id #"+seq_id);               
                 producer.send(message);
                 seq_id++;

                 System.out.println("sent_msg =>> "+ message.getText());
               //  if(seq_id>100000) break;

                    try {
                        Thread.sleep(1000);
                        } 
                    catch (InterruptedException e) { e.printStackTrace();}           
              }       

    }

}

MsgConsumer.java

package jms_service;

import java.text.SimpleDateFormat;
import java.util.Calendar;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;

public class MsgConsumer {

          private static String url = "failover://tcp://localhost:61616";     
          public static javax.jms.ConnectionFactory connFactory;
          public static javax.jms.Connection connection;
          public static javax.jms.Session mqSession;
          public static javax.jms.Topic topic;
          public static javax.jms.MessageConsumer consumer;

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

            connFactory = new ActiveMQConnectionFactory(url);
            connection = connFactory.createConnection("system", "manager");
            connection.setClientID("0002");
            //connection.start();               
            mqSession = connection.createSession(true, Session.CLIENT_ACKNOWLEDGE);
            topic = mqSession.createTopic("RealTimeData");
            consumer = mqSession.createDurableSubscriber(topic, "SUBS01");
            connection.start();

            MessageListener listner = new MessageListener() {
                public void onMessage(Message message) {
                    try {
                        if (message instanceof TextMessage) {
                            TextMessage txtmsg = (TextMessage) message;
                            Calendar cal = Calendar.getInstance();
                            //cal.getTime();
                            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
                            String time = sdf.format(cal.getTime());

                            String msg="received_message =>> "+ txtmsg.getText() + " | received_at :: "+time;
                            System.out.println(msg);

                            //consumer.sendData(msg);
                        }

                        } catch (JMSException e) {
                            System.out.println("Caught:" + e);
                            e.printStackTrace();
                            }
                    }
            };

            consumer.setMessageListener(listner);  

      }


}

Может ли кто-нибудь помочь выяснить способ отправки сообщения нескольким потребителям. Заранее спасибо.

  • 0
    В чем проблема?
  • 0
    У вас есть жестко идентифицированный идентификатор клиента ... Я признаю, что не знаю ActiveMQ, но я мог бы представить, что это является причиной.
Показать ещё 2 комментария
Теги:
activemq

2 ответа

1
Лучший ответ

Предполагая, что ваш вопрос

Может ли кто-нибудь помочь выяснить способ отправки сообщения нескольким потребителям

и без прочтения вашего полного кода подход может заключаться в том, чтобы поместить ваших клиентов в коллекцию

static Vector<consumer> vecConsumer;

где вы размещаете каждого нового клиента и даете ссылку на всех существующих клиентов. Радиовещание подобно отправке одному клиенту, заключенному, например, в цикл foreach

for(consumer cons : vecConsumer)
{
      //send stuff or put in sending queue
}
  • 0
    Признаюсь, я не знаю ActiveMQ, но я ожидаю, что очередь сообщений обработает именно это для меня.
  • 0
    @Fildor из-за того, что очередь сообщений JMS (более или менее) предназначена для двухточечных соединений, я подумал о более общем подходе;)
2

Семантика очереди доставляет сообщение один раз и только один раз для всех потребителей. Это соответствует спецификации JMS (большое чтение, чтобы понять основы).

Семантика темы доставляет сообщение каждому потребителю. Таким образом, Тема может быть ответом на ваши потребности.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню