Camel没有发布到RabbitMq队列

Air*_*ega 2 java apache-camel rabbitmq

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

    <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>
Run Code Online (Sandbox Code Playgroud)

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

    <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>
Run Code Online (Sandbox Code Playgroud)

是的 - 我已经看到了http://camel.apache.org/rabbitmq.html页面 - 这就是我在交换机上设置标头的想法.但是没有消息在队列上发布.我显然忽略了一些东西,任何帮助都会受到赞赏.

Air*_*ega 7

所以这看起来有点像问题,答案与路线的一部分有关,因为我不认为它是相关的.

路线从RabbitMq终点开始(不包括在上面).因此,交换机在到达时设置了一些兔子标头:rabbitmq.ROUTING_KEY rabbitmq.EXCHANGE_NAME rabbitmq.DELIVERY_TAG

这些标头在Route的生命周期中使用,当我尝试在不同的Rabbit端点发布时,它们似乎会覆盖这些值.我修复的方法是引入一个剥去标题的bean.在我看来,这不是理想行为......

public void stripRabbitHeaders(@Headers Map headers)
{
    headers.remove("rabbitmq.ROUTING_KEY");
    headers.remove("rabbitmq.DELIVERY_TAG");
    headers.remove("rabbitmq.EXCHANGE_NAME");
}
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句:您可以使用`removeHeaders(String pattern, String... excludePatterns)`轻松地从路由中删除标题 (2认同)