ActiveMQ的发布订阅模式

1、ActivaMQ的发布订阅模式的简介

      发布订阅模式有点类似于我们日常生活中订阅报纸。每年到年尾的时候,邮局就会发一本报纸集合让我们来选择订阅哪一个。在这个表里头列了所有出版发行的报纸,那么对于我们每一个订阅者来说,我们可以选择一份或者多份报纸。比如北京日报、潇湘晨报等。那么这些个我们订阅的报纸,就相当于发布订阅模式里的topic。有很多个人订阅报纸,也有人可能和我订阅了相同的报纸。那么,在这里,相当于我们在同一个topic里注册了。对于一份报纸发行方来说,它和所有的订阅者就构成了一个1对多的关系。Subscriber只有在订阅了主题Topic后,才能接收到Publisher发送的消息。这种关系如下图所示:



2、Publisher的代码

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;

public class Publisher {

	// 单例模式

	// 1、连接工厂
	private ConnectionFactory connectionFactory;
	// 2、连接对象
	private Connection connection;
	// 3、Session对象
	private Session session;
	// 4、生产者
	private MessageProducer messageProducer;

	public Publisher() {

		try {
			this.connectionFactory = new ActiveMQConnectionFactory("zhangsan",
					"123", "tcp://localhost:61616");
			this.connection = connectionFactory.createConnection();
			this.connection.start();
			// 不使用事务
			// 设置客户端签收模式
			this.session = this.connection.createSession(false,
					Session.AUTO_ACKNOWLEDGE);
			this.messageProducer = this.session.createProducer(null);
		} catch (JMSException e) {
			throw new RuntimeException(e);
		}

	}

	public Session getSession() {
		return this.session;
	}

	public void send1(/* String QueueName, Message message */) {
		try {

			Destination destination = this.session.createTopic("topic1");
			MapMessage msg1 = this.session.createMapMessage();
			msg1.setString("name", "张三");
			msg1.setInt("age", 22);

			MapMessage msg2 = this.session.createMapMessage();
			msg2.setString("name", "李四");
			msg2.setInt("age", 25);

			MapMessage msg3 = this.session.createMapMessage();
			msg3.setString("name", "张三");
			msg3.setInt("age", 30);

			// 发送消息到topic1
			this.messageProducer.send(destination, msg1,
					DeliveryMode.NON_PERSISTENT, 4, 1000 * 60 * 10);
			this.messageProducer.send(destination, msg2,
					DeliveryMode.NON_PERSISTENT, 4, 1000 * 60 * 10);
			this.messageProducer.send(destination, msg3,
					DeliveryMode.NON_PERSISTENT, 4, 1000 * 60 * 10);

		} catch (JMSException e) {
			throw new RuntimeException(e);
		}
	}

	public void send2() {
		try {
			Destination destination = this.session.createTopic("topic1");
			TextMessage message = this.session.createTextMessage("我是一个字符串");
			// 发送消息
			this.messageProducer.send(destination, message,
					DeliveryMode.NON_PERSISTENT, 4, 1000 * 60 * 10);
		} catch (JMSException e) {
			throw new RuntimeException(e);
		}

	}

	public static void main(String[] args) {
		Publisher producer = new Publisher();
		producer.send1();

	}

}


3、Subscribe的代码

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;

public class Subscriber {

	// 单例模式

	// 1、连接工厂
	private ConnectionFactory connectionFactory;
	// 2、连接对象
	private Connection connection;
	// 3、Session对象
	private Session session;
	// 4、生产者
	private MessageConsumer messageConsumer;
	// 5、目的地址
	private Destination destination;

	public Subscriber() {

		try {
			this.connectionFactory = new ActiveMQConnectionFactory("zhangsan",
					"123", "tcp://localhost:61616");
			this.connection = connectionFactory.createConnection();
			this.connection.start();
			// 不使用事务
			// 设置客户端签收模式
			this.session = this.connection.createSession(false,
					Session.AUTO_ACKNOWLEDGE);
			this.destination = this.session.createTopic("topic1");
			this.messageConsumer = this.session.createConsumer(destination);
		} catch (JMSException e) {
			throw new RuntimeException(e);
		}

	}

	public Session getSession() {
		return this.session;
	}

	// 用于监听消息队列的消息
	class MyLister implements MessageListener {

		@Override
		public void onMessage(Message message) {
			try {
				if (message instanceof TextMessage) {

				}
				if (message instanceof MapMessage) {
					MapMessage ret = (MapMessage) message;
					System.out.println(ret.toString());
					System.out.println(ret.getString("name"));
					System.out.println(ret.getInt("age"));
					// 因为设置的是客户端的签收模式,所以要手动的去确认消息的消费
					message.acknowledge();
				}
			} catch (JMSException e) {
				throw new RuntimeException(e);
			}
		}

	}

	// 用于异步监听消息
	public void receiver() {
		try {
			this.messageConsumer.setMessageListener(new MyLister());
		} catch (JMSException e) {
			throw new RuntimeException(e);
		}
	}

	public static void main(String[] args) {
		Subscriber conmuser = new Subscriber();
		conmuser.receiver();

	}

}

4、ActiveMQ的界面截图



  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot中整合ActiveMQ进行订阅,你需要按照以下步骤进行配置和实现: 1. 依赖:在`pom.xml`文件中添加以下依赖项: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> ``` 2. 配置参数:在`application.yml`或`application.properties`文件中配置ActiveMQ连接信息和订阅相关参数,例如: ``` spring: activemq: broker-url: tcp://localhost:61616 # ActiveMQ连接地址 user: admin # ActiveMQ用户名 password: admin # ActiveMQ密码 jms: pub-sub-domain: true # 设置为true表示使用发布订阅模式,默认为false(点对点模式) ``` 3. 创建订阅者:在你的代码中创建一个订阅者类,用于接收消息。可以使用`@JmsListener`注解来标识一个方法作为消息监听器,例如: ```java @Service public class MySubscriber { @JmsListener(destination = "your-topic-name") public void receiveMessage(String message) { // 处理接收到的消息 System.out.println("Received message: " + message); } } ``` 在上面的例子中,`your-topic-name`是你要订阅的主题名称。 4. 发布消息:在需要发布消息的地方,注入`JmsTemplate`对象,然后使用`convertAndSend`方法发送消息,例如: ```java @Service public class MyPublisher { @Autowired private JmsTemplate jmsTemplate; public void sendMessage(String message) { jmsTemplate.convertAndSend("your-topic-name", message); } } ``` 在上面的例子中,`your-topic-name`是你要发布消息的主题名称。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值