11package dev .openfeature .sdk ;
22
33import dev .openfeature .sdk .internal .TriConsumer ;
4+ import java .util .concurrent .ExecutorService ;
5+ import java .util .concurrent .Executors ;
6+ import java .util .concurrent .TimeUnit ;
47import lombok .extern .slf4j .Slf4j ;
58
69/**
1821@ Slf4j
1922public abstract class EventProvider implements FeatureProvider {
2023 private EventProviderListener eventProviderListener ;
24+ private final ExecutorService emitterExecutor = Executors .newCachedThreadPool ();
2125
2226 void setEventProviderListener (EventProviderListener eventProviderListener ) {
2327 this .eventProviderListener = eventProviderListener ;
@@ -53,30 +57,49 @@ void detach() {
5357 * or timeout period has elapsed.
5458 */
5559 @ Override
56- public void shutdown () {}
60+ public void shutdown () {
61+ emitterExecutor .shutdown ();
62+ try {
63+ if (!emitterExecutor .awaitTermination (EventSupport .SHUTDOWN_TIMEOUT_SECONDS , TimeUnit .SECONDS )) {
64+ log .warn ("Emitter executor did not terminate before the timeout period had elapsed" );
65+ emitterExecutor .shutdownNow ();
66+ }
67+ } catch (InterruptedException e ) {
68+ emitterExecutor .shutdownNow ();
69+ Thread .currentThread ().interrupt ();
70+ }
71+ }
5772
5873 /**
5974 * Emit the specified {@link ProviderEvent}.
6075 *
6176 * @param event The event type
6277 * @param details The details of the event
6378 */
64- public void emit (final ProviderEvent event , final ProviderEventDetails details ) {
79+ public Awaitable emit (final ProviderEvent event , final ProviderEventDetails details ) {
6580 final var localEventProviderListener = this .eventProviderListener ;
6681 final var localOnEmit = this .onEmit ;
6782
6883 if (localEventProviderListener == null && localOnEmit == null ) {
69- return ;
84+ return Awaitable . FINISHED ;
7085 }
7186
72- try (var ignored = OpenFeatureAPI .lock .readLockAutoCloseable ()) {
73- if (localEventProviderListener != null ) {
74- localEventProviderListener .onEmit (event , details );
75- }
76- if (localOnEmit != null ) {
77- localOnEmit .accept (this , event , details );
87+ final var awaitable = new Awaitable ();
88+
89+ emitterExecutor .submit (() -> {
90+ try (var ignored = OpenFeatureAPI .lock .readLockAutoCloseable ()) {
91+ if (localEventProviderListener != null ) {
92+ localEventProviderListener .onEmit (event , details );
93+ }
94+ if (localOnEmit != null ) {
95+ localOnEmit .accept (this , event , details );
96+ }
97+ } finally {
98+ awaitable .wakeup ();
7899 }
79- }
100+ });
101+
102+ return awaitable ;
80103 }
81104
82105 /**
@@ -85,8 +108,8 @@ public void emit(final ProviderEvent event, final ProviderEventDetails details)
85108 *
86109 * @param details The details of the event
87110 */
88- public void emitProviderReady (ProviderEventDetails details ) {
89- emit (ProviderEvent .PROVIDER_READY , details );
111+ public Awaitable emitProviderReady (ProviderEventDetails details ) {
112+ return emit (ProviderEvent .PROVIDER_READY , details );
90113 }
91114
92115 /**
@@ -96,8 +119,8 @@ public void emitProviderReady(ProviderEventDetails details) {
96119 *
97120 * @param details The details of the event
98121 */
99- public void emitProviderConfigurationChanged (ProviderEventDetails details ) {
100- emit (ProviderEvent .PROVIDER_CONFIGURATION_CHANGED , details );
122+ public Awaitable emitProviderConfigurationChanged (ProviderEventDetails details ) {
123+ return emit (ProviderEvent .PROVIDER_CONFIGURATION_CHANGED , details );
101124 }
102125
103126 /**
@@ -106,8 +129,8 @@ public void emitProviderConfigurationChanged(ProviderEventDetails details) {
106129 *
107130 * @param details The details of the event
108131 */
109- public void emitProviderStale (ProviderEventDetails details ) {
110- emit (ProviderEvent .PROVIDER_STALE , details );
132+ public Awaitable emitProviderStale (ProviderEventDetails details ) {
133+ return emit (ProviderEvent .PROVIDER_STALE , details );
111134 }
112135
113136 /**
@@ -116,7 +139,7 @@ public void emitProviderStale(ProviderEventDetails details) {
116139 *
117140 * @param details The details of the event
118141 */
119- public void emitProviderError (ProviderEventDetails details ) {
120- emit (ProviderEvent .PROVIDER_ERROR , details );
142+ public Awaitable emitProviderError (ProviderEventDetails details ) {
143+ return emit (ProviderEvent .PROVIDER_ERROR , details );
121144 }
122145}
0 commit comments