I've created a bug
https://bugs.eclipse.org/bugs/show_bug.cgi?id=441960, so we can
track this requirement and any discussion about it.
I think I am convinced of the need of an application-defined ping
request when:
1) the keepalive interval is large due to the wish to keep the
TCP/IP traffic low (e.g. battery life, cost of network traffic)
2) some event occurs which the application knows about, but the MQTT
library doesn't (like network connectivity change)
an explicit ping call would allow this, assuming that connectionLost
was called within a "reasonable" amount of time, not in this case
the long keepalive interval.
Ian
On 08/18/2014 10:28 AM, Bin BJ Zhang
wrote:
Yes, I total agree with Ian
the Ping interface is NOT well designed, and should avoid it
whenever possible.
"
The requirement is, whenever
network connectivity changes, I want to send an explicit
forced ping to ensure the connection is live and I am able
to receive message with same connection. If not it should
terminate existing connection and I will reconnect then.
"
I think the connectionLost will be called each time the network connectivity changes,
it means the socket is broken and then the ping is
meaningless.
And I don't think you can reuse
the previous connection. If the socket is broken you will
need to reconnect.
So, force ping is not really
necessary in my opinion.
Best Regards,
Bin Zhang(张斌)
--------------------------------------------------------------------------------------------
WebSphere MQ, IBM China Software Development Lab
Notes: Bin BJ Zhang/China/IBM
E-Mail: zhbinbj@xxxxxxxxxx
Address: Ring Building 3F, ZhongGuanCun Software Park,
DongBeiWang West Road No.8,
Haidian District, Beijing, 100193, China
-------------------------------------------------------------------------------------------
Ian Craggs ---08/17/2014 05:52:50
AM---Hi Prashant, so looking at the documentation here:
From: Ian Craggs
<icraggs@xxxxxxxxxxxxxxxxxxxxxxx>
To: paho-dev@xxxxxxxxxxx
Date: 08/17/2014 05:52 AM
Subject: Re: [paho-dev] Android - Paho Mqtt
client does not receive messages once network connectivity
changes (mobile data disabled and enabled again)
Sent by: paho-dev-bounces@xxxxxxxxxxx
Hi Prashant,
so looking at the documentation here: http://www.eclipse.org/paho/files/javadoc/index.html
I see that an interface MqttPingSender has been introduced to
allow an application to implement its own ping strategy. I must
admit that this does not look like the sort of interface I was
expecting.
Bin, Al - could you explain to me how this is supposed to be
used? Naively I might have expected a method called Ping() in
the client API where additional pings could be sent by the
application as required. Is anything more than this really
necessary?
Ian
On 15/08/14 21:42, Prashant Kedia wrote:
Hi,
This is how I have implemented
explicit forced ping as of now.
public class EnhancedMqttClient
extends MqttClient {
protected static final String
TAG_CLASS_NAME = EnhancedMqttClient.class
.getName();
private ExecutorService executor;
private Object lock = new Object();
public EnhancedMqttClient(Context
context, String serverURI,
String clientId,
MqttClientPersistence persistence)
throws MqttException {
super(serverURI, clientId,
persistence);
aClient = new
MyMqttAsyncClient(serverURI, clientId, persistence);
}
public void ping() throws
MqttException {
try {
executor =
Executors.newSingleThreadExecutor();
executor.submit(new
PingExecutor()).get(10, TimeUnit.SECONDS);
} catch (TimeoutException e) {
Log.e(TAG_CLASS_NAME, "Ping Failure
- Timeout");
disconnectForcibly(1000, 1000);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} finally {
executor.shutdownNow();
}
}
private class PingExecutor
implements Callable<Boolean> {
@Override
public Boolean call() throws
Exception {
MqttDeliveryToken token = new
MqttDeliveryToken(getClientId());
token.setActionCallback(new
IMqttActionListener() {
@Override
public void onSuccess(IMqttToken
asyncActionToken) {
System.out.println("Ping Success");
synchronized (lock) {
lock.notify();
}
}
@Override
public void onFailure(IMqttToken
asyncActionToken, Throwable exception) {
System.out.println("Ping Failed");
try {
if (isConnected()) {
disconnectForcibly(1000, 1000);
}
} catch (MqttException e) {
e.printStackTrace();
}
}
});
MqttPingReq pingMsg = new
MqttPingReq();
((MyMqttAsyncClient)
aClient).getClientComms().sendNoWait(pingMsg, token);
synchronized (lock) {
lock.wait();
}
return true;
}
}
}
There are two issues with this
implementation.
1) onFailure callback
MqttDeliveryToken does not gets called every time ping fails.
That's why I had to implement timer here with the help of
ExecutorService.
2) On failure I call
disconnectForcibly. It terminates all the mqtt
callback threads and disconnect client as expected, but it
does not make a call to mqtt callback connectionLost as there
is no cause for shutdown here.
Please let me know if there is any
better way to implement the same.
On Fri, Aug 15, 2014 at 11:13 AM,
Prashant Kedia <prashantkedia22@xxxxxxxxx> wrote:
Yes, It detects network connectivity changes.
On Fri, Aug 15, 2014 at 4:19 AM,
Ian Craggs <icraggs@xxxxxxxxxxxxxxxxxxxxxxx> wrote:
Hi Prashant,
how will your application know when to send the ping?
Will it detect the network connectivity change?
Ian
On 08/14/2014 04:48 PM, Prashant
Kedia wrote:
--
Ian Craggs
icraggs@xxxxxxxxxx IBM United Kingdom
Committer on Paho, Mosquitto
_______________________________________________
paho-dev mailing list
paho-dev@xxxxxxxxxxx
To change your delivery options, retrieve your password,
or unsubscribe from this list, visit
https://dev.eclipse.org/mailman/listinfo/paho-dev
--
Thanks and
Regards,
Prashant Kedia
Co-Founder and
Developer
Bizlers
Technologies Pvt. Ltd.
--
Thanks and Regards,
Prashant Kedia
Co-Founder and
Developer
Bizlers
Technologies Pvt. Ltd.
_______________________________________________
paho-dev mailing list
paho-dev@xxxxxxxxxxx
To change your delivery options, retrieve your password, or
unsubscribe from this list, visit
https://dev.eclipse.org/mailman/listinfo/paho-dev
_______________________________________________
paho-dev mailing list
paho-dev@xxxxxxxxxxx
To change your delivery options, retrieve your password, or
unsubscribe from this list, visit
https://dev.eclipse.org/mailman/listinfo/paho-dev
_______________________________________________
paho-dev mailing list
paho-dev@xxxxxxxxxxx
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://dev.eclipse.org/mailman/listinfo/paho-dev
--
Ian Craggs
icraggs@xxxxxxxxxx IBM United Kingdom
Committer on Paho, Mosquitto
|