topic持久化需要在建立连接之前就设置好持久化参数,因此在构建代码时,连接启动的顺序需要改变,移动到创建好生产者,并将生产模式设计为持久化之后进行,代码示例:
package com.xiaowu.activemq;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
import static javax.jms.Session.AUTO_ACKNOWLEDGE;
public class JmsProducer_Topic {
public static final String ACTIVEMQ_URL="tcp://152.136.12.27:61616";
public static final String Topic_Name="topic01";
public static void main(String[] args) throws JMSException {
ActiveMQConnectionFactory activeMQConnectionFactory=new ActiveMQConnectionFactory(ACTIVEMQ_URL);
Connection connection=activeMQConnectionFactory.createConnection();
Session session = connection.createSession(false, AUTO_ACKNOWLEDGE);
Topic topic=session.createTopic(Topic_Name);
MessageProducer messageProducer=session.createProducer(topic);
//设置生产者为持久化模式
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
//建立连接
connection.start();
for(int i=0;i<6;i++){
TextMessage textMessage=session.createTextMessage("topic_message---"+i);
messageProducer.send(textMessage);
}
messageProducer.close();
session.close();
connection.close();
System.out.println("消息发送完毕");
}
}
消费者也需要有相应的该变,消费者的变动比较大,在new出连接对象之后,可以设置客户端id
在持久化模式下,消费者需要创建的不再是消费者对象,而是持久化订阅对象,然后再建立连接
代码如下
package com.xiaowu.activemq;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
import java.io.IOException;
import static javax.jms.Session.AUTO_ACKNOWLEDGE;
public class JmsConsumerTopic {
public static final String ACTIVEMQ_URL="tcp://152.136.12.27:61616";
public static final String Topic_Name="topic01";
public static void main(String[] args) throws JMSException, IOException {
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
Connection connection = activeMQConnectionFactory.createConnection();
//设置客户端id
connection.setClientID("xiaowu");
Session session = connection.createSession(false, AUTO_ACKNOWLEDGE);
Topic topic=session.createTopic(Topic_Name);
//创建持久化订阅对象
TopicSubscriber durableSubscriber = session.createDurableSubscriber(topic, "topic....");
//建立连接
connection.start();
Message message=durableSubscriber.receive();
while(null!=message){
TextMessage textMessage=(TextMessage)message;
System.out.println(textMessage.getText());
message=durableSubscriber.receive(4000L);
}
session.close();
connection.close();
}
}