持久化需要满足两个条件:
1)消息服务开启了持久化功能;
2)生产者发送持久化消息
注:笔者建议MQ服务开启持久化功能,生产者根据消息内容的重要性、量级来合理使用持久化或不使用持久化
本文主要描述,消息服务的默认持久化功能及存储,不涉及定制存储方式。本文描述JmsTemplate的发送消息时如何设置是否支持持久化,其他使用方式类同
一、ActiveMQ开启持久化功能(默认开启)
1、支持持久化
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" schedulerSupport="true">
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
注:persistent默认为true,此时生效
2、关闭持久化
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" schedulerSupport="true" persistent="false">
二、JmsTemplate(生产者设置)
注:前提是消息服务开启来持久化,不然此处任你如何设置都是不支持持久化操作的
1、JmsTemplate持久化关键源码(只列出了与持久化相关的源码)
package org.springframework.jms.core;
public class JmsTemplate extends JmsDestinationAccessor implements JmsOperations {
......
private boolean explicitQosEnabled; //是否使用deliveryMode配置
private int deliveryMode; // 1非持久化,2持久化,详见常量定义
......
public JmsTemplate() {
......
this.explicitQosEnabled = false;
this.deliveryMode = 2;
......
}
......
public void setExplicitQosEnabled(boolean explicitQosEnabled) {
this.explicitQosEnabled = explicitQosEnabled;
}
public boolean isExplicitQosEnabled() {
return this.explicitQosEnabled;
}
public void setDeliveryPersistent(boolean deliveryPersistent) {
this.deliveryMode = deliveryPersistent ? 2 : 1;
}
public void setDeliveryMode(int deliveryMode) {
this.deliveryMode = deliveryMode;
}
public int getDeliveryMode() {
return this.deliveryMode;
}
......
protected void doSend(MessageProducer producer, Message message) throws JMSException {
if (this.isExplicitQosEnabled()) {
producer.send(message, this.getDeliveryMode(), this.getPriority(), this.getTimeToLive());
} else {
producer.send(message);
}
}
......
由源码可知,如需配置JmsTemplate是否支持持久化,需配置三个属性:explicitQosEnabled, deliveryMode, deliveryPersistent
2、开启持久化:默认开启,可不配置(笔者认为最好显示的配置,不然版本升级,默认策略改变的化会有坑)
<!-- 支持持久化 -->
<bean id="persistentJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="cacheConnectionFactory" />
<property name="receiveTimeout" value="0" />
<property name="explicitQosEnabled" value="true" />
<property name="deliveryMode" value="2" />
<property name="deliveryPersistent" value="true" />
</bean>
3、关闭持久化
<!-- 不支持持久化 -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="cacheConnectionFactory" />
<property name="receiveTimeout" value="0" />
<property name="explicitQosEnabled" value="true" />
<property name="deliveryMode" value="1" />
<property name="deliveryPersistent" value="false" />
</bean>