我开始使用Mqtt,我很难处理不可靠的网络。 我正在使用Paho Java Client(在groovy中)向远程的Mosquitto Broker发布消息。
当代理无法访问时,有没有办法让Paho客户端持久保存消息并自动重新连接到代理并发布本地存储的消息?我是否必须自己处理所有事情,例如使用本地经纪人?
这是我的客户构建代码
String persistenceDir = config['persistence-dir'] ?: System.getProperty('java.io.tmpdir') def persistence = new MqttDefaultFilePersistence(persistenceDir) client = new MqttAsyncClient(uri, clientId, persistence) client.setCallback(this) options = new MqttConnectOptions() if (config.password) { options.setPassword(config.password as char[]) options.setUserName(config.user) } options.setCleanSession(false) client.connect(options)
我的发布代码
def message = new MqttMessage(Json.encode(outgoingMessage).getBytes()) try { client?.connect(options) def topic = client.getTopic('processMsg') message.setQos(1) def token = topic.publish(message) if (client) { client.disconnect() }
由于
答案 0 :(得分:3)
Paho客户端只有在连接到代理时才会保留在线消息。
通常,当连接问题开始到来时,您会看到弹出消息超时
此时该消息仍将保留。
然而,当连接丢失时,您开始看到这个
您应该假设Paho没有保留该消息。
您可以在org.eclipse.paho.client.mqttv3.internal.ClientComms
:
/**
* Sends a message to the broker if in connected state, but only waits for the message to be
* stored, before returning.
*/
public void sendNoWait(MqttWireMessage message, MqttToken token) throws MqttException {
final String methodName = "sendNoWait";
if (isConnected() ||
(!isConnected() && message instanceof MqttConnect) ||
(isDisconnecting() && message instanceof MqttDisconnect)) {
this.internalSend(message, token);
} else {
//@TRACE 208=failed: not connected
log.fine(className, methodName, "208");
throw ExceptionHelper.createMqttException(MqttException.REASON_CODE_CLIENT_NOT_CONNECTED);
}
}
internalSend
将保留邮件,但前提是它已连接到代理。
还要考虑到Paho可以处理的最大机上信息数量。如果超过该值,它也将决定不再保留该消息。
答案 1 :(得分:1)
您可以设置本地代理并与远程代理桥接。这样您就可以在本地排队所有消息,当远程代理重新联机时,所有消息都可以交付。
答案 2 :(得分:0)
是...在您收到无法传递邮件的异常后,必须将其保留或者需要重新生成邮件。
如果您打算使用本地经纪商,可以查看Really Small Message Broker(https://www.ibm.com/developerworks/community/groups/service/html/communityview?communityUuid=d5bedadd-e46f-4c97-af89-22d65ffee070)