我目前正在使用Apache Camel及其MQTT组件。我有一条路由消耗了来自代理(Apache ActiveMQ artemis)的消息,并向其发送消息。问题是消息代理不可用时不会引发任何异常。此外,所有未发送的消息都保留在内存中,等待服务器最终重启,从而导致内存溢出。我不知道这是否与MQTT协议本身或端点的配置有关。
这是我的配置:
MQTTEndpoint mqttEndpoint = null;
mqttEndpoint = (MQTTEndpoint) mqttComponent.createEndpoint(MQTT_BROKER);
mqttEndpoint.getConfiguration().setHost(properties.getBrokerAddress());
mqttEndpoint.getConfiguration().setPublishTopicName(publishTopicName);
//mqttEndpoint.getConfiguration().setSubscribeTopicNames(subscribreTopicNames);
mqttEndpoint.getConfiguration().setUserName(properties.getBrokerUsername());
mqttEndpoint.getConfiguration().setPassword(properties.getBrokerPassword());
mqttEndpoint.getConfiguration().setSslContext(createSSLContext());
mqttEndpoint.getConfiguration().setByDefaultRetain(false);
mqttEndpoint.getConfiguration().setQualityOfService(QoS.AT_MOST_ONCE.toString());
mqttEndpoint.getConfiguration().setConnectAttemptsMax(1);
mqttEndpoint.getConfiguration().setConnectWaitInSeconds(5);
mqttEndpoint.getConfiguration().setReconnectBackOffMultiplier(1);
mqttEndpoint.getConfiguration().setDisconnectWaitInSeconds(3);
mqttEndpoint.setCamelContext(camelCtx);
答案 0 :(得分:0)
因此,对于您设置的QOS级别,这是正确的行为。您正在将QOS标志设置为QoS.AT_MOST_ONCE.toString()
。这就是所谓的QOS 2级。
QOS 2的简短摘要–仅一次
此级别保证邮件仅发送一次。如果存在网络问题并且无法传递,则消息将保留在客户端队列中,直到可以传递为止。这是最慢的QOS级别,因为它需要4条消息。
发件人发送消息并等待确认(PUBREC)
接收方发送PUBREC消息
如果发件人未收到确认(PUBREC),它将重新发送消息 设置了DUP标志。
请参阅此blog entry for more informaton。
最重要的部分是,在您的情况下,接收器不可用,因此QOS 2的MQTT协议无法完成。