【问题标题】:Camel - Resolving ActiveMQ topic name when using wildcardsCamel - 使用通配符时解析 ActiveMQ 主题名称
【发布时间】:2016-03-31 02:27:07
【问题描述】:

当我阅读基于通配符的主题时,我有一个场景:

    <route id="ReadMQ">
        <from uri="jmsep://topic:sys/*/test/request" />

但是我需要根据原始输入主题名称重新路由响应,比如有人在sys/5/test/request 上发布,我应该在sys/5/test/response 上发送响应,这样我就有两个不同的请求主题和回复。如您所见,我正在使用 spring DSL 来配置我的路由,我不确定如何动态配置 &lt;to uri=... 部分。 如果您对此有任何线索,请告诉我。谢谢!

【问题讨论】:

    标签: spring apache uri activemq dsl


    【解决方案1】:

    我也在为类似的事情苦苦挣扎,并使用simple 让它工作。

    请注意,jmsep:// 似乎不正确。至少你应该像jmsep: 这样删除斜线。至少应该定义jmsep。无论如何,在下面的示例中,我假设您使用的是jms 和主题。如果不是这种情况,则该示例将不起作用。另外,someWheresomeWhereElse 应该改成正确的。

    总之,言归正传。首先让我们检查一个基本路由是否正在使用日志记录:

    <route id="ReadMQ">
        <from uri="someWhere:topic:sys/*/test/request" />
        <log loggingLevel="INFO" message="Received message with topic: ${header.JMSDestination.topicName}"/>
    </route>
    

    sys/5/test/request 发送消息,您应该能够在${ACTIVEMQ_DIR}/data/activemq.log 中看到这样的条目:Received message with topic: sys/5/test/request

    从这里开始,您应该选择一个适合您需要的enterprise integration pattern

    也许你可以摆脱以下,但我根本没有测试过:

    <route id="ReadMQ">
        <from uri="someWhere:topic:sys/*/test/request" />
        <to uri="someWhereElse:topic:${header.JMSDestination.topicName.replace("request", "response")}"/>
    </route>
    

    这再次使用简单,但您可以从 camel.apache.org/languages.html 中选择另一种语言。

    希望这会有所帮助(尽管我怀疑它会起作用)。

    【讨论】:

    • 非常感谢您的回复!我通过将主题名称设为:String topicName = exchange.getIn().getHeader("JMSDestination", String.class); 并通过从输入主题名称解析出数字来设置主题名称:exchange.setProperty("MyNumber", myNumber);,然后在路线中我的目的地为:&lt;recipientList&gt; &lt;simple&gt;jmsep://topic:pos/${property.MyNumber}/test/response &lt;/simple&gt; &lt;/recipientList&gt; 但你一针见血检索输入主题名称的头部 :-) 你的路线看起来不那么混乱,让我试试看:D
    • 如果您使用的是 Java DSL,那么将它用于响应也会更简洁。在我的回答中,我只使用了 Spring DSL,因为您提到您正在寻找 Spring DSL 中的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 2018-02-06
    • 2014-10-09
    • 2020-03-05
    相关资源
    最近更新 更多