ActiveMQ学习简单应用(三Topic)

本文介绍了一种利用 JMS 实现的消息持久化机制。通过此机制,即使消费者离线,消息也能被保存并稍后送达。文中详细展示了如何通过 Java 代码配置生产者和消费者的连接,并设置消息为持久化类型。

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

本次将把topic得持久实例介绍一下

所谓持久也就是,消费者订阅topic以后无需在线等待消息,生产者发送消息以后,消费者上线以后JMS会自动得将消息发送给消费者.

这样更加得方便,不需要担心消息会丢失,同样这种操作模式对资源得消耗比非持久得相对要高

说了这么多先上代码看看

生产者:


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

import org.apache.activemq.ActiveMQConnectionFactory;

/**
 * 消息发送类
 * 
 * @author Administrator
 *
 */
public class PersistenceSender {

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

		// 创建消息队列工厂地址是默认地址
		ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
		// 创建链接(正常需要try/catch,为了方便直接抛出异常)
		Connection connection = factory.createConnection();
		// 创建session会话(开启事物,和自动确认)
		Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
		// 创建队列名称
		Destination destination = session.createTopic("MyTopice");
		// 开启创建者
		MessageProducer createProducer = session.createProducer(destination);
		// 设置成持久化后启动消息
		createProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
		//启动链接
		connection.start();
		// 循环创建消息
		for (int i = 0; i < 3; i++) {
			TextMessage createTextMessage = session.createTextMessage("my-topice消息" + i);
			createProducer.send(createTextMessage);
		}

		// 关闭链接会话
		session.commit();
		session.close();
		connection.close();

	}
}

消费者:


import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicSubscriber;

import org.apache.activemq.ActiveMQConnectionFactory;

/**
 * 消息接收方
 * 
 * @author Administrator
 *
 */
public class PersistenceRecaiver {

	public static void main(String[] args) throws JMSException {
		// 与接收方差不错,只是将制造者变消费者

		// 创建消息队列工厂地址是默认地址
		ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
		// 创建链接(正常需要try/catch,为了方便直接抛出异常)
		Connection connection = factory.createConnection();
		// 设置id(这里必须加上id)
		connection.setClientID("topic1");
		// 创建session会话(开启事物,和自动确认)
		final Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
		// 创建队列名称
		Topic createTopic = session.createTopic("MyTopice");
		// 订阅
		TopicSubscriber durableSubscriber = session.createDurableSubscriber(createTopic, "T1");
		// 接收方这里需要加上启动
		connection.start();
		// 循环接收消息
		Message receive = durableSubscriber.receive();
		while (receive != null) {
			TextMessage textMessage = (TextMessage) receive;
			System.out.println("接收到得消息" + textMessage.getText());
			receive = durableSubscriber.receive(1000L);
		}
		session.commit();
		// 关闭链接
		session.close();
		connection.close();
	}

}

使用这种模式需要注意:

1第一次必须先启动消费者,让JMS知道他要订阅那个topic

2需要设置

connection.setClientID("topic1");

这也是为了告诉JMS是那个消费者订阅得topic

3

TopicSubscriber durableSubscriber = session.createDurableSubscriber(createTopic, "T1");

将订阅信息写入"T1"可以随便取名,只是个名字,当然在项目中还是需要一个有意义得名称得!

4很重要得一点,必须设置结束后启动链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

druidcaesa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值