apache camel - 为deadletter queue添加消息警报

时间:2016-02-18 10:56:30

标签: java apache-camel rabbitmq alerts

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”。一切正常。

我的问题是

  

当消息到达deadletter队列时,我想添加警报,以便我们知道对它做些什么......当消息到达死信队列时,我怎么能添加电子邮件警报。如果警报失败,我不想丢失原始消息 - 我也不希望警报消耗该消息。

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

2 个答案:

答案 0 :(得分:2)

您可以使用multicast(详情here)拆分邮件以转到多个端点:

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

这使用了here描述的camel邮件组件端点。或者,您可以在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错误队列来通知其他进程或消费者错误或安排重试。

答案 1 :(得分:1)

有两种方法可以执行此操作,但根据您的消息量,您可能不希望在每条失败的消息上发送电子邮件。

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

如果你想在制作人那边做。您可以使用AndyN提供的任何一种解决方案