From 2df359096ac8c17137d230e7544d40633d41a6a1 Mon Sep 17 00:00:00 2001 From: mapuo Date: Wed, 10 Jul 2019 11:04:44 +0300 Subject: [PATCH] use unique client id for the mqtt client - iteration without hardcoded values --- .../bridge/properties/MqttConfiguration.java | 30 +++++++++++++++++++ .../nynja/bridge/verticle/MQTTVerticle.java | 15 ++++------ src/main/resources/application-dev.yml | 2 ++ src/main/resources/application-production.yml | 6 ++-- 4 files changed, 42 insertions(+), 11 deletions(-) diff --git a/src/main/java/biz/nynja/bridge/properties/MqttConfiguration.java b/src/main/java/biz/nynja/bridge/properties/MqttConfiguration.java index 88cffa0..46504c9 100644 --- a/src/main/java/biz/nynja/bridge/properties/MqttConfiguration.java +++ b/src/main/java/biz/nynja/bridge/properties/MqttConfiguration.java @@ -6,6 +6,8 @@ import lombok.ToString; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; +import java.util.UUID; + @ToString @Getter @Setter @@ -16,8 +18,36 @@ public class MqttConfiguration { private String host; private int port; private String clientId; + private String clientIdSuffix; + private String username; private String topic; private int keepAliveInterval; private long messageResponseTimeout; + public String getUniqueClientId() { + return clientId + "_" + sanitizeSuffix(clientIdSuffix); + } + + private String sanitizeSuffix(String suffix) { + if (suffix.contains("bridge-service-")) { + return suffix.replace("bridge-service-", "") + .replace("-", "_"); + } else if (isUuid(suffix)) { + return suffix.replace("-", ""); + } + + return suffix; + } + + private boolean isUuid(String suffix) { + try { + UUID uuid = UUID.fromString(suffix); + return true; + } catch (IllegalArgumentException e) { + // Nothing to do + } + + return false; + } + } diff --git a/src/main/java/biz/nynja/bridge/verticle/MQTTVerticle.java b/src/main/java/biz/nynja/bridge/verticle/MQTTVerticle.java index 820409b..86252da 100644 --- a/src/main/java/biz/nynja/bridge/verticle/MQTTVerticle.java +++ b/src/main/java/biz/nynja/bridge/verticle/MQTTVerticle.java @@ -19,7 +19,6 @@ import org.springframework.stereotype.Component; import java.util.Arrays; import java.util.Objects; -import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiConsumer; import java.util.function.Function; @@ -29,7 +28,6 @@ import java.util.function.Function; public class MQTTVerticle extends AbstractVerticle { public static final String MQTT_BUS = "mqtt-bus"; - private static final int DISCONNECT_DELAY = 5000; private static final int RECONNECT_DELAY = 5000; private final MqttConfiguration configuration; @@ -43,13 +41,13 @@ public class MQTTVerticle extends AbstractVerticle { this.configuration = configuration; log.info("Configuration: {}", this.configuration); dataEventsStatusCache = new ConcurrentHashMap<>(); - boolean keepAliveEnabled = configuration.getKeepAliveInterval() > 10; + boolean keepAliveEnabled = this.configuration.getKeepAliveInterval() > 10; clientOptions = new MqttClientOptions() .setAutoKeepAlive(keepAliveEnabled) - .setUsername("micro") - .setKeepAliveTimeSeconds(configuration.getKeepAliveInterval()) + .setUsername(this.configuration.getUsername()) + .setKeepAliveTimeSeconds(this.configuration.getKeepAliveInterval()) .setCleanSession(false) - .setClientId("sys_micro_bridge_" + UUID.randomUUID().toString().replace("-", "")); + .setClientId(this.configuration.getUniqueClientId()); } @Override @@ -86,15 +84,14 @@ public class MQTTVerticle extends AbstractVerticle { } private void connectMqtt(Future future) { - log.debug("Connecting to server '{}:{}'...", - configuration.getHost(), configuration.getPort()); + log.debug("Connecting to server '{}@{}:{}'...", + configuration.getUniqueClientId(), configuration.getHost(), configuration.getPort()); vertx.executeBlocking( event -> { client.connect(configuration.getPort(), configuration.getHost(), ch -> { if (ch.succeeded()) { log.debug("Connected to a server"); - // client.subscribe(configuration.getTopic(), 0); event.complete(); } else { log.error("Failed to connect to a server!", ch.cause()); diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index ed2c534..12e0f29 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -15,6 +15,8 @@ mqtt: host: nynja-dev-uw1-messaging01.dev-eu.nynja.net port: 1883 clientId: sys_micro_bridge_dev + clientIdSuffix: ${MQTT_CLIENT_ID:${HOSTNAME:${random.uuid}}} + username: micro topic: events/1//api/anon// keepAliveInterval: 20 messageResponseTimeout: 2000 diff --git a/src/main/resources/application-production.yml b/src/main/resources/application-production.yml index ca3cd4f..1926443 100644 --- a/src/main/resources/application-production.yml +++ b/src/main/resources/application-production.yml @@ -11,9 +11,11 @@ grpc: port: ${GRPC_SERVER_PORT:6570} mqtt: - host: ${ERLANG_HOST:35.234.110.93} + host: ${ERLANG_HOST:nynja-staging-ew3-messaging01.staging.nynja.net} port: ${ERLANG_PORT:1883} - clientId: ${MQTT_CLIENT_ID:sys_micro_bridge} + clientId: sys_micro_bridge + clientIdSuffix: ${MQTT_CLIENT_ID:${HOSTNAME:${random.uuid}}} + username: ${MQTT_USERNAME:micro} topic: ${MQTT_TOPIC:events/1//api/anon//} keepAliveInterval: ${MQTT_KEEP_ALIVE:20} messageResponseTimeout: ${MQTT_RESP_WAIT:2000} -- GitLab