繁体   English   中英

使用者重新启动后,RabbitMQ停止将MQTT消息传递给使用者

[英]RabbitMQ stops delivering MQTT messages to consumer after consumer restarts

我在启用了MQTT插件的OpenShift上运行RabbitMQ V3.6.10实例。 我有多个带有Eclipse PAHO MQTT实现的 Spring Boot应用程序,这些应用程序使用了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);

现在我意识到,由于某些原因,如果重新启动消费类应用程序,它将不再消耗任何消息。 正如我在RabbitMQ管理控制台中看到的那样,队列中的消息已满。 RabbitMQ日志中没有错误消息。 在这种情况下唯一可行的解​​决方案是在RabbitMQ管理控制台中删除订阅队列,然后再次重新启动使用者应用程序。 也许有人遇到过类似的问题? 有人对我有提示吗? 可能RabbitMQ使用的MQTT插件和保存消息状态的PAHO实现可能存在问题。 看起来RabbitMQ在使用者断开连接后不知道从哪里恢复,因此它只是停止传递消息。 有点悲观锁... :-)

您必须使用持久队列。 如果填满队列是问题,则可以使用自动删除队列。 但这带来了一个缺点,即试图传递消息,如果没有使用方,则删除队列并丢失消息。

对于您而言,您应该查看Dead Letter Exchanges( https://www.rabbitmq.com/dlx.html

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM