55import io .vertx .core .Handler ;
66import io .vertx .core .Promise ;
77import io .vertx .core .Vertx ;
8+ import io .vertx .core .json .JsonObject ;
89import io .vertx .core .shareddata .AsyncMap ;
910import io .vertx .core .shareddata .Lock ;
1011import io .vertx .core .shareddata .SharedData ;
@@ -49,26 +50,44 @@ public Future<Void> setDequeueStatistic(final String queueName, final DequeueSta
4950 promise .complete ();
5051 };
5152
52- sharedData .getAsyncMap (DEQUEUE_STATISTIC_DATA , (Handler <AsyncResult <AsyncMap <String , DequeueStatistic >>>) asyncResult -> {
53+ sharedData .getAsyncMap (DEQUEUE_STATISTIC_DATA , (Handler <AsyncResult <AsyncMap <String , JsonObject >>>) asyncResult -> {
5354 if (asyncResult .failed ()) {
5455 log .error ("Failed to get shared dequeue statistic data map." , asyncResult .cause ());
5556 releaseAndCompleteHandler .handle (null );
5657 return ;
5758 }
58-
59- AsyncMap <String , DequeueStatistic > asyncMap = asyncResult .result ();
59+ AsyncMap <String , JsonObject > asyncMap = asyncResult .result ();
6060 asyncMap .size ().onComplete (mapSizeResult -> {
6161 log .debug ("shared dequeue statistic map size: {}" , mapSizeResult .result ());
6262 asyncMap .get (queueName ).onComplete (dequeueStatisticAsyncResult -> {
6363 if (dequeueStatisticAsyncResult .failed ()) {
6464 log .error ("Failed to get shared dequeue statistic data for queue {}." , queueName , dequeueStatisticAsyncResult .cause ());
65- releaseAndCompleteHandler .handle (null );
65+ if (dequeueStatisticAsyncResult .cause ().getClass ().getName ().contains ("HazelcastSerializationException" )) {
66+ asyncMap .remove (queueName ).onComplete (new Handler <AsyncResult <JsonObject >>() {
67+ @ Override
68+ public void handle (AsyncResult <JsonObject > event ) {
69+ if (event .failed ()) {
70+ log .error ("failed to clean broken dequeue statistic data." , event .cause ());
71+ } else {
72+ log .info ("broken dequeue statistic for {} removed" , queueName );
73+ }
74+ releaseAndCompleteHandler .handle (null );
75+ }
76+ });
77+ } else {
78+ releaseAndCompleteHandler .handle (null );
79+ }
6680 return ;
6781 }
6882
69- final DequeueStatistic sharedDequeueStatistic = dequeueStatisticAsyncResult .result ();
83+ DequeueStatistic sharedDequeueStatistic = null ;
84+
85+ // check does it is a JsonObject, if not assume it in not exist.
86+ if (dequeueStatisticAsyncResult .result () instanceof JsonObject ) {
87+ sharedDequeueStatistic = DequeueStatistic .fromJson (dequeueStatisticAsyncResult .result ());
88+ }
7089 if (sharedDequeueStatistic == null ) {
71- asyncMap .put (queueName , dequeueStatistic ).onComplete (voidAsyncResult -> {
90+ asyncMap .put (queueName , dequeueStatistic . asJson () ).onComplete (voidAsyncResult -> {
7291 if (voidAsyncResult .failed ()) {
7392 log .error ("shared dequeue statistic for queue {} failed to add." , queueName , voidAsyncResult .cause ());
7493 } else {
@@ -89,7 +108,7 @@ public Future<Void> setDequeueStatistic(final String queueName, final DequeueSta
89108 });
90109 } else {
91110 // update
92- asyncMap .put (queueName , dequeueStatistic ).onComplete (event -> {
111+ asyncMap .put (queueName , dequeueStatistic . asJson () ).onComplete (event -> {
93112 if (event .failed ()) {
94113 log .error ("shared dequeue statistic for queue {} failed to update." , queueName , event .cause ());
95114 } else {
@@ -109,25 +128,42 @@ public Future<Void> setDequeueStatistic(final String queueName, final DequeueSta
109128 return promise .future ();
110129 }
111130
112- public Future <Map <String , DequeueStatistic >> getAllDequeueStatistics () {
131+ public Future <Map <String , JsonObject >> getAllDequeueStatistics () {
113132 // Check if dequeue statistics are enabled
114133 if (!dequeueStatisticEnabled ) {
115134 return Future .succeededFuture (Collections .emptyMap ()); // Return an empty map to avoid NullPointerExceptions
116135 }
117- Promise <Map <String , DequeueStatistic >> promise = Promise .promise ();
118- sharedData .getAsyncMap (DEQUEUE_STATISTIC_DATA , (Handler <AsyncResult <AsyncMap <String , DequeueStatistic >>>) asyncResult -> {
136+ Promise <Map <String , JsonObject >> promise = Promise .promise ();
137+ sharedData .getAsyncMap (DEQUEUE_STATISTIC_DATA , (Handler <AsyncResult <AsyncMap <String , JsonObject >>>) asyncResult -> {
119138 if (asyncResult .failed ()) {
120139 log .error ("Failed to get dequeue statistic data map." , asyncResult .cause ());
121140 promise .fail (asyncResult .cause ());
122141 return ;
123142 }
124- AsyncMap <String , DequeueStatistic > asyncMap = asyncResult .result ();
143+ AsyncMap <String , JsonObject > asyncMap = asyncResult .result ();
125144 asyncMap .entries ().onSuccess (promise ::complete ).onFailure (throwable -> {
126145 log .error ("Failed to get dequeue statistic map" , throwable );
127- promise .fail (throwable );
146+ cleanAsyncMapIfBroken ( asyncMap , throwable ). onComplete ( e -> promise .fail (throwable ) );
128147 });
129-
130148 });
131149 return promise .future ();
132150 }
151+
152+ Future <Void > cleanAsyncMapIfBroken (AsyncMap <String , JsonObject > asyncMap , Throwable throwable ) {
153+ Promise <Void > promise = Promise .promise ();
154+ if (throwable .getClass ().getName ().contains ("HazelcastSerializationException" )) {
155+ asyncMap .clear ().onComplete (event -> {
156+ if (event .failed ()) {
157+ log .error ("failed to clean dequeue statistic map." , throwable );
158+ } else {
159+ log .info ("Cleaned up broken dequeue statistic AsyncMap." );
160+ }
161+ promise .complete ();
162+ }
163+ );
164+ } else {
165+ promise .complete ();
166+ }
167+ return promise .future ();
168+ }
133169}
0 commit comments