5.6为消息消费者缓存消息-Caching messages
虽然消息持久化的一个重要方面是消息能够从长时间存储中恢复,但是在更多情况下要求消息在消息消费者与代理之间的连接断开后仍然可用.而将消息持久化到数据库中太慢了.交易平
台中价格信息的实时分发就是一个很好的例子.通常,实时数据应用程序使用的消息仅仅在有限的时间里有效,这个有效时间通常小于一分钟.所以,没必要为保证系统正常运行而持久化这些消息,
因为新的消息很快会到来. ActiveMQ通过在代理中使用一种称为订阅恢复策略,为使用这种类型消息的系统缓存消息提供支持.这种策略支持配置哪种类型的消息应该被缓存,以及缓存多少,缓存
多久.本节的剩余部分,我们将讨论
ActiveMQ如何缓存消息以及如何配置不同的订阅恢复策略.
5.6.1 如何为消息消费者缓存消息
除了临时主题和ActiveMQ建议(advisory)主题,ActiveMQ消息代理在内存中缓存所有的正在使用消息主题中的消息.ActiveMQ不会通过上述方式为消息队列缓存消息,因为通常情况下队列会保存所
有发送给它的消息.代理中缓存的消息只能发送到具有消息追溯能力的消费者(译注:打开retroactive开关的消费者),不会发送到配置成持久化订阅的主题订阅者.在创建主题消费者时,可以通过设置
目的地属性,将主题消费者设置为可追溯的(retroactive).
下面是一个示例代码:
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.Topic;
public void createRetroactiveConsumer() throws JMSException
{
ConnectionFactory fac = new ActiveMQConnectionFactory();
Connection connection = fac.createConnection();
connection.start();
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Topic topic = session.createTopic(“TEST.TOPIC?consumer.retroactive=true”);
MessageConsumer consumer = session.createConsumer(topic);
}
在代理端,消息缓存通过一个名称为subscriptionRecoveryPolicy(订阅恢复策略)的目的地策略来控制.默认的
订阅恢复策略是FixedSizeSubscriptionRecoveryPolicy.下面让我们逐一了解可用的各种不同的
订阅恢复策略.
5.6.2 ActiveMQ的订阅恢复策略
ActiveMQ提供多种策略用来调优持久化消息以及缓存非持久化主题消费者的消息.下面分别说明这些
策略.
ACTIVEMQ固定尺寸订阅恢复策略
这种策略根据使用的内存大小对每个主题的可缓存消息数量做了限制.这也是ActiveMQ默认的订阅恢复策略.
你可以为所有主题设置一种缓存策略,或者给每一个主题单独设置.表5.6是配置该策略时可以使用的参数.
表5.6 固定尺寸订阅恢复策略可配置属性
属性名称 默认值 描
maximumSize 6553600 The memory size in bytes for this cache
maximumSize 6553600 缓存可用的内存大小(单位:byte)
useSharedBuffer true 如果设置为true,maximumSize设置的内存大小为所有主题的缓存总额
(而不是每个主题缓存都可以达到maximumSize设置的大小)
固定数量策略【该策略根据主题中消息的数量来限制消息缓存.只有一个属性可设置】
属性名称 默认值 描述
maximumSize 100 每个主题中可缓存的消息数量最大值
基于查询的策略【该策略根据应用到每个消息的JMS属性选择器来限制缓存消息数量.只有一个可设置参数】
表5.8 基于查询的策略配置参数列表
属性名称 默认值 描述
query null 当消息符合设置选择器时,缓存消息.
时间策略【该策略根据消息的过期时间来缓存主题中的消息.注意,消息的过期时间是独立的,该过期时间由消息生产者设置消息的timeToLive参数决定】
属性名称 默认值 描述
recoverDuration 60000 消息的缓存时间(毫秒)
最终映像策略【该策略仅缓存发送到主题的最后一个消息.在实时的价格信息中,每个主题就是一个价格信息,这个策略很有用,
因为你可能仅仅关注最后一个发送给主题的价格信息.该策略没有配置属性】
无缓存策略【该策略禁止缓存主题消息.该策略也没有配置属性.】
5.6.3 配置订阅恢复策略【在ActiveMQ代理的配置中,可以为每个独立的主题配置subscriptionRecoveryPolicy,或者也可以使用通配符为多个主题配置策略】
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<broker brokerName="test-broker" persistent="true" useShutdownHook="false"
deleteAllMessagesOnStartup="true"
xmlns="http://activemq.apache.org/schema/core">
<transportConnectors>
<transportConnector uri="tcp://localhost:61635"/>
</transportConnectors>
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry topic="Topic.FixedSizedSubs.>">
<subscriptionRecoveryPolicy>
<fixedSizeSubscriptionRecoveryPolicy maximumSize="2000000" useSharedBuffer="false"/>
</subscriptionRecoveryPolicy>
</policyEntry>
<policyEntry topic="Topic.LastImageSubs.>">
<subscriptionRecoveryPolicy>
<lastImageSubscriptionRecoveryPolicy/>
</subscriptionRecoveryPolicy>
</policyEntry>
<policyEntry topic="Topic.NoSubs.>">
<subscriptionRecoveryPolicy>
<noSubscriptionRecoveryPolicy/>
</subscriptionRecoveryPolicy>
</policyEntry>
<policyEntry topic="Topic.TimedSubs.>">
<subscriptionRecoveryPolicy>
<timedSubscriptionRecoveryPolicy recoverDuration="25000"/>
</subscriptionRecoveryPolicy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
</broker>
</beans>