我在OpenShift上运行了一个带有MQTT插件的RabbitMQ V3.6.10实例。我有多个Spring Boot应用程序,其中Eclipse PAHO MQTT implementation消耗来自RabbitMQ队列的消息。所有消费者都使用MqttDefaultFilePersistence
。持久性数据将写入具有100M配额的持久卷上的目录/tmp/mqtt
。这是我写的连接到RabbitMQ队列的代码:
MqttConnectOptions options = new MqttConnectOptions();
options.setUserName(username);
options.setPassword(password.toCharArray());
options.setCleanSession(false);
options.setAutomaticReconnect(reconnect);
MqttClient mqttClient = new MqttClient(serverUri, "MyConsumerApp", new MqttDefaultFilePersistence("/tmp/mqtt"));
mqttClient.connect(options);
现在我认识到,由于某些原因,如果重新启动cosumer应用程序,它不再消耗任何消息。正如我在RabbitMQ管理控制台中看到的那样,队列中的消息正在填满。 RabbitMQ日志中没有错误消息。在这种情况下,唯一可行的解决方案是删除RabbitMQ管理控制台中的订阅队列并再次重新启动使用者应用程序。也许有人遇到类似的问题?有没有人暗示我这里发生了什么?也许RabbitMQ使用的MQTT插件和PAHO实现保持消息状态存在问题。看起来像RabbitMQ在消费者断开连接后不知道在哪里恢复,所以它只是停止传递消息。有点悲观锁定......: - )
答案 0 :(得分:0)
您必须使用持久队列。如果填充队列是问题,那么您可以使用自动删除队列。但是这有一个缺点,即一次尝试传递消息,如果没有消费者,则删除队列并丢失消息。
对于你的情况,你应该看看死信交换(https://www.rabbitmq.com/dlx.html)
如果消费者被切断并在一段时间后重新连接,则可以通过死信交换提供未处理的消息。这样,消息的顺序也不会丢失。