我们有一个流式应用程序,它从MQTT获取数据并加载到其他资源中。而且此应用程序具有多个线程来处理某些任务。
这里我们有两个任务(线程):
因此 READER 将从MQTT代理读取数据并将其写入Java队列,而 WRITER 将从该队列中获取此数据并将其写入一个数据库。该应用程序本身监视这些线程以查找任何故障。如果任何一个线程失败,那么我们将适当地停止其余线程。如果是Paho MqttClient类( READER 类),即使它是一个线程类也不会创建线程。但是它将在后台创建多个线程。
因此,我们无法检查这些线程是否失败或是否由Java isAlive()
函数运行。因此,我们仅通过MqttClient isConnected()
方法检查此类是否已连接。一旦isConnected
方法返回false(5次),我们将正常停止Writer线程。但是在后台生成的Reader类线程无法停止。我已经尝试过disconnect()
和close()
方法。但是它并没有停止任何后台线程。它的抛出错误断开连接的线程无法停止。
所以请任何人帮助。
答案 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());
}