Skip to content

Commit 7b6b7cf

Browse files
committed
Finalized the reconnect loop
1 parent cd64622 commit 7b6b7cf

File tree

9 files changed

+41
-10
lines changed

9 files changed

+41
-10
lines changed

modules/hivemq-edge-module-opcua/src/main/java/com/hivemq/edge/adapters/opcua/OpcUaProtocolAdapter.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,8 +242,13 @@ private void scheduleHealthCheck() {
242242
}
243243

244244
if (!conn.isHealthy()) {
245-
log.warn("Health check failed for adapter '{}' - triggering reconnection", adapterId);
246-
reconnect();
245+
if (config.isAutoReconnect()) {
246+
log.warn("Health check failed for adapter '{}' - triggering automatic reconnection", adapterId);
247+
reconnect();
248+
} else {
249+
log.warn("Health check failed for adapter '{}' - automatic reconnection is disabled", adapterId);
250+
protocolAdapterState.setConnectionStatus(ProtocolAdapterState.ConnectionStatus.ERROR);
251+
}
247252
} else {
248253
log.debug("Health check passed for adapter '{}'", adapterId);
249254
}

modules/hivemq-edge-module-opcua/src/main/java/com/hivemq/edge/adapters/opcua/config/BidirectionalOpcUaSpecificAdapterConfig.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ public BidirectionalOpcUaSpecificAdapterConfig(
3838
@JsonProperty("keepAliveFailuresAllowed") final @Nullable Integer keepAliveFailuresAllowed,
3939
@JsonProperty("connectionTimeout") final @Nullable Integer connectionTimeout,
4040
@JsonProperty("healthCheckInterval") final @Nullable Integer healthCheckInterval,
41-
@JsonProperty("retryInterval") final @Nullable Integer retryInterval) {
42-
super(uri, overrideUri, applicationUri, auth, tls, opcuaToMqttConfig, security, sessionTimeout, requestTimeout, keepAliveInterval, keepAliveFailuresAllowed, connectionTimeout, healthCheckInterval, retryInterval);
41+
@JsonProperty("retryInterval") final @Nullable Integer retryInterval,
42+
@JsonProperty("autoReconnect") final @Nullable Boolean autoReconnect) {
43+
super(uri, overrideUri, applicationUri, auth, tls, opcuaToMqttConfig, security, sessionTimeout, requestTimeout, keepAliveInterval, keepAliveFailuresAllowed, connectionTimeout, healthCheckInterval, retryInterval, autoReconnect);
4344
}
4445
}

modules/hivemq-edge-module-opcua/src/main/java/com/hivemq/edge/adapters/opcua/config/OpcUaSpecificAdapterConfig.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,12 @@ public class OpcUaSpecificAdapterConfig implements ProtocolSpecificAdapterConfig
132132
defaultValue = "30")
133133
private final int retryInterval;
134134

135+
@JsonProperty("autoReconnect")
136+
@ModuleConfigField(title = "Automatic Reconnection",
137+
description = "Enable automatic reconnection when health check detects connection issues",
138+
defaultValue = "true")
139+
private final boolean autoReconnect;
140+
135141
@JsonCreator
136142
public OpcUaSpecificAdapterConfig(
137143
@JsonProperty(value = "uri", required = true) final @NotNull String uri,
@@ -147,7 +153,8 @@ public OpcUaSpecificAdapterConfig(
147153
@JsonProperty("keepAliveFailuresAllowed") final @Nullable Integer keepAliveFailuresAllowed,
148154
@JsonProperty("connectionTimeout") final @Nullable Integer connectionTimeout,
149155
@JsonProperty("healthCheckInterval") final @Nullable Integer healthCheckInterval,
150-
@JsonProperty("retryInterval") final @Nullable Integer retryInterval) {
156+
@JsonProperty("retryInterval") final @Nullable Integer retryInterval,
157+
@JsonProperty("autoReconnect") final @Nullable Boolean autoReconnect) {
151158
this.uri = uri;
152159
this.overrideUri = requireNonNullElse(overrideUri, false);
153160
this.applicationUri = (applicationUri != null && !applicationUri.isBlank()) ? applicationUri : null;
@@ -165,6 +172,7 @@ public OpcUaSpecificAdapterConfig(
165172
this.connectionTimeout = requireNonNullElse(connectionTimeout, 30);
166173
this.healthCheckInterval = requireNonNullElse(healthCheckInterval, 30);
167174
this.retryInterval = requireNonNullElse(retryInterval, 30);
175+
this.autoReconnect = requireNonNullElse(autoReconnect, true);
168176
}
169177

170178

@@ -224,6 +232,10 @@ public int getRetryInterval() {
224232
return retryInterval;
225233
}
226234

235+
public boolean isAutoReconnect() {
236+
return autoReconnect;
237+
}
238+
227239
@Override
228240
public boolean equals(final @Nullable Object o) {
229241
if (o == null || getClass() != o.getClass()) {
@@ -238,6 +250,7 @@ public boolean equals(final @Nullable Object o) {
238250
connectionTimeout == that.connectionTimeout &&
239251
healthCheckInterval == that.healthCheckInterval &&
240252
retryInterval == that.retryInterval &&
253+
autoReconnect == that.autoReconnect &&
241254
Objects.equals(id, that.id) &&
242255
Objects.equals(getUri(), that.getUri()) &&
243256
Objects.equals(getApplicationUri(), that.getApplicationUri()) &&
@@ -250,6 +263,6 @@ public boolean equals(final @Nullable Object o) {
250263
@Override
251264
public int hashCode() {
252265
return Objects.hash(getOverrideUri(), id, getUri(), getApplicationUri(), getAuth(), getTls(), getSecurity(), getOpcuaToMqttConfig(),
253-
sessionTimeout, requestTimeout, keepAliveInterval, keepAliveFailuresAllowed, connectionTimeout, healthCheckInterval, retryInterval);
266+
sessionTimeout, requestTimeout, keepAliveInterval, keepAliveFailuresAllowed, connectionTimeout, healthCheckInterval, retryInterval, autoReconnect);
254267
}
255268
}

modules/hivemq-edge-module-opcua/src/test/java/com/hivemq/edge/adapters/opcua/OpcUaEndpointFilterTest.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public void whenSingleEndpointConfigSet_thenPickCorrectEndpoint() {
6565
null,
6666
null,
6767
null,
68+
null,
6869
null);
6970

7071
final String configUri = convertToUri(BASIC256SHA256);
@@ -82,7 +83,7 @@ public void whenSingleEndpointConfigSet_thenPickCorrectEndpoint() {
8283
@Test
8384
public void whenSingleEndpointConfigSetAndNoKeystorePresent_thenPickNoEndpoint() {
8485
final OpcUaSpecificAdapterConfig config =
85-
new OpcUaSpecificAdapterConfig("opc.tcp://127.0.0.1:49320", false, null, null, null, null, null, null, null, null, null, null, null, null);
86+
new OpcUaSpecificAdapterConfig("opc.tcp://127.0.0.1:49320", false, null, null, null, null, null, null, null, null, null, null, null, null, null);
8687

8788
final String configUri = convertToUri(BASIC256SHA256);
8889
final OpcUaEndpointFilter opcUaEndpointFilter = new OpcUaEndpointFilter("id", configUri, null, config);
@@ -96,7 +97,7 @@ public void whenSingleEndpointConfigSetAndNoKeystorePresent_thenPickNoEndpoint()
9697
public void whenSingleEndpointConfigSetAndNotAvailOnServer_thenPickNoEndpoint() {
9798
final String configUri = convertToUri(BASIC256SHA256);
9899
final OpcUaSpecificAdapterConfig config =
99-
new OpcUaSpecificAdapterConfig("opc.tcp://127.0.0.1:49320", false, null, null, null, null, null, null, null, null, null, null, null, null);
100+
new OpcUaSpecificAdapterConfig("opc.tcp://127.0.0.1:49320", false, null, null, null, null, null, null, null, null, null, null, null, null, null);
100101
final OpcUaEndpointFilter opcUaEndpointFilter = new OpcUaEndpointFilter("id", configUri, null, config);
101102

102103
final Optional<EndpointDescription> result =
@@ -108,7 +109,7 @@ public void whenSingleEndpointConfigSetAndNotAvailOnServer_thenPickNoEndpoint()
108109
@Test
109110
public void whenDefaultEndpointConfigSet_thenPickMatchingEndpoint() {
110111
final OpcUaSpecificAdapterConfig config =
111-
new OpcUaSpecificAdapterConfig("opc.tcp://127.0.0.1:49320", false, null, null, null, null, null, null, null, null, null, null, null, null);
112+
new OpcUaSpecificAdapterConfig("opc.tcp://127.0.0.1:49320", false, null, null, null, null, null, null, null, null, null, null, null, null, null);
112113
final OpcUaEndpointFilter opcUaEndpointFilter = new OpcUaEndpointFilter("id", convertToUri(
113114
DEFAULT_SECURITY_POLICY), null, config);
114115

@@ -137,6 +138,7 @@ public void whenMessageSecurityModeSpecified_thenFilterByMode() {
137138
null,
138139
null,
139140
null,
141+
null,
140142
null);
141143

142144
final String policyUri = convertToUri(BASIC256SHA256);
@@ -187,6 +189,7 @@ public void whenNoMessageSecurityModeSpecified_thenAcceptAnyMode() {
187189
null,
188190
null,
189191
null,
192+
null,
190193
null);
191194

192195
final String policyUri = convertToUri(BASIC256SHA256);
@@ -226,6 +229,7 @@ public void whenWrongMessageSecurityMode_thenNoEndpointSelected() {
226229
null,
227230
null,
228231
null,
232+
null,
229233
null);
230234

231235
final String policyUri = convertToUri(BASIC256SHA256);

modules/hivemq-edge-module-opcua/src/test/java/com/hivemq/edge/adapters/opcua/OpcUaProtocolAdapterAuthTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ public void whenNoAuthAndNoSubscriptions_thenConnectSuccessfully() {
108108
null,
109109
null,
110110
null,
111+
null,
111112
null);
112113

113114
when(protocolAdapterInput.getConfig()).thenReturn(config);
@@ -143,6 +144,7 @@ public void whenBasicAuthAndNoSubscriptions_thenConnectSuccessfully() {
143144
null,
144145
null,
145146
null,
147+
null,
146148
null);
147149

148150
when(protocolAdapterInput.getConfig()).thenReturn(config);
@@ -176,6 +178,7 @@ public void whenTlsAndNoSubscriptions_thenConnectSuccessfully() {
176178
null,
177179
null,
178180
null,
181+
null,
179182
null);
180183
when(protocolAdapterInput.getConfig()).thenReturn(config);
181184

@@ -212,6 +215,7 @@ public void whenCertAuthAndNoSubscriptions_thenConnectSuccessfully() throws Exce
212215
null,
213216
null,
214217
null,
218+
null,
215219
null);
216220

217221
when(protocolAdapterInput.getConfig()).thenReturn(config);

modules/hivemq-edge-module-opcua/src/test/java/com/hivemq/edge/adapters/opcua/client/OpcUaClientConfiguratorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class OpcUaClientConfiguratorTest {
3333

3434
// Minimal config for tests - defaults will be used for timeout values
3535
private static final OpcUaSpecificAdapterConfig TEST_CONFIG =
36-
new OpcUaSpecificAdapterConfig("opc.tcp://test:4840", false, null, null, null, null, null, null, null, null, null, null, null, null);
36+
new OpcUaSpecificAdapterConfig("opc.tcp://test:4840", false, null, null, null, null, null, null, null, null, null, null, null, null, null);
3737

3838
@Test
3939
void testAccept_withExtractedUri_usesExtractedUri() {

modules/hivemq-edge-module-opcua/src/test/java/com/hivemq/edge/adapters/opcua/client/ParsedConfigTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,7 @@ private OpcUaSpecificAdapterConfig createAdapterConfig(
375375
null,
376376
null,
377377
null,
378+
null,
378379
null
379380
);
380381
}

modules/hivemq-edge-module-opcua/src/test/java/com/hivemq/edge/adapters/opcua/config/OpcUaProtocolAdapterConfigTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ public void unconvertConfigObject_full_valid() {
189189
null,
190190
null,
191191
null,
192+
null,
192193
null
193194
);
194195

@@ -239,6 +240,7 @@ public void unconvertConfigObject_default_valid() {
239240
null,
240241
null,
241242
null,
243+
null,
242244
null
243245
);
244246

modules/hivemq-edge-module-opcua/src/test/java/com/hivemq/edge/adapters/opcua/northbound/AbstractOpcUaPayloadConverterTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ protected OpcUaProtocolAdapter createAndStartAdapter(final @NotNull String subcr
112112
null,
113113
null,
114114
null,
115+
null,
115116
null);
116117

117118
when(protocolAdapterInput.getConfig()).thenReturn(config);

0 commit comments

Comments
 (0)