Apache Camel MQTT-消息代理关闭时不会引发异常

时间:2018-09-05 07:43:59

标签: exception-handling apache-camel out-of-memory mqtt except

我目前正在使用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);

1 个答案:

答案 0 :(得分:0)

因此,对于您设置的QOS级别,这是正确的行为。您正在将QOS标志设置为QoS.AT_MOST_ONCE.toString()。这就是所谓的QOS 2级。

QOS 2的简短摘要–仅一次

此级别保证邮件仅发送一次。如果存在网络问题并且无法传递,则消息将保留在客户端队列中,直到可以传递为止。这是最慢的QOS级别,因为它需要4条消息。

  1. 发件人发送消息并等待确认(PUBREC)

  2. 接收方发送PUBREC消息

  3. 如果发件人未收到确认(PUBREC),它将重新发送消息 设置了DUP标志。

  4. 发件人收到确认消息PUBREC时,便发送消息释放消息(PUBREL)。
  5. 如果发件人未收到PUBREL,它将重新发送PUBREC消息
  6. 接收方收到PUBREL消息后,现在可以将消息转发到任何订户上。
  7. 接收者然后发送发布完成(PUBCOMP)。
  8. 如果发件人未收到PUBCOMP消息,它将重新发送PUBREL消息。
  9. 发件人收到PUBCOMP后,该过程完成,它可以从出站队列中删除邮件。

请参阅此blog entry for more informaton

最重要的部分是,在您的情况下,接收器不可用,因此QOS 2的MQTT协议无法完成。