Мне нужно отправить команду на устройство IoT AWS через тему, и устройство публикует результат этой команды в другой теме.Это соответствует стандартной модели асинхронного паба AWS IoT.
Я пытаюсь создать API ответа на запрос для этого и смог достичь с помощью следующего кода: Примечание: Использование той же темы для публикации и подписки наимитировать поведение устройства для тестирования.
Вопрос: Есть ли способ избавиться от Thread.sleep и использовать какой-то вид future.get, который ожидает, пока объект не станет нулевым, и имеетнекоторое значение, возвращаемое как часть «onMessage» с устройства или тайм-аута, в зависимости от того, что произойдет раньше.
BlockingPubSubIot.java
// This waits for the data to be received on the same topic as published to mimic the device behavior (for testing), and block the function to retrieve the result in a blocking way
public static void main(String args[]) throws InterruptedException, AWSIotException, AWSIotTimeoutException {
CommandArguments arguments = CommandArguments.parse(args);
initClient(arguments);
System.out.println("Connectionto IoT");
awsIotClient.connect();
String returnData = null;
NonBlockingListener listener =
new NonBlockingListener(TestTopic, TestTopicQos, returnData);
AWSIotTopic topic = listener;
System.out.println("Subscribing first");
awsIotClient.subscribe(topic, false);
String payload = "hello world";
System.out.println("Publishing payload to IoT now");
awsIotClient.publish(TestTopic, payload);
System.out.println("Waiting for the data via non blocking listener variable");
String data = listener.getReturnData();
/**
*
* Can we make this better or this is the right thing to do here
* like wait using some kind of future where I can just do get
* and it blocks till the value is not null before a given timeout
*
*/
for(int i =0;i<3 && data == null; i++) {
Thread.sleep(100);
System.out.println("Try " + i);
data = listener.getReturnData();
}
if(null == data) {// if its still null
// Do some exception handling
}
//Success
System.out.println("Data after subscribing synchronously is " + data);
//Disconnect at the end
awsIotClient.disconnect();
}
NonBlockingListener that sets the returnData variable on receiving the message from Iot
public class NonBlockingListener extends AWSIotTopic {
private String returnData;
public NonBlockingListener(String topic, AWSIotQos qos, String returnData) {
super(topic, qos);
this.returnData = returnData;
System.out.println("Initializing Callable");
}
public String getReturnData() {
return returnData;
}
@Override
public void onMessage(AWSIotMessage message) {
returnData = message.getStringPayload();
//System.out.println(System.currentTimeMillis() + ": <<< " + message.getStringPayload());
System.out.println("Data is "+ returnData);
}
}