ActiveMQ发布订阅模式(topic模式)

本文介绍了ActiveMQ的发布订阅模式,即topic模式。在该模式下,一个生产者可以向多个消费者广播消息,每个消费者都能接收到消息。文章详细讲解了生产者和消费者的配置,并提供了测试步骤、运行截图及后台查看的说明,帮助读者理解并实践ActiveMQ的topic模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ActiveMQ发布订阅模式(topic模式)

  • 生产者生产一条消息,可以被多个消费者接收一次。

图片.png

生产者

  • topic模式,1对多。
package com.cjw.activemq;


import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Session;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;

import org.apache.activemq.ActiveMQConnectionFactory;

/**
 * ActiveMQ中的生产者(Producer)
 *
 */
public class MyProducer {

	public void sendhello2ActiveMq(String name) {
		TopicSession session = null;
		TopicConnection conn = null;
		try {
			TopicConnectionFactory factory = new ActiveMQConnectionFactory("admin", "admin", "tcp://192.168.197.130:61616");
			conn = factory.createTopicConnection();
			conn.start();
			session = conn.createTopicSession(true, Session.AUTO_ACKNOWLEDGE);
			// 创建消息队列
			Topic topic = session.createTopic("test-topic");
			// 创建消息发送者
			TopicPublisher publisher = session.createPublisher(topic);
			// 设置持久化模式 NON_PERSISTENT不开启  PERSISTENT 开启 默认是开启
			publisher.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
			MapMessage mapMessage = session.createMapMessage();
			mapMessage.setString("name", name);
			mapMessage.setString("address", "深圳");
			publisher.send(mapMessage);
			
			// 提交会话
			session.commit();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("访问ActiveMQ服务发生错误!!");
		} finally {
			
			try {
				// 回收会话资源
				if (null != session)
					session.close();
			} catch (JMSException e) {
				e.printStackTrace();
			}
			try {
				// 回收链接资源
				if (null != conn)
					conn.close();
			} catch (JMSException e) {
				e.printStackTrace();
			}
		}
	}
}


消费者

  • 可以开启多个消费者,案例中的消费者存活100s。100s可以接受生产者生产的每一条消息。
  • 不接受开启前的,生产者发送的消息。
package com.cjw.activemq;


import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Session;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;

import org.apache.activemq.ActiveMQConnectionFactory;

/**
 * ActiveMQ中的生产者(Producer)
 *
 */
public class MyProducer {

	public void sendhello2ActiveMq(String name) {
		TopicSession session = null;
		TopicConnection conn = null;
		try {
			TopicConnectionFactory factory = new ActiveMQConnectionFactory("admin", "admin", "tcp://192.168.197.130:61616");
			conn = factory.createTopicConnection();
			conn.start();
			session = conn.createTopicSession(true, Session.AUTO_ACKNOWLEDGE);
			// 创建消息队列
			Topic topic = session.createTopic("test-topic");
			// 创建消息发送者
			TopicPublisher publisher = session.createPublisher(topic);
			// 设置持久化模式 NON_PERSISTENT不开启  PERSISTENT 开启 默认是开启
			publisher.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
			MapMessage mapMessage = session.createMapMessage();
			mapMessage.setString("name", name);
			mapMessage.setString("address", "深圳");
			publisher.send(mapMessage);
			
			// 提交会话
			session.commit();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("访问ActiveMQ服务发生错误!!");
		} finally {
			
			try {
				// 回收会话资源
				if (null != session)
					session.close();
			} catch (JMSException e) {
				e.printStackTrace();
			}
			try {
				// 回收链接资源
				if (null != conn)
					conn.close();
			} catch (JMSException e) {
				e.printStackTrace();
			}
		}
	}
}


测试

  • 先开启消费者,在开启生产者。
package com.cjw.test;

import org.junit.Test;

import com.cjw.activemq.MyConsumer;
import com.cjw.activemq.MyProducer;

public class Test01 {

	/**
	 * 测试:topic模式,发送一条消息
	 */
	@Test
	public void test() {
		MyProducer producer = new MyProducer();
		producer.sendhello2ActiveMq("cjw");
		System.out.println("消息发送成功!");
		
	}
	
	/**
	 * 测试:topic模式,接收一条消息,可以重复运行,开启多个消费者.
	 */
	@Test
	public void test2() {
		System.out.println("消费者开启...");
		MyConsumer consumer = new MyConsumer();
		consumer.reciveHelloFormActiveMq();
		System.out.println("消息接收成功!");
		
	}

}

运行截图

图片.png

后台查看

图片.png

项目打包

项目打包 提取码:fbei 环境:eclipse,jdk1.8,maven

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值