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 ...
随机推荐
- IO文件的读取,以及写入文件内容
package zxc; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.Fi ...
- c++工厂模式(Factory method)
下面以女娲造黑人,白人,黄种人的例子来介绍一下工厂模式. 1.工厂的接口,相当于造人工厂总部. class IHumanFactory { public: IHumanFactory(void) { ...
- Good Time 冲刺 一
2018/6/14 我们组之前没有开发小程序的经验,所以在尝试中不断探索与学习.在完成小程序的初步注册和界面完善后,我们组开始进行开发任务. 1.1成员简述: 王怡镔:“今天主要学习小程序开发知识及相 ...
- Think In Java读书笔记:内部类覆盖及其初始化
本文相关章节:第十章 内部类 10.10 内部类可以被覆盖吗 在读至本节第二个范例代码时(及下方的代码),我对输出结果中的第一个“Egg.Yolk()”很不理解,为什么它会第一个地方输出. 我起初认为 ...
- java中的互斥锁和信号量的区别
互斥锁和信号量都是操作系统中为并发编程设计基本概念,互斥锁和信号量的概念上的不同在于,对于同一个资源,互斥锁只有0和1 的概念,而信号量不止于此.也就是说,信号量可以使资源同时被多个线程访问,而互斥锁 ...
- JavaWeb:HttpSession(一)
Session机制: 1).session机制采用的是在服务器端保持 HTTP 状态信息的方案 . 2).当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否包含 ...
- Robot Framework 教程 (2) - 页面元素定位
上一篇文章中,简单模拟了一个baidu搜索并截图的过程,在搜索过程中,我们需要对搜索框.搜索按钮进行定位.本篇文章主要介绍一下具体的定位方法. 我们的脚本如下: *** Settings *** Li ...
- python selenium 代码
from selenium import webdriver from selenium.common.exceptions import TimeoutException, NoSuchElemen ...
- sklearn-特征工程之特征选择
title: sklearn-特征工程之特征选择 date: 2016-11-25 22:49:24 categories: skearn tags: sklearn --- 抄袭/参考资料 使用sk ...
- Dubbo学习(一) Dubbo原理浅析
一.初入Dubbo Dubbo学习文档: http://dubbo.incubator.apache.org/books/dubbo-user-book/ http://dubbo.incubator ...