ActiveMQ基於JmsTemplate的持久化

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

ActiveMQ延遲隊列

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章