ActiveMQ队列消息过期时间设置和自动清除解决方案
版本 apache-activemq-5.15.3
1、消息过期设置
参数详情
1)message过期则客户端不能接收
2)ttlCeiling:表示过期时间上限(程序写的过期时间不能超过此时间,超过则以此时间为准)
3)zeroExpirationOverride:表示过期时间(给未分配过期时间的消息分配过期时间)
配置示例
-
<broker>
-
...
-
<plugins>
-
<!-- 86,400,000ms = 1 day -->
-
<timeStampingBrokerPluginttlCeiling="30000" zeroExpirationOverride="30000" />
-
</plugins>
-
...
-
</broker>
2、死信队列设置
消息过期后会进入死信队列,如不想抛弃死信队列,默认进入ACTIVEMQ.DLQ队列,且不会自动清除;对于过期的消息进入死信队列还有一些可选的策略:放入各自的死信通道、保存在一个共享的队列(默认),且可以设置是否将过期消息放入队列的开关以及死信队列消息过期时间。
1)直接抛弃死信队列
AcitveMQ提供了一个便捷的插件:DiscardingDLQBrokerPlugin,来抛弃DeadLetter。如果开发者不需要关心DeadLetter,可以使用此策略。
配置示例
-
<broker>
-
...
-
<plugins>
-
<!-- 丢弃所有死信-->
-
<discardingDLQBrokerPlugindropAll="true" dropTemporaryTopics="true" dropTemporaryQueues="true" />
-
<!-- 丢弃指定死信-->
-
<!-- <discardingDLQBrokerPlugindropOnly="MY.EXAMPLE.TOPIC.29 MY.EXAMPLE.QUEUE.87" reportInterval="1000" />-->
-
<!--使用丢弃正则匹配到死信-->
-
<!--<discardingDLQBrokerPlugindropOnly="MY.EXAMPLE.TOPIC.[0-9]{3} MY.EXAMPLE.QUEUE.[0-9]{3}" reportInterval="3000"/>-->
-
</plugins>
-
...
-
</broker>
2)定时抛弃死信队列
默认情况下,ActiveMQ永远不会过期发送到DLQ的消息。但是,从ActiveMQ 5.12开始,deadLetterStrategy支持expiration属性,其值以毫秒为单位。
配置示例
-
<policyEntryqueue=">"…>
-
...
-
<deadLetterStrategy>
-
<sharedDeadLetterStrategy processExpired="true" expiration="30000"/>
-
</deadLetterStrategy>
-
...
-
</policyEntry>
3、慢消费者策略设置
Broker将会启动一个后台线程用来检测所有的慢速消费者,并定期关闭关闭它们;中断慢速消费者,慢速消费将会被关闭。abortConnection是否关闭连接;如果慢速消费者最后一个ACK距离现在的时间间隔超过阀maxTimeSinceLastAck,则中断慢速消费者。
配置示例
-
<policyEntryqueue=">"…>
-
…
-
<slowConsumerStrategy>
-
<abortSlowConsumerStrategyabortConnection="false"/> <!--不关闭底层链接-->
-
</slowConsumerStrategy>
-
…
-
</policyEntry>
4、测试
1)配置activemq.xml;
2)批量消息发送;
3)等待若干秒,消息减少;
4)等待若干秒,消息队列清除(设置了抛弃死信队列);
5)等待若干秒,消息队列清除(未设置抛弃死信队列,设置了死信队列过期时间);
6)等待若干秒,消息队列清除(不抛弃死信队列,死信队列不过期);
5、参考网址
https://my.oschina.net/coderedrain/blog/724943?utm_source=tuicool&utm_medium=referral
http://ask.csdn.net/questions/376817
http://activemq.apache.org/message-redelivery-and-dlq-handling.html
完整配置
-
<!--
-
Licensed to the Apache Software Foundation (ASF) under one or more
-
contributor license agreements. See the NOTICE file distributed with
-
this work for additional information regarding copyright ownership.
-
The ASF licenses this file to You under the Apache License, Version 2.0
-
(the "License"); you may not use this file except in compliance with
-
the License. You may obtain a copy of the License at
-
-
http://www.apache.org/licenses/LICENSE-2.0
-
-
Unless required by applicable law or agreed to in writing, software
-
distributed under the License is distributed on an "AS IS" BASIS,
-
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
See the License for the specific language governing permissions and
-
limitations under the License.
-
-->
-
<!-- START SNIPPET: example -->
-
<beans
-
xmlns="http://www.springframework.org/schema/beans"
-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-
http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
-
-
<!-- Allows us to use system properties as variables in this configuration file -->
-
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
-
<property name="locations">
-
<value>file:${activemq.conf}/credentials.properties</value>
-
</property>
-
</bean>
-
-
<!-- Allows accessing the server log -->
-
<bean id="logQuery" class="io.fabric8.insight.log.log4j.Log4jLogQuery"
-
lazy-init="false" scope="singleton"
-
init-method="start" destroy-method="stop">
-
</bean>
-
-
<!--
-
The <broker> element is used to configure the ActiveMQ broker.
-
-->
-
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" schedulePeriodForDestinationPurge="10000">
-
<destinationPolicy>
-
<policyMap>
-
<policyEntries>
-
<policyEntry queue=">" gcInactiveDestinations="true" inactiveTimoutBeforeGC="30000">
-
<deadLetterStrategy>
-
<sharedDeadLetterStrategy processExpired="true" expiration="30000"/>
-
</deadLetterStrategy>
-
</policyEntry>
-
<policyEntry topic=">" >
-
<!-- The constantPendingMessageLimitStrategy is used to prevent
-
slow topic consumers to block producers and affect other consumers
-
by limiting the number of messages that are retained
-
For more information, see:
-
http://activemq.apache.org/slow-consumer-handling.html
-
-->
-
<pendingMessageLimitStrategy>
-
<constantPendingMessageLimitStrategy limit="1000"/>
-
</pendingMessageLimitStrategy>
-
</policyEntry>
-
</policyEntries>
-
</policyMap>
-
</destinationPolicy>
-
-
<!--
-
The managementContext is used to configure how ActiveMQ is exposed in
-
JMX. By default, ActiveMQ uses the MBean server that is started by
-
the JVM. For more information, see:
-
http://activemq.apache.org/jmx.html
-
-->
-
<managementContext>
-
<managementContext createConnector="false"/>
-
</managementContext>
-
-
<!--
-
Configure message persistence for the broker. The default persistence
-
mechanism is the KahaDB store (identified by the kahaDB tag).
-
For more information, see:
-
-
http://activemq.apache.org/persistence.html
-
-->
-
<persistenceAdapter>
-
<kahaDB directory="${activemq.data}/kahadb"/>
-
</persistenceAdapter>
-
<!--
-
The systemUsage controls the maximum amount of space the broker will
-
use before disabling caching and/or slowing down producers. For more information, see:
-
http://activemq.apache.org/producer-flow-control.html
-
-->
-
<systemUsage>
-
<systemUsage>
-
<memoryUsage>
-
<memoryUsage percentOfJvmHeap="70" />
-
</memoryUsage>
-
<storeUsage>
-
<storeUsage limit="100 gb"/>
-
</storeUsage>
-
<tempUsage>
-
<tempUsage limit="50 gb"/>
-
</tempUsage>
-
</systemUsage>
-
</systemUsage>
-
-
<!--
-
The transport connectors expose ActiveMQ over a given protocol to
-
clients and other brokers. For more information, see:
-
http://activemq.apache.org/configuring-transports.html
-
-->
-
<transportConnectors>
-
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
-
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
-
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
-
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
-
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
-
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
-
</transportConnectors>
-
-
<!-- destroy the spring context on shutdown to stop jetty -->
-
<shutdownHooks>
-
<bean xmlns="http://www.springframework.org/schema/beans" class="org.apache.activemq.hooks.SpringContextHook" />
-
</shutdownHooks>
-
-
<plugins>
-
<!-- 86,400,000ms = 1 day -->
-
<timeStampingBrokerPlugin ttlCeiling="30000" zeroExpirationOverride="30000" />
-
<!-- <discardingDLQBrokerPlugin dropAll="true" dropTemporaryTopics="true" dropTemporaryQueues="true" />-->
-
</plugins>
-
</broker>
-
-
<!--
-
Enable web consoles, REST and Ajax APIs and demos
-
The web consoles requires by default login, you can disable this in the jetty.xml file
-
Take a look at ${ACTIVEMQ_HOME}/conf/jetty.xml for more details
-
-->
-
<import resource="jetty.xml"/>
-
</beans>
-
<!-- END SNIPPET: example -->
ActiveMQ队列消息过期时间设置和自动清除解决方案的更多相关文章
- RabbitMQ 设置队列的过期时间
设置队列的过期时间非常简单,在声明队列时,设置x-expires参数即可.当队列的生存周期超时后,RabbitMQ server会自动将该队列删除. 代码如下: channel.QueueDeclar ...
- 面试官:RabbitMQ过期时间设置、死信队列、延时队列怎么设计?
哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 RabbitMQ我们经常的使用, ...
- 为什么一段时间后网站后台自动退出 php中session过期时间设置
修改php配置文件中的session.gc_maxlifetime.如果想了解更多session回收机制,继续阅读.(本文环境php5.2) 概述:每一次php请求,会有1/100的概率(默认值)触发 ...
- rabbitmq设置队列消息存活时间
public static final int ALIVETIME = 600000; public static final String QUEUE = "hnyz_gs_queue&q ...
- RabbitMQ(三)RabbitMQ消息过期时间(TTL)
在RabbitMQ(二)AMQP协议mandatory和immediate标志位区别中我们提到,在RabbitMQ3.0以后的版本里,去掉了immediate参数支持,要实现类似的确认功能要使用TTL ...
- [ASP.NET] 如果将缓存“滑动过期时间”设置为1秒会怎样?
今天编写了一个采用ASP.NET Caching的组件,在为它编写Unit Test的过程中发现了一个有趣的问题,接下来我通过一个简单的实例说明这个问题.我们在一个控制台应用中编写了如下一段程序,这个 ...
- redis基本操作和 过期时间设置以及持久化方案
Redis是NOSQL阵营中的一种数据库,主要用于存储缓存 五大数据类型:字符串(String).散列(hash).列表(list).集合(set).有序集合(SortedSett .zset) St ...
- srpingboot2 session过期时间设置
springboot2 设置session过期的配置 server.servlet.session.timeout = 1800 而不再是 server.session.timeout=1800
- jquery.cookie.js存与取以及过期时间设置
$(function(){ $(".active_out .abtn").click(function(){ $(this).parents(".active_out&q ...
随机推荐
- 学习率(Learning rate)的理解以及如何调整学习率
1. 什么是学习率(Learning rate)? 学习率(Learning rate)作为监督学习以及深度学习中重要的超参,其决定着目标函数能否收敛到局部最小值以及何时收敛到最小值.合适的学习率 ...
- Hive与Hbase的区别
1. 两者分别是什么? Apache Hive是一个构建在Hadoop基础设施之上的数据仓库.通过Hive可以使用HQL语言查询存放在HDFS上的数据.HQL是一种类SQL语言,这种语言最终被 ...
- scrapy-继承默认的user-agent 中间件
class MyUserAgentMiddleware(UserAgentMiddleware): def __init__(self, user_agent): self.user_agent = ...
- 面试问题总结二(技术能力-PHP)----Ⅰ
1.你都做过什么项目? 答:第一份实习工作接触的项目是CRM 销售管理系统,一款用JSP语言开发的进销存管理系统.第一份正式工作是一款主打高质量图片社交社区网站项目,“美啦周末”(后改型为”聊会儿”) ...
- [转帖] go的import 语法
package 的导入语法写 Go 代码的时经常用到 import 这个命令用来导入包,参考如下: import( "fmt" ) 然后在代码里面可以通过如下的方式调用: fmt. ...
- sql 设计规范
设计规范: 1.采用有意义的字段名 尽可能地把字段描述的清楚些.当然,也别做过头了,比如CustomerShippingAddressStreetLine1虽然很富有说明性,但没人愿意键入这么长的名字 ...
- JDBC的基础接口及其用法
JDBC基础 所谓JDBC即是:Java DataBase Connectivity,java与数据库的连接.是一些用来执行SQL语句的Java API. 我们进行JDBC的编程,主要常用的几个概念: ...
- 网页正文提取,降噪的实现(readability/Document)
安装: pip install readability-lxml 使用: # encoding:utf-8import html2textimport requestsimport refrom re ...
- Task的运行原理和工作窃取
在net4.0以前,当调用ThreadPool.QueueUserWorkItem方法往线程池中插入作业时,会把作业内容(其实就是一个委托)放到线程池中的一个全局队列中,然后线程池中的线程按照先进先出 ...
- Windows下CURL扩展无效之终极解决办法。
本地开发环境使用WAMP快速搭建,在使用PHP的CURL时可能会存在无法载入情况,这里提供终极解决方法. 1.在php.ini配置文件中启用 php_curll.dll 扩展: (环境已经自动附带 l ...