我尝试从骆驼组件向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
}
问题描述步骤:
服务器重新启动后如何保存消息?
此外,我尝试使用不带骆驼的RabbitMQ进行示例,并在服务器重新启动后保存了消息。
答案 0 :(得分:1)
AFAIK要使消息在代理重新启动后仍然存在,则您必须满足多种条件
所以我猜想durable=true
的骆驼会确保满足前两个条件。也许您可以在某种管理GUI中再次检查?
但是,您的帖子中缺少第三个。 Rabbit Docs说
队列的持久性不会使路由到该队列的消息持久化
根据Camel docs of the Rabbit component,您可以在消息上设置消息头rabbitmq.DELIVERY_MODE
。 persistent
的值似乎为2
(取自this tutorial)。
答案 1 :(得分:0)
要解决此问题,它需要使用键“ rabbitmq.DELIVERY_MODE”设置标头,例如在路由中:
.setHeader("rabbitmq.DELIVERY_MODE", simple("2"))
这里可以是2个参数:
1。非持久性
2。持久
设置此标头后,服务器重启后消息不会消失。