持久化需要滿足兩個條件:
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>