[英]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.