apache camel - 向死信队列添加消息警报

Posted

技术标签:

【中文标题】apache camel - 向死信队列添加消息警报【英文标题】:apache camel - add message alert to deadletter queue 【发布时间】:2016-02-18 10:56:30 【问题描述】:
String queueA = "rabbitmq://host:5672/queue-a.exchange?queue=queue-a.exchange..etc

from(queueA)
  .routeId("idForQueueA")
  .onException(Exception.class)
    .maximumRedeliveries(0)
    // .processRef("sendEmailAlert")  * not sure this belongs here*
    .to(deadLetterQueueA)
    .useOriginalMessage()
  .end()
    .processRef("dataProcessing")
    .processRef("dataExporting")
  .end();

解释上面的代码:

消息取自 queueA。在各种进程成功后,消息被消费。如果失败,则将其添加到死信队列“deadLetterQueueA”。这一切正常。

我的问题是

当消息到达死信队列时,我想添加警报,以便我们知道如何处理它...当消息到达死信队列时,我如何添加电子邮件警报。如果警报失败,我不想丢失原始消息 - 我也不希望警报消耗消息。


我的想法是.. 我需要在异常上拆分消息,以便将其发送到两个不同的队列?一个用于警报,然后发出电子邮件警报,然后自行消耗。然后一个用于死信队列,只是站点在那里?但是我不知道该怎么做?

【问题讨论】:

使用Zabbix之类的监控工具来检查你的死信队列的队列深度? 【参考方案1】:

您可以使用multicast(详细信息here)将消息拆分到多个端点:

.useOriginalMessage().multicast().to(deadLetterQueueA, "smtp://username@host:port?options")

这使用here 描述的骆驼邮件组件端点。或者,您可以在to 之后继续处理消息。所以像:

.useOriginalMessage()
.to(deadLetterQueueA)
.transform().simple("Hi <name>, there has been an error on the object $body.toString")
.to("smtp://username@host:port?options")

如果您有多个收件人,您可以使用recipients list

public class EmailListBean 
    @RecipientList
    public String[] emails() 
        return new String[] "smtp://joe@host:port?options",
                "smtp://fred@host:port?options";
    


.useOriginalMessage()
.to(deadLetterQueueA)
.transform().simple("...")
.bean(EmailListBean.class)

在等待人工操作时小心使用 JMS 队列来存储消息。我不知道你收到什么样的消息流量。我假设如果您想为每次失败发送一封电子邮件,这不是很多。但是我通常会警惕这种事情,并选择使用日志记录或数据库持久性来存储错误的结果,并且只使用 JMS 错误队列来通知其他进程或消费者错误或安排重试.

【讨论】:

【参考方案2】:

有两种方法可以做到这一点,但根据您的消息量,您可能不想在每条失败的消息上都发送电子邮件。

您可以使用 AndyN 提供的解决方案,也可以使用咨询主题 ActiveMQ.Advisory.MessageDLQd.Queue.* ,每当消息进入 DLQ 时,主题的入队计数将增加 1 。通过监控队列深度,您现在可以根据发生的错误数量向其发送邮件。

如果你想在生产者端做。您可以使用 AndyN 提供的任何一种解决方案

【讨论】:

以上是关于apache camel - 向死信队列添加消息警报的主要内容,如果未能解决你的问题,请参考以下文章

Apache Camel Azure 队列:发送消息时消息正文为空

Camel JMS 确保在从死信通道取消边缘时进行排序

如何使用 Apache Camel 从 Java 类访问 JMS 队列?

如何使用 Java 将错误消息移动到 Azure 死信队列(主题 - 订阅)?

发生错误时如何暂停或减少 Camel Hazelcast SEDA 消费者的吞吐量

RabbitMQ - Apache Camel 读取消息如何处理失败的消息