3131import com .hivemq .adapter .sdk .api .tag .Tag ;
3232import com .hivemq .adapter .sdk .api .writing .WritingProtocolAdapter ;
3333import com .hivemq .edge .modules .adapters .data .TagManager ;
34+ import com .hivemq .edge .modules .adapters .impl .ProtocolAdapterStateImpl ;
3435import com .hivemq .edge .modules .api .adapters .ProtocolAdapterPollingService ;
3536import com .hivemq .persistence .mappings .NorthboundMapping ;
3637import com .hivemq .persistence .mappings .SouthboundMapping ;
4849import java .util .Optional ;
4950import java .util .concurrent .CompletableFuture ;
5051import java .util .concurrent .ExecutionException ;
52+ import java .util .concurrent .atomic .AtomicBoolean ;
5153import java .util .concurrent .atomic .AtomicReference ;
5254import java .util .function .Function ;
5355import java .util .stream .Collectors ;
@@ -69,7 +71,7 @@ private enum OperationState {
6971 private final @ NotNull ProtocolAdapter adapter ;
7072 private final @ NotNull ProtocolAdapterFactory <?> adapterFactory ;
7173 private final @ NotNull ProtocolAdapterInformation adapterInformation ;
72- private final @ NotNull ProtocolAdapterState protocolAdapterState ;
74+ private final @ NotNull ProtocolAdapterStateImpl protocolAdapterState ;
7375 private final @ NotNull InternalProtocolAdapterWritingService protocolAdapterWritingService ;
7476 private final @ NotNull ProtocolAdapterPollingService protocolAdapterPollingService ;
7577 private final @ NotNull ProtocolAdapterConfig config ;
@@ -109,7 +111,7 @@ public ProtocolAdapterWrapper(
109111 final @ NotNull ProtocolAdapter adapter ,
110112 final @ NotNull ProtocolAdapterFactory <?> adapterFactory ,
111113 final @ NotNull ProtocolAdapterInformation adapterInformation ,
112- final @ NotNull ProtocolAdapterState protocolAdapterState ,
114+ final @ NotNull ProtocolAdapterStateImpl protocolAdapterState ,
113115 final @ NotNull NorthboundConsumerFactory northboundConsumerFactory ,
114116 final @ NotNull TagManager tagManager ) {
115117 this .protocolAdapterWritingService = protocolAdapterWritingService ;
@@ -202,12 +204,20 @@ private Optional<Throwable> attemptStartingConsumers(final boolean writingEnable
202204 //Adapter started successfully, now start the consumers
203205 createAndSubscribeTagConsumer ();
204206 startPolling (protocolAdapterPollingService , eventService );
205- if (startWriting (writingEnabled , protocolAdapterWritingService )) {
206- log .info ("Successfully started adapter with id {}" , adapter .getId ());
207- } else {
208- log .error ("Protocol adapter start failed as data hub is not available." );
209- return Optional .of (new RuntimeException (
210- "Protocol adapter start failed as data hub is not available." ));
207+
208+ if (writingEnabled && isWriting ()) {
209+ final var started = new AtomicBoolean (false );
210+ protocolAdapterState .setConnectionStatusListener (status -> {
211+ if (status == ProtocolAdapterState .ConnectionStatus .CONNECTED ) {
212+ if (started .compareAndSet (false , true )) {
213+ if (startWriting (protocolAdapterWritingService )) {
214+ log .info ("Successfully started adapter with id {}" , adapter .getId ());
215+ } else {
216+ log .error ("Protocol adapter start failed as data hub is not available." );
217+ }
218+ }
219+ }
220+ });
211221 }
212222 } catch (final Throwable e ) {
213223 log .error ("Protocol adapter start failed" );
@@ -432,25 +442,19 @@ private void stopPolling(
432442 }
433443 }
434444
435- private @ NotNull boolean startWriting (
436- final boolean writingEnabled ,
437- final @ NotNull InternalProtocolAdapterWritingService protocolAdapterWritingService ) {
438- if (writingEnabled && isWriting ()) {
439- log .debug ("Start writing for protocol adapter with id '{}'" , getId ());
440-
441- final var southboundMappings = getSouthboundMappings ();
442- final var writingContexts = southboundMappings .stream ()
443- .map (InternalWritingContextImpl ::new )
444- .collect (Collectors .<InternalWritingContext >toList ());
445-
446- return protocolAdapterWritingService
447- .startWriting (
448- (WritingProtocolAdapter ) getAdapter (),
449- getProtocolAdapterMetricsService (),
450- writingContexts );
451- } else {
452- return true ;
453- }
445+ private @ NotNull boolean startWriting (final @ NotNull InternalProtocolAdapterWritingService protocolAdapterWritingService ) {
446+ log .debug ("Start writing for protocol adapter with id '{}'" , getId ());
447+
448+ final var southboundMappings = getSouthboundMappings ();
449+ final var writingContexts = southboundMappings .stream ()
450+ .map (InternalWritingContextImpl ::new )
451+ .collect (Collectors .<InternalWritingContext >toList ());
452+
453+ return protocolAdapterWritingService
454+ .startWriting (
455+ (WritingProtocolAdapter ) getAdapter (),
456+ getProtocolAdapterMetricsService (),
457+ writingContexts );
454458 }
455459
456460 private void stopWriting (final @ NotNull InternalProtocolAdapterWritingService protocolAdapterWritingService ) {
0 commit comments