Mqtt Paho - 尝试在经纪人无法访问时发布

时间:2014-01-21 21:21:00

标签: java groovy mqtt

我开始使用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()
    }

由于

3 个答案:

答案 0 :(得分:3)

Paho客户端只有在连接到代理时才会保留在线消息。

通常,当连接问题开始到来时,您会看到弹出消息超时

  • 等待来自服务器的响应超时(32000)

此时该消息仍将保留。

然而,当连接丢失时,您开始看到这个

  • 客户端未连接(32104)

您应该假设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