分布式-信息方式-ActiveMQ的Destination高级特性2
使用filtered destinations,在xml配置如下:
<destinationInterceptors> <virtualDestinationInterceptor> <virtualDestinations> <compositeQueue name="MY.QUEUE"> <forwardTo> <filteredDestination selector="odd='yes'" queue="FOO" /> <filteredDestination selector="i = 5" topic="BAR" /> </forwardTo> </compositeQueue> </virtualDestinations> </virtualDestinationInterceptor> </destinationInterceptors>
避免在network连接到broker,出现重复消息:
<networkConnectors> <networkConnector uri= "static://(tcp://localhost:61616) " > <excludedDestinations> <queue physicalName="Consumer.*VirtualTopic.> " /> </ excludedDestinations> </ networkConnector> </ networkConnectors>
在ActiveMQ启动时候就创建Destination:
<broker xmlns="http://activemq.apache.org/schema/core"> <destinations> <queue physicalName="FOO.BAR" /> <queue physicalName="SOME.TOPIC" /> </destinations> </broker>
删除无用的队列
一般情况下, ActiveMQ的 queue在不使用之后,可以通过web控制台或是JMX方式耒删除掉。当
然,也可以通过配置,使得 broker可以自动探测到无用的队列(一定时间内为空的队列)并删除掉,回
收响应资源。
一种方式:可以通过web控制台或是JMX方式来删除掉
二种方式:通过配置文件,自动探测无用的队列并删除掉,回收响应资源,配置如下:
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" schedulePeriodForDestinationPurge="1000"> <destinationPolicy> <policyMap> <policyEntries> <policyEntry queue=">" gcInactiveDestinations="true" inactiveTimeoutBeforeGC="5000" /> </policyEntries> </policyMap> </destinationPolicy> </broker>
SchedulePeriodForDestinationPurge:设置多长时间检查一次。
inactiveTimeoutBeforeGC:设置当destination为空后,多长时间被删除,这里是30s,默认为60
gcInactiveDestinations:设置删除掉不活动队列,默认为false
Destination 选项
这个是给消费者在JMS规范之外添加的功能特性,通过在队列名称后面使用类似url的语法添加多个选项。包括:
1 consumer.perfetchSize,消费者持有的未确认的最大消费数量
2 consumer.maximumPendingMessageLimit: 用来控制非持久化的topic在存在慢消费者的情况下,丢弃的数量,默认为0
3 consumer.noLocal: 默认false
4 consumer.dispatchAsync: 是否异步分发,默认true
5 consumer.retroactive: 是否为回溯消费者,默认false
6 consumer.selector: JMS的selector,默认null
7 consumer.exclusive: 是否为独占消费者,默认false
8 consumer.priority:设置消费者的优先级,默认0
使用示例:
Queue queue = new ActiveMQQueue("TEST.QUEUE?consumer.dispatchAsync= false&consumer.perfetchSize=10"); Consumer consumer = session.createConsumer(queue);