有什么办法可以关闭后端产生的MqttClient线程?

时间:2019-01-09 10:12:27

标签: java mqtt paho

我们有一个流式应用程序,它从MQTT获取数据并加载到其他资源中。而且此应用程序具有多个线程来处理某些任务。

这里我们有两个任务(线程):

  • 第一个是阅读器
  • 第二个是 WRITER

因此 READER 将从MQTT代理读取数据并将其写入Java队列,而 WRITER 将从该队列中获取此数据并将其写入一个数据库。该应用程序本身监视这些线程以查找任何故障。如果任何一个线程失败,那么我们将适当地停止其余线程。如果是Paho MqttClient类( READER 类),即使它是一个线程类也不会创建线程。但是它将在后台创建多个线程。

因此,我们无法检查这些线程是否失败或是否由Java isAlive()函数运行。因此,我们仅通过MqttClient isConnected()方法检查此类是否已连接。一旦isConnected方法返回false(5次),我们将正常停止Writer线程。但是在后台生成的Reader类线程无法停止。我已经尝试过disconnect()close() 方法。但是它并没有停止任何后台线程。它的抛出错误断开连接的线程无法停止。

所以请任何人帮助。

1 个答案:

答案 0 :(得分:0)

您的建议听起来很尴尬。

为什么不仅仅使用Paho回调,尤其是如下的connectionLost

private final MqttCallbackExtended mCallback = new MqttCallbackExtended() {
    @Override
    public void connectComplete(boolean reconnect, String brokerAddress) {
            mqttClient.subscribe("topic", 1, null, mSubscribeCallback);
    }

    @Override
    public void connectionLost(Throwable ex) {
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken deliveryToken) {
    }

    @Override
    public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
    }
};

private final IMqttActionListener mConnectionCallback = new IMqttActionListener() {
    @Override
    public void onSuccess(IMqttToken asyncActionToken) {
        // do nothing, this case is handled in mCallback.connectComplete()
    }

    @Override
    public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
    }
};

private final IMqttActionListener mSubscribeCallback = new IMqttActionListener() {
    @Override
    public void onSuccess(IMqttToken subscribeToken) {
    }

    @Override
    public void onFailure(IMqttToken subscribeToken, Throwable ex) {
    }

};

MqttConnectOptions connectOptions = new MqttConnectOptions();
connectOptions.setCleanSession(true);
connectOptions.setAutomaticReconnect(true);     
connectOptions.setUserName("username");
connectOptions.setPassword("password".toCharArray());

MqttAsyncClient mqttClient = new MqttAsyncClient("tcp:// test.mosquitto.org");
mqttClient.setCallback(mCallback);

try {
    mqttClient.connect(connectOptions, null, mConnectionCallback);

} catch (Exception ex) {
    System.err.println(ex.toString());
}