一:消息生产者MessageProducer调用setDeliverMode设置发布消息持久化方式,不设置默认也是持久化
import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; public class TopicProducer { public static void main(String[] args) throws JMSException { //1.创建连接工厂 ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.25.128:61616"); //2.获取连接 Connection connection = connectionFactory.createConnection(); //3.启动连接 connection.start(); //4.获取session (参数1:是否启动事务,参数2:消息确认模式) Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //5.创建主题对象 Topic topic = session.createTopic("test-topic"); //6.创建消息生产者 MessageProducer producer = session.createProducer(topic); //发布消息采用持久模式,不设置,默认就是持久的 producer.setDeliveryMode(DeliveryMode.PERSISTENT); //7.创建消息 TextMessage textMessage = session.createTextMessage("欢迎来到activemq世界3312"); //8.发送消息 producer.send(textMessage); //9.关闭资源 producer.close(); session.close(); connection.close(); } }
二:订阅者获取持久化消息,需要在获取连接时设置自身的一个订阅者身份标识
connection.setClientID("client1"); //持久订阅需要设置标识。
创建订阅者消息对象MessageConsumer需要将上面的订阅者身份标识设置createDurableSubscriber方法参数中
//持久订阅者 MessageConsumer consumer = session.createDurableSubscriber(topic,"client1"); //持久订阅
完整的订阅者案例:
import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; import java.io.IOException; public class TopicConsumer { public static void main(String[] args) throws JMSException, IOException { //1.创建连接工厂 ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.25.128:61616"); //2.获取连接 Connection connection = connectionFactory.createConnection(); connection.setClientID("client1"); //持久订阅需要设置标识。 //3.启动连接 connection.start(); //4.获取session (参数1:是否启动事务,参数2:消息确认模式) Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //5.创建主题对象 Topic topic = session.createTopic("test-topic"); //6.创建消息消费,普通订阅者 // MessageConsumer consumer = session.createConsumer(topic); //持久订阅者 MessageConsumer consumer = session.createDurableSubscriber(topic,"client1"); //持久订阅 //7.监听消息 consumer.setMessageListener(new MessageListener() { public void onMessage(Message message) { TextMessage textMessage=(TextMessage)message; try { System.out.println("接收到消息:"+textMessage.getText()); } catch (JMSException e) { e.printStackTrace(); } } }); //8.等待键盘输入,等待监听程序 System.in.read(); //9.关闭资源 consumer.close(); session.close(); connection.close(); } }
三:测试
先启动发布者,发布两个消息,此时订阅者未启动,发布消息会被activemq持久化到本地,当订阅者连上activemq时,这两个消息会被订阅者消费,如下: