Запрос ответа на IoT async опубликовать подписаться - PullRequest
0 голосов
/ 12 мая 2019

Мне нужно отправить команду на устройство 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);
    }

}
...