33import in .erail .glue .annotation .StartService ;
44import io .reactivex .Completable ;
55import io .reactivex .Single ;
6- import io .reactivex .schedulers .Schedulers ;
76import io .vertx .core .spi .cluster .ClusterManager ;
87import io .vertx .core .spi .cluster .NodeListener ;
98import io .vertx .reactivex .core .Vertx ;
9+ import java .util .Optional ;
1010import org .apache .logging .log4j .Logger ;
1111
1212/**
@@ -29,31 +29,41 @@ public void start() {
2929 return ;
3030 }
3131
32- allowServiceToStart ()
33- .subscribeOn (Schedulers .io ())
32+ Single
33+ .just (Optional .<String >empty ())
34+ .flatMapCompletable (this ::init )
35+ .subscribe ();
36+ }
37+
38+ protected Completable init (Optional <String > pOldNodeID ) {
39+ final String serviceName = getServiceName ();
40+ final String thisNodeId = getClusterManager ().getNodeID ();
41+
42+ return Single
43+ .just (getServiceMapName ())
44+ .flatMap (name -> getVertx ().sharedData ().<String , String >rxGetClusterWideMap (name ))
45+ .flatMap (m -> {
46+ if (pOldNodeID .isPresent ()) {
47+ return m
48+ .rxReplaceIfPresent (getServiceName (), pOldNodeID .get (), thisNodeId )
49+ .map (v -> v ? thisNodeId : "" );
50+ }
51+ return m
52+ .rxPutIfAbsent (serviceName , thisNodeId )
53+ .switchIfEmpty (Single .just (thisNodeId ));
54+ })
55+ .doOnSuccess (serviceOwnerId -> getLog ().debug (() -> "Service Owner ID:" + serviceOwnerId + ", This Node ID:" + thisNodeId ))
56+ .map (serviceOwnerId -> thisNodeId .equals (serviceOwnerId ))
57+ .doOnSuccess (t -> getLog ().debug (() -> "Service Start Decision:" + getServiceName () + ":" + t ))
3458 .flatMapCompletable ((success ) -> {
3559 if (success ) {
3660 getLog ().info (String .format ("Starting Service:[%s]" , getServiceName ()));
3761 return startService ()
3862 .doOnComplete (() -> getLog ().info (String .format ("Service:[%s] started" , getServiceName ())));
3963 }
4064 return Completable .complete ();
41- })
42- .blockingAwait ();
43- }
65+ });
4466
45- protected Single <Boolean > allowServiceToStart () {
46- final String serviceName = getServiceName ();
47- final String value = getClusterManager ().getNodeID ();
48-
49- return getVertx ()
50- .sharedData ()
51- .<String , String >rxGetClusterWideMap (getServiceMapName ())
52- .flatMapMaybe (m -> m .rxPutIfAbsent (serviceName , value ))
53- .toSingle (value )
54- .doOnSuccess (serviceOwnerId -> getLog ().debug (() -> "Service Owner ID:" + serviceOwnerId + ", This Node ID:" + value ))
55- .map (serviceOwnerId -> getClusterManager ().getNodeID ().equals (serviceOwnerId ))
56- .doOnSuccess (t -> getLog ().debug (() -> "Service Start Decision:" + getServiceName () + ":" + t ));
5767 }
5868
5969 @ Override
@@ -67,20 +77,10 @@ public void nodeLeft(String pNodeID) {
6777 return ;
6878 }
6979
70- getVertx ()
71- .sharedData ()
72- .<String , String >rxGetClusterWideMap (getServiceMapName ())
73- .subscribeOn (Schedulers .io ())
74- .flatMap ((m ) -> m .rxReplaceIfPresent (getServiceName (), pNodeID , getClusterManager ().getNodeID ()))
75- .flatMapCompletable ((success ) -> {
76- if (success ) {
77- getLog ().info (String .format ("Starting Service:[%s] becuase of cluster state update" , getServiceName ()));
78- return startService ()
79- .doOnComplete (() -> getLog ().info (String .format ("Service:[%s] start complete because of cluster state update" , getServiceName ())));
80- }
81- return Completable .complete ();
82- })
83- .blockingAwait ();
80+ Single
81+ .just (Optional .of (pNodeID ))
82+ .flatMapCompletable (this ::init )
83+ .subscribe ();
8484 }
8585
8686 public Vertx getVertx () {
0 commit comments