ActiveMQ的发布、订阅消息(主题模式)
1)发布/订阅消息传递域的特点
2)发布主题生产者
public class JmsProduce_Topic { public static final String ACTIVEMQ_URL = "tcp://192.168.2.180:61616"; public static final String TOPIC_NAME ="topic_atguigu"; public static void main(String[] args) throws JMSException { //1、创建连接工厂 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); //2、通过连接工程获取connection Connection connection = activeMQConnectionFactory.createConnection(); connection.start(); //3、创建会话 //两个参数 1:事务 2:签收 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //4、创建目的地 Topic topic = session.createTopic(TOPIC_NAME); //5、创建消息的生产者 MessageProducer messageProducer = session.createProducer(topic); //6、使用消息生产者生产3条消息发送到MQ的队列里面 for(int i=1;i<=3;i++){ //7、创建消息 TextMessage textMessage = session.createTextMessage("TOPIC_MESSAGE" + i); //8、通过messageProducer发送给mq messageProducer.send(textMessage); } //9、释放资源 messageProducer.close(); session.close(); connection.close(); System.out.println("TOPIC_MESSAGE 消息发送到MQ成功!!!"); } }
3)订阅消息消费者
/** * @Description: 发布/订阅的消息消费者 * @author houChen * @date 2020/7/13 14:32 */ public class JmsConsumer_Topic { public static final String ACTIVEMQ_URL = "tcp://192.168.2.180:61616"; public static final String TOPIC_NAME ="topic_atguigu"; public static void main(String[] args) throws JMSException, IOException { System.out.println("我是1号消费者"); //1、创建连接工厂 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); //2、通过连接工程获取connection Connection connection = activeMQConnectionFactory.createConnection(); connection.start(); //3、创建会话 //两个参数 1:事务 2:签收 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //4、创建目的地 Topic topic = session.createTopic(TOPIC_NAME); //5、创建消息的消费者 MessageConsumer messageConsumer = session.createConsumer(topic); // 通过监听的方式来接收消息 ===》 有消息就进行消费,没有消息则继续等待 messageConsumer.setMessageListener(new MessageListener() { @Override public void onMessage(Message message) { if(null!=message&&message instanceof TextMessage){ TextMessage textMessage=(TextMessage)message; try { System.out.println("消费者接收到消息:"+ textMessage.getText()); } catch (JMSException e) { e.printStackTrace(); } } } }); System.in.read(); // 等待 监听器进行监听 messageConsumer.close(); session.close(); connection.close(); System.out.println("消息消费成功!!!"); } }
4)先启动订阅,在启动生产,不然发送的消息为费消息
(idea对一个类运行两次的自己去百度啦哈)
5)查看结果:
对于生产者发布的3条消息,每个消费者都收到3条消息