我在Camel的routeContext中定义了一个简单的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>
我有一个端点(在端点文件中定义)
<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页面 - 我在那里想到了在交换机上设置标头。但是没有消息在队列中发布。我清楚地忽略了某些东西,任何帮助都会受到赞赏。
答案 0 :(得分: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");
}