I have a number of QoS2 level messages that are causing problems in the scenario when the MQTT broker or client is having issues. These issues can include
Typically, when the MQTT client starts receiving timeouts or other errors from the broker, the message are stored in the persistence storage (in-flight messages) and will eventually get republished.
However, in the case where the Paho client loses the connection to the broker, messages will not be considered in-flight anymore and will not be stored by Paho. At that point it seems that the app becomes responsible for persisting these msgs (outside of paho) and re-publishing them.
Am I correct in saying that when the MQTT broker becomes unavailable, the Paho MQTT client cannot help me out in guaranteeing that these QoS2 level messages will get re-delivered ?
So how can I make the distinction between the following case, where client.publish resulted in an MqttException where Paho did not persist the message inflight.
Client is currently disconnecting (32102)
at org.eclipse.paho.client.mqttv3.internal.ClientComms.shutdownConnection(ClientComms.java:297)
at org.eclipse.paho.client.mqttv3.internal.CommsSender.handleRunException(CommsSender.java:154)
at org.eclipse.paho.client.mqttv3.internal.CommsSender.run(CommsSender.java:131)
at java.lang.Thread.run(Thread.java:745)
And the following where it did persist it inflight
Timed out waiting for a response from the server (32000)
at org.eclipse.paho.client.mqttv3.internal.Token.waitForCompletion(Token.java:94)
at org.eclipse.paho.client.mqttv3.MqttToken.waitForCompletion(MqttToken.java:50)
at org.eclipse.paho.client.mqttv3.MqttClient.publish(MqttClient.java:315)
at org.eclipse.paho.client.mqttv3.MqttClient.publish(MqttClient.java:307)
Obviously I can also start doing bookkeeping and persist all failed messages seperately, but then I might end up with QoS level 2 duplicaties (messages getting both republished by Paho and myself).
How should the client be programmed ?
Here are some exceptions and persistence behaviour by Paho
What are some of the best practices here with Paho ?
I didn't design the Java client, but I can see how this behaviour came about, and that it can be confusing. I assume that we are talking about the synchronous client here? And that all these exceptions are encountered when calling publish?
The main principles are:
but both these situations are reported as exceptions, which is unhelpful.
In the C client I follow the rules:
so you know that if you get an error, you must retry the publish call.
For the Java client we could improve the situation by:
or
create a another class of exceptions which clearly showed when the message was and was not persisted, something like
Note that we are planning "offline buffering" for release 1.2 in June, which would mean that the message can be persisted when the client is not connected.