Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “如何检测”;“拒绝连接”;在没有自动重新连接的情况下使用MqttAsyncClient时?_Java_Eclipse_Asynchronous_Mqtt_Paho - Fatal编程技术网

Java “如何检测”;“拒绝连接”;在没有自动重新连接的情况下使用MqttAsyncClient时?

Java “如何检测”;“拒绝连接”;在没有自动重新连接的情况下使用MqttAsyncClient时?,java,eclipse,asynchronous,mqtt,paho,Java,Eclipse,Asynchronous,Mqtt,Paho,我正在使用EclipsePAHOJava客户端进行连接。这是我的扩展回调: protected IMqttAsyncClient mClient; private final MqttCallbackExtended mCallback = new MqttCallbackExtended() { @Override public void connectComplete(boolean reconnect, String brokerAddress) { Lo

我正在使用EclipsePAHOJava客户端进行连接。这是我的扩展回调:

protected IMqttAsyncClient mClient;

private final MqttCallbackExtended mCallback = new MqttCallbackExtended() {
    @Override
    public void connectComplete(boolean reconnect, String brokerAddress) {
        Log.d(LOG_TAG, "connectComplete " + brokerAddress);
    }

    @Override
    public void connectionLost(Throwable ex) {
        Log.d(LOG_TAG, "connectionLost", ex);
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken deliveryToken) {
        Log.d(LOG_TAG, "deliveryComplete " + deliveryToken);
    }

    @Override
    public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
        Log.d(LOG_TAG, "messageArrived " + topic);
    }
};
private final IMqttActionListener mConnectionCallback = new IMqttActionListener() {
    @Override
    public void onSuccess(IMqttToken asyncActionToken) {
        Log.d(LOG_TAG, "onSuccess " + asyncActionToken);
        // do nothing, this case is handled in mCallback.connectComplete method
    }

    @Override
    public void onFailure(IMqttToken asyncActionToken, Throwable ex) {
        Log.d(LOG_TAG, "onFailure " + asyncActionToken, ex);
        // initial connect has failed
    }
};

mClient = new MqttAsyncClient(mBrokerUri, mClientName, new MemoryPersistence());
mClient.setCallback(mCallback);
mClient.connect(connectOptions, null, mConnectionCallback);
这里是连接代码:

protected void connect() throws MqttException {
    Log.d(LOG_TAG, "connect");

    MqttConnectOptions connectOptions = new MqttConnectOptions();
    connectOptions.setCleanSession(true);
    connectOptions.setAutomaticReconnect(false);
    connectOptions.setUserName(MQTT_USERNAME);
    connectOptions.setPassword(MQTT_PASSWORD.toCharArray());

    mClient = new MqttAsyncClient(mBrokerUri, mClientName, new MemoryPersistence());
    mClient.setCallback(mCallback);
    mClient.connect(connectOptions);

    Debug d = ((MqttAsyncClient) mClient).getDebug();
    d.dumpClientDebug();
}
我不使用自动重新连接功能,但希望在我自己的自定义代码中处理重新连接,因为我需要自定义延迟

出于测试目的,我还没有启动MQTT代理并尝试连接

我希望在
connectionLost
回调方法中检测初始连接失败,但它没有被调用

MqttException
也不会被抛出

当我检查
paho0.log.0
log文件时,我在那里看到了失败的连接-

FINE     17-03-09  07:55:33.0726    al.TCPNetworkModule  start                      61  ef978a39c826cd6d4ad22f20d5abe6c236eddb060b5d765a1fe2e1d79837fcc8: Failed to create TCP socket
Throwable occurred: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at org.eclipse.paho.client.mqttv3.internal.TCPNetworkModule.start(TCPNetworkModule.java:70)
    at org.eclipse.paho.client.mqttv3.internal.ClientComms$ConnectBG.run(ClientComms.java:650)
    at java.lang.Thread.run(Thread.java:745)
FINE     17-03-09  07:55:33.0727    nternal.ClientComms  connectBG:run              61  ef978a39c826cd6d4ad22f20d5abe6c236eddb060b5d765a1fe2e1d79837fcc8: connect failed: unexpected exception
Throwable occurred: Unable to connect to server (32103) - java.net.ConnectException: Connection refused: connect
    at org.eclipse.paho.client.mqttv3.internal.TCPNetworkModule.start(TCPNetworkModule.java:79)
    at org.eclipse.paho.client.mqttv3.internal.ClientComms$ConnectBG.run(ClientComms.java:650)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at org.eclipse.paho.client.mqttv3.internal.TCPNetworkModule.start(TCPNetworkModule.java:70)
    ... 2 more
FINE     17-03-09  07:55:33.0732    nternal.ClientComms  shutdownConnection         61  ef978a39c826cd6d4ad22f20d5abe6c236eddb060b5d765a1fe2e1d79837fcc8: state=DISCONNECTING
FINE     17-03-09  07:55:33.0732    ernal.CommsCallback  stop                       61  ef978a39c826cd6d4ad22f20d5abe6c236eddb060b5d765a1fe2e1d79837fcc8: stopped
FINE     17-03-09  07:55:33.0733    nal.CommsTokenStore  quiesce                    61  ef978a39c826cd6d4ad22f20d5abe6c236eddb060b5d765a1fe2e1d79837fcc8: resp=Client is currently disconnecting (32102)
但是如何在我的代码中检测连接故障呢?(以便我可以启动以后的重新连接)

更新:


将此问题报告为

当前检测异步客户端初始连接失败的唯一方法是再向其传递一次回调:

protected IMqttAsyncClient mClient;

private final MqttCallbackExtended mCallback = new MqttCallbackExtended() {
    @Override
    public void connectComplete(boolean reconnect, String brokerAddress) {
        Log.d(LOG_TAG, "connectComplete " + brokerAddress);
    }

    @Override
    public void connectionLost(Throwable ex) {
        Log.d(LOG_TAG, "connectionLost", ex);
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken deliveryToken) {
        Log.d(LOG_TAG, "deliveryComplete " + deliveryToken);
    }

    @Override
    public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
        Log.d(LOG_TAG, "messageArrived " + topic);
    }
};
private final IMqttActionListener mConnectionCallback = new IMqttActionListener() {
    @Override
    public void onSuccess(IMqttToken asyncActionToken) {
        Log.d(LOG_TAG, "onSuccess " + asyncActionToken);
        // do nothing, this case is handled in mCallback.connectComplete method
    }

    @Override
    public void onFailure(IMqttToken asyncActionToken, Throwable ex) {
        Log.d(LOG_TAG, "onFailure " + asyncActionToken, ex);
        // initial connect has failed
    }
};

mClient = new MqttAsyncClient(mBrokerUri, mClientName, new MemoryPersistence());
mClient.setCallback(mCallback);
mClient.connect(connectOptions, null, mConnectionCallback);