消息持久化就是将消息保存到磁盘,这样的好处就是如果服务挂了,则消息还保存在磁盘不会丢失,服务起来后还能找到消息并在此发送,消息的持久化和消息的发送模型是没有关系的。
消息持久化的配置很方便的,所以其他的那些就不写出来了,可以看看上一篇文章中的同步异步实现方式。这里只把持久化配置的列出来。
ok 消息的持久化搞定了我们来看看Topic的主题持久化订阅的实现。
Topic消息持久化订阅
通过之前的学习我们知道,消息的持久化订阅的要求:(1)、消息持久化 (2)、消息消费端要指定ClientID,同一时刻只能有一个ClientID相同的消费者连接消费,所以如果有多个消费者,则ClientID不能相同。下面来看看!
项目结构如下:
项目结构介绍:
1、一个消息生产者,两个消息消费者和一个监听类即MyMessageListener.java,对消息的异步处理和重Activemq时编写的一样!
2、三个配置文件即消息生产者的配置文件和消息消费者的配置文件。
其他的就是之前的相关demo这里相关的就上面1、2中提到的相关东西!
其实东西确实很少,我们来看看代码:
1、消息生产者配置文件即ApplicationContext3P.xml配置文件:
package springs.activemq.Service;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
/**
* @author Administrator
*
*/
public class QueueProducer {
// 负责消息的发送和接收可以理解为MessageProducer 和MessageConsummer的组合。
private static JmsTemplate jt = null;
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"config/ApplicationContext3P.xml");
// 获取JmsTemplate对象
jt = (JmsTemplate) ctx.getBean("jmsTemplate");
// 调用方法,发送消息
jt.send(new MessageCreator() {
// 消息的产生,返回消息发送消息
public Message createMessage(Session s) throws JMSException {
TextMessage msg = s
.createTextMessage("Spring send msg ----> Hello activeMQ3");
return msg;
}
});
System.out.println("end!");
}
}
package springs.activemq.Service;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SimpleJMSReceiver {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("config/ApplicationContext3C.xml");
while(true) {
}
}
}
package springs.activemq.Service;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SimpleJMSReceiver2 {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("config/ApplicationContext3C2.xml");
while(true) {
}
}
}
package springs.activemq.Service;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
public class MyMessageListener implements MessageListener {
public void onMessage(Message arg0) {
// TODO Auto-generated method stub
try {
String message = ((TextMessage) arg0).getText();
System.out.println("textmessage:" + message);
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
消息监听类的onMessage方法的参数就是接收到的消息,我们在方法中对消息进行业务处理!
ok 到这里消息的持久化订阅就ok了,简单说一下:
1、Topic的消息持久化订阅需要将消息持久化,可以到文件也可以到数据库,这个看消息服务器中activemq.xml中持久化的配置,而发送的消息是否要持久化需要在jmsTemplate中配置"deliveryMode"的值为2.
2、消息消费者要设置clientid标识符,这样才能知道是谁。
3、消息监听类,这个类是来处理消息的,在实际项目中使用同步的应该不多,应该都是这样的即配置监听类,比如这个demo我们的监听类用了同一个,但是在项目中如果有不同的需求我们可以对每个消费者定义各个监听类来做具体的处理!
ok到这里也就完了,可以启动消息生产者生产消息,持久化到数据库中,然后启动消费者1和消费者2来消费消息,你可以看到两个消费者都能获取到消息。这时再看数据库则数据库中的消息都没了!
执行结果:
1、消息生产者:
2、消息持久化到mysql数据库中:
3、启动消费者1:
4、启动消费者2
ok这样整个流程都走完了,当消息被发送到消息服务后,如果服务挂了,你在启动消息服务之后再启动消息消费者,这时还是能正常获取未消费的消息。这样也就满足我们的持久化订阅了!
源码下载:点击打开链接
参考文章:
http://blog.csdn.net/s296850101/article/details/52382720
http://greemranqq.iteye.com/blog/2167158