java - Camel 未发布到 RabbitMQ 队列

标签 java apache-camel rabbitmq

我在Camel的routeContext中定义了一个简单的路由(该路由将在多个路由中使用)。

    <route id="sendToRabbitQueue">
        <from uri="direct:sendToQueue" />
        <convertBodyTo type="java.lang.String"/>
        <setHeader headerName="rabbitmq.ROUTING_KEY">
            <constant>my.routing.key</constant>
        </setHeader>
        <to uri="ref:genericRabbitEndpoint"/>
    </route>

我有一个端点(在端点文件中定义)

    <endpoint id="genericRabbitEndpoint" uri="rabbitmq://${rabbitmq.host}:${rabbitmq.port}/${rabbitmq.exchange.name}">
        <camel:property key="autoDelete" value="false" />
        <camel:property key="connectionFactory" value="#rabbitConnectionFactory" />
    </endpoint>

是的 - 我已经看到 http://camel.apache.org/rabbitmq.html页面 - 这就是我在交换上设置标题的想法的地方。但是队列上没有发布任何消息。我显然忽略了一些事情,任何帮助将不胜感激。

最佳答案

所以这看起来有点像一个陷阱,答案与我没有包含在问题中的部分路线有关,因为我认为它不相关。

路由从 RabbitMQ 端点(上面未包含)开始。因此,交换器在到达时会设置一些 RabbitMQ header :

  • rabbitmq.ROUTING_KEY
  • rabbitmq.EXCHANGE_NAME
  • rabbitmq.DELIVERY_TAG

这些 header 在路由的整个生命周期中使用,并且当我尝试在不同的 RabbitMQ 端点上发布时,它们似乎会覆盖这些值。我解决的方法是引入一个可以去除标题的 bean。我认为这不是理想的行为......

public void stripRabbitHeaders(@Headers Map headers)
{
    headers.remove("rabbitmq.ROUTING_KEY");
    headers.remove("rabbitmq.DELIVERY_TAG");
    headers.remove("rabbitmq.EXCHANGE_NAME");
}

关于java - Camel 未发布到 RabbitMQ 队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32380661/

相关文章:

javascript - 仅当监听器存在时才发布消息?

java - 新对象创建最佳实践(对于这种情况)

java - 如何解析限定名称表达式中的字段

java - 如何查看android类里面有什么?

java - WebSphere MQ 配置问题

java - Camel Bindy 不适本地转换 BigDecimal

jms - 退避在 Apache Camel 重新交付中不起作用

java - 如何使用 Camel 邮件调整imap的轮询频率

symfony - 将交换绑定(bind)到 Symfony 消息组件中的交换

java - 使用具有特定路由键的消息?