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 队列:发送消息时消息正文为空
如何使用 Apache Camel 从 Java 类访问 JMS 队列?
如何使用 Java 将错误消息移动到 Azure 死信队列(主题 - 订阅)?