本次将把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很重要得一点,必须设置结束后启动链接