2017-03-09 42 views
-1

我正在使用Eclipse Paho Java Client進行連接。這裏是我的擴展回調:如何檢測「連接被拒絕」時使用MqttAsyncClient沒有自動重新連接?

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); 
    } 
}; 

而且這裏的連接代碼:

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日誌文件,我看到有失敗的連接 -

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) 

但是,如何檢測我的代碼,連接失敗? (以便我可以啓動後來的重新連接)。

UPDATE:

報道這個問題,因爲Bug #336

回答

1

目前檢測一個異步客戶端的初始連接失敗的唯一途徑就是通過它多了一個回調:

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);