消费者重启后,RabbitMQ停止向消费者发送MQTT消息

时间:2017-11-24 10:43:13

标签: java rabbitmq openshift mqtt

我在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在消费者断开连接后不知道在哪里恢复,所以它只是停止传递消息。有点悲观锁定......: - )

1 个答案:

答案 0 :(得分:0)

您必须使用持久队列。如果填充队列是问题,那么您可以使用自动删除队列。但是这有一个缺点,即一次尝试​​传递消息,如果没有消费者,则删除队列并丢失消息。

对于你的情况,你应该看看死信交换(https://www.rabbitmq.com/dlx.html

如果消费者被切断并在一段时间后重新连接,则可以通过死信交换提供未处理的消息。这样,消息的顺序也不会丢失。

相关问题