在以下三种情况中,ActiveMQ消息会被重发给客户端/消费者:
1.使用一个事务session,并且调用了rollback()方法;
2.一个事务session,关闭之前调用了commit;
3.在session中使用CLIENT_ACKNOWLEDGE签收模式,并且调用了Session.recover()方法。
Broker根据自己的规则,通过BrokerInfo命令包和客户端建立连接,向客户端传送缺省发送策略。但是客户端可以使用ActiveMQConnection.getRedeliveryPolicy()方法覆盖override这个策略设置。
RedeliveryPolicy policy = connection.getRedeliveryPolicy();
policy.setInitialRedeliveryDelay(500);
policy.setBackOffMultiplier(2);
policy.setUseExponentialBackOff(true);
policy.setMaximumRedeliveries(2);
一旦消息重发尝试超过重发策略中配置的maximumRedeliveries(缺省为6次)时,会给broker发送一个"Poison ack",通知它,这个消息被认为是一个毒丸(a poison pill),接着broker会将这个消息发送到DLQ(Dead Letter Queue),以便后续分析处理。
缺省死信队列(Dead Letter Queue)叫做ActiveMQ.DLQ;所有的未送达消息都会被发送到这个队列,以致会非常难于管理。你可以设置activemq.xml文件中的destination policy map的"individualDeadLetterStrategy"属性来修改.
<broker...>
<destinationPolicy>
<policyMap>
<policyEntries>
<!-- Set the following policy on all queues using the '>' wildcard -->
<policyEntry queue=">">
<deadLetterStrategy>
<!--
Use the prefix 'DLQ.' for the destination name, and make
the DLQ a queue rather than a topic
-->
<individualDeadLetterStrategy
queuePrefix="DLQ." useQueueForQueueMessages="true" />
</deadLetterStrategy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
...
</broker>
自动丢弃过期消息(Expired Messages)
一些应用可能只是简单的丢弃过期消息,而不想将它们放到DLQ中,完全跳过了DLQ。在dead letter strategy死信策略上配置processExpired属性为false,可以实现这个功能。
<broker...>
<destinationPolicy>
<policyMap>
<policyEntries>
<!-- Set the following policy on all queues using the '>' wildcard -->
<policyEntry queue=">">
<!--
Tell the dead letter strategy not to process expired messages
so that they will just be discarded instead of being sent to
the DLQ
-->
<deadLetterStrategy>
<sharedDeadLetterStrategy processExpired="false" />
</deadLetterStrategy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
...
</broker>
将非持久消息(non-persistent messages)放入死信队列
ActiveMQ缺省不会将未发到的非持久消息放入死信队列。如果一个应用程序并不想将消息message设置为持久的,那么记录下来那些未发送到的消息对它来说往往也是没有价值的。不过如果想实现这个功能,可以在dead-letter strategy死信策略上设置processNonPersistent="true"
<broker...>
<destinationPolicy>
<policyMap>
<policyEntries>
<!-- Set the following policy on all queues using the '>' wildcard -->
<policyEntry queue=">">
<!--
Tell the dead letter strategy to also place non-persisted messages
onto the dead-letter queue if they can't be delivered.
-->
<deadLetterStrategy>
<sharedDeadLetterStrategy processNonPersistent="true" />
</deadLetterStrategy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
...
</broker>
分享到:
相关推荐
springboot整合 activeMq 消费者 消费接收消息 包含队列模式点对点发 以及 主题模式一对多 这是消费者的demo consumer 。 里面有消息重发机制,手动确认ACK模式。 配合 producer 生产者demo使用。
为了确保消息处理的高效性,ActiveMQ提供了慢消费者策略来处理那些处理消息速度过慢的消费者。该策略可以通过定期检查所有慢速消费者并在达到一定阈值时中断它们,以提高系统的整体性能。 ##### 配置示例 ```xml ...
ActiveMQ 队列消息过期时间设置和自动清除解决方案 ActiveMQ 是一个开源的消息队列系统,用于实现分布式系统之间的异步通信。在使用 ActiveMQ 时,消息过期时间设置和自动清除是一个非常重要的问题。本文将介绍 ...
在本文中,我们将深入探讨如何将Spring Boot与ActiveMQ整合,以及如何利用它来实现队列、主题、消息手动确认和重发机制。ActiveMQ是Apache软件基金会开发的一个开源消息中间件,它允许应用程序通过发布/订阅(pub/...
4. **定义消息监听器容器**:Spring提供`DefaultMessageListenerContainer`或`JmsTemplate`来处理消息的消费。监听器容器会自动连接到ActiveMQ服务器,订阅主题并处理接收到的消息。 5. **编写生产者**:在Spring...
对于非持久化消息,如果必须要使用,应当尽可能地增加临时文件的存储限制,并及时处理消息。 4. ActiveMQ的性能问题 在某些情况下,使用ActiveMQ可能会遇到性能瓶颈,例如,消息发送速度缓慢。这可能与客户端和...
3. 路由和过滤:ActiveMQ提供丰富的消息路由和过滤选项,如主题(Topics)、队列(Queues)、虚拟主题(Virtual Topics)等,可以根据业务需求定制消息的分发策略。 4. 事务和持久化:ActiveMQ支持事务性消息处理,...
ActiveMQ是Apache软件基金会开发的消息队列产品,它遵循开放标准,如JMS(Java Message Service)和AMQP(Advanced Message Queuing Protocol),提供跨语言的API和协议支持,可以处理各种消息传递模式,如点对点、...
在SpringBoot中集成ActiveMQ,可以方便地处理消息的生产和消费。 MQTT协议是为设备到设备的通信设计的,特别适合物联网(IoT)场景。它的主要特点是轻量级、低开销以及支持大量连接。MQTT使用发布/订阅模型,发布者将...
6. **高级特性**:探讨ActiveMQ的事务管理、消息优先级、DLQ(死信队列)和消息重试等高级特性,以及如何利用这些特性优化系统性能和稳定性。 7. **安全性与网络配置**:介绍如何设置用户权限,保护ActiveMQ服务器...
**ActiveMQ**是一款流行的开源消息中间件,它遵循JMS(Java消息服务)1.1标准,为应用程序提供了高效、可扩展、稳定和安全的企业级消息通信能力。作为一款成熟的面向消息的中间件(MOM),ActiveMQ支持多种消息传输...
通过理解服务器宕机时的数据存储策略,处理丢消息的策略,优化持久化消息的发送,调整prefetch机制以确保消息公平分配,以及利用死信队列来处理异常情况,我们可以更好地利用ActiveMQ构建健壮的分布式系统。
1. **ActiveMQ服务器核心库**:这是运行ActiveMQ服务器的基础,包含处理消息发送、接收、存储和转发的核心逻辑。主要的Jar包有`activemq-all.jar`,这个文件包含了所有运行所需的基本功能。 2. **JMS接口**:Java ...
3. **高可用性**:通过集群和复制策略,ActiveMQ可以实现故障转移和负载均衡,保证服务的连续性。 4. **消息优先级与时间戳**:消息可以根据优先级进行处理,同时,系统会根据时间戳自动清理过期消息,以保持高效...
- **消息分发线程池**:通过设置 `org.apache.activemq.UseDedicatedTaskRunner` 为 `false`,可以让ActiveMQ使用一个线程池来处理消息分发,而不是为每个连接分配单独的线程。 - **内存配置**:确保运行ActiveMQ的...
9. **插件体系**:ActiveMQ拥有丰富的插件体系,用户可以根据需求自定义消息过滤、路由策略等,增强了其灵活性和可扩展性。 对于计算机案例和模板建站,ActiveMQ可以作为后台服务,提供异步通信能力,处理大量并发...
你可以定义一个实现了`MessageListener`接口的类,用于接收和处理消息。配置`DefaultMessageListenerContainer`,指定ActiveMQ的接收队列和你的`MessageListener`。 4. **消息类型**:JMS支持两种消息模型:点对点...
### ActiveMQ消息总线介绍 #### 一、消息中间件(Message-Oriented Middleware, MOM)概述 ...综上所述,ActiveMQ不仅是一个强大的消息中间件,而且还是一个高度可定制和扩展的平台,非常适合于构建复杂的分布式应用。
在ActiveMQ中,我们可以自定义消息序列化和反序列化的方式,以处理不同类型的数据。这通常涉及到创建一个实现`MessageConverter`接口的类,并在Spring配置中声明使用。 **四、高级特性** 除了基本的发送和接收消息...
8. **事务处理**:学习如何在ActiveMQ中使用JMS事务确保消息的一致性和可靠性。 9. **性能监控**:ActiveMQ提供了一套强大的监控工具,包括Web控制台,可以用来查看消息的发送、接收和堆积情况,帮助优化系统性能。...