用 Camel 拦截 ActiveMQ 消息

Posted

技术标签:

【中文标题】用 Camel 拦截 ActiveMQ 消息【英文标题】:Intercept ActiveMQ message with Camel 【发布时间】:2022-01-19 15:04:53 【问题描述】:

我需要记录消息离开 ActiveMQs 队列的时间。 我有Q1,消费者是通过activemq-ra.rar在Jboss服务器上的java应用程序。

是否可以使用 Camel(包含在 ActiveMQ 中)拦截器来做到这一点? 我不是程序员,所以 XML DSL 的解决方案会很完美。

任何帮助将不胜感激。谢谢。

【问题讨论】:

【参考方案1】:

查看日志代理插件。它可以将信息输出到日志中,然后您可以使用它来构建指标。

参考:Logging Broker Plugin

【讨论】:

谢谢,但这些数据没有时间戳 日志输出一般默认包含日志输出时的时间戳。如果您需要构建报告或将日志文件放入数据库中,您还可以自定义时间戳格式以使其更易于解析 你想的是 log4 j.properties 吗?如果我在插件中设置 logConsumerEvents,那么 activemq.log 中的输出根本没有时间戳。如何强制它显示时间戳?我很感激任何提示。【参考方案2】:

使用advisoryForConsumed 并将建议消息转发到队列为我解决了这个问题。

在activemq.xml中:

<destinationPolicy>
    <policyMap>
        <policyEntries>
            <policyEntry queue="Q1" advisoryForConsumed="true"/>
        </policyEntries>
    </policyMap>
</destinationPolicy>

然后将 ActiveMQ.Advisory.MessageConsumed.Queue.Q1 转发到另一个队列 AvisoryConsumed。

<destinationInterceptors> 
    <virtualDestinationInterceptor> 
        <virtualDestinations> 
            <compositeTopic name="ActiveMQ.Advisory.MessageConsumed.Queue.Q1" >
                <forwardTo><queue physicalName="AvisoryConsumed" /> </forwardTo>
        </compositeTopic>
    </virtualDestinations>
</virtualDestinationInterceptor>

那么当一条消息被消费时,AvisoryConsumed 中就会有一条带有 brokerOutTime 的消息和原始消息的属性。

【讨论】:

以上是关于用 Camel 拦截 ActiveMQ 消息的主要内容,如果未能解决你的问题,请参考以下文章

Camel ActiveMQ 性能调优

使用 ActiveMQ、Camel 和 Spring 实现请求-回复模式

带有 ActiveMQ 集群的 Apache Camel

ActiveMq-拦截创建消息队列

Camel ActiveMQ + Spring boot 不读取 spring activemq 配置

ActiveMQ消息队列介绍(转)