骆驼组件RabbitMQ不耐用

时间:2019-09-05 13:04:22

标签: kotlin rabbitmq apache-camel

我尝试从骆驼组件向RabbitMQ发送持久消息。尽管默认选项为true,但我明确设置了此选项:

.to(ExchangePattern.InOnly, "rabbitmq:demoExchange?queue=demoQueue" +
        "&guaranteedDeliveries=true" +
        "&mandatory=true" +
        "&autoDelete=false" +
        "&durable=true")

我还创建了rabbitMQ组件:

@Bean("rabbitmq")
fun rabbitMqComponent(connectionFactory: ConnectionFactory): RabbitMQComponent {
    val rabbitMqComponent = RabbitMQComponent()
    rabbitMqComponent.connectionFactory = connectionFactory
    rabbitMqComponent.isDurable = true

    return rabbitMqComponent
}

我的连接工厂是:

@Bean
fun connectionFactory(): ConnectionFactory {
    val connectionFactory = ConnectionFactory()
    connectionFactory.host = "localhost"
    connectionFactory.port = 5672
    connectionFactory.username = "guest"
    connectionFactory.password = "guest"
    return connectionFactory
}

问题描述步骤:

  1. 发送消息给经纪人
  2. 在RabbitMQ管理中查看消息
  3. 通过以下命令停止并启动代理:
    rabbitmq服务停止
    rabbitmq服务启动
  4. 我的队列不存在

服务器重新启动后如何保存消息?

此外,我尝试使用不带骆驼的RabbitMQ进行示例,并在服务器重新启动后保存了消息。

2 个答案:

答案 0 :(得分:1)

AFAIK要使消息在代理重新启动后仍然存在,则您必须满足多种条件

  • 持久交换
  • 耐用队列
  • 邮件上的持久标记

所以我猜想durable=true的骆驼会确保满足前两个条件。也许您可以在某种管理GUI中再次检查?

但是,您的帖子中缺少第三个。 Rabbit Docs

  

队列的持久性不会使路由到该队列的消息持久化

根据Camel docs of the Rabbit component,您可以在消息上设置消息头rabbitmq.DELIVERY_MODEpersistent的值似乎为2(取自this tutorial)。

答案 1 :(得分:0)

要解决此问题,它需要使用键“ rabbitmq.DELIVERY_MODE”设置标头,例如在路由中:

.setHeader("rabbitmq.DELIVERY_MODE", simple("2"))

这里可以是2个参数:
1。非持久性
2。持久

设置此标头后,服务器重启后消息不会消失。