Как создать MqttClient в vert.x и повторно использовать в другом классе или компоненте? - PullRequest
0 голосов
/ 27 сентября 2018

Fisrt, я хочу сделать MqttClient и использовать его в другом классе, вот как я хочу сделать

public class MqttClientUtil {
private static final Logger log = LoggerFactory.getLogger(MqttClientUtil.class);
private static final String BROKER_HOST = "localhost";
private static final int BROKER_PORT = 1883;
private static MqttClient mqttClient;

public static MqttClient getMqttClientUtil() {
    if (null == mqttClient) {
        mqttClient = MqttClient.create(Vertx.vertx())
            .connect(BROKER_PORT, BROKER_HOST, res -> {
                System.out.println(res);
            });
        return mqttClient;
    } else {
        return mqttClient;
    }
}

}

В этом коде я не обрабатываю дваили более потока одновременно получают клиента. Но он не работает, кажется, поток заблокирован в функции соединения.

Как правильно сделать?

1 Ответ

0 голосов
/ 29 ноября 2018

Как предлагается в комментариях, вы можете заблокировать метод, пока он не подключится, используя CountDownLatch:

public class MqttClientUtil {
    private static final Logger log = LoggerFactory.getLogger(MqttClientUtil.class);
    private static final String BROKER_HOST = "iot.eclipse.org";
    private static final int BROKER_PORT = 1883;
    private static MqttClient mqttClient;

    public static MqttClient getMqttClientUtil() {
        if (mqttClient == null) {
            CountDownLatch latch = new CountDownLatch(1);
            mqttClient = MqttClient.create(Vertx.vertx()).connect(BROKER_PORT, BROKER_HOST, res -> {
                if (res.succeeded()) System.out.println("connected");
                latch.countDown();
            });

            try { latch.await(10000, TimeUnit.MILLISECONDS); }
            catch (InterruptedException e) {
                e.printStackTrace();
                return null;
            }
        }

        return mqttClient;
    }
}
...