@@ -9,6 +9,7 @@ import org.neo4j.kernel.lifecycle.Lifecycle
99import org.neo4j.kernel.lifecycle.LifecycleAdapter
1010import org.neo4j.logging.internal.LogService
1111import streams.extensions.isSystemDb
12+ import java.util.concurrent.atomic.AtomicReference
1213
1314class StreamsExtensionFactory : ExtensionFactory <StreamsExtensionFactory .Dependencies >(ExtensionType .DATABASE ," Streams.Producer" ) {
1415 override fun newInstance (context : ExtensionContext , dependencies : Dependencies ): Lifecycle {
@@ -26,26 +27,27 @@ class StreamsExtensionFactory : ExtensionFactory<StreamsExtensionFactory.Depende
2627}
2728
2829class StreamsEventRouterLifecycle (private val availabilityGuard : AvailabilityGuard ,
29- db : GraphDatabaseAPI ,
30- log : LogService ): LifecycleAdapter() {
30+ private val db : GraphDatabaseAPI ,
31+ private val log : LogService ): LifecycleAdapter() {
3132
3233 private val streamsLog = log.getUserLog(StreamsEventRouterLifecycle ::class .java)
3334
34- private val streamsEventRouterAvailabilityListener: StreamsEventRouterAvailabilityListener ? = if (db.isSystemDb()) {
35+ private val availabilityListener: AtomicReference <StreamsEventRouterAvailabilityListener > = AtomicReference (null )
36+
37+ private fun createStreamsEventRouterAvailabilityListener () = if (db.isSystemDb()) {
3538 null
3639 } else {
3740 StreamsEventRouterAvailabilityListener (db, log)
3841 }
3942
4043 override fun start () {
41- streamsEventRouterAvailabilityListener?.also {
42- availabilityGuard.addListener(it)
43- }
44+ availabilityListener.updateAndGet { it ? : createStreamsEventRouterAvailabilityListener() }
45+ ?.let { availabilityGuard.addListener(it) }
4446 }
4547
4648 override fun stop () {
4749 try {
48- streamsEventRouterAvailabilityListener?. also {
50+ availabilityListener.getAndSet( null )?. let {
4951 it.shutdown()
5052 availabilityGuard.removeListener(it)
5153 }
0 commit comments