@@ -49,6 +49,8 @@ static EventQueueBuilder builder() {
4949 public static class EventQueueBuilder {
5050 private int queueSize = DEFAULT_QUEUE_SIZE ;
5151 private EventEnqueueHook hook ;
52+ private String taskId ;
53+ private Runnable onCloseCallback ;
5254
5355 public EventQueueBuilder queueSize (int queueSize ) {
5456 this .queueSize = queueSize ;
@@ -60,9 +62,19 @@ public EventQueueBuilder hook(EventEnqueueHook hook) {
6062 return this ;
6163 }
6264
65+ public EventQueueBuilder taskId (String taskId ) {
66+ this .taskId = taskId ;
67+ return this ;
68+ }
69+
70+ public EventQueueBuilder onClose (Runnable onCloseCallback ) {
71+ this .onCloseCallback = onCloseCallback ;
72+ return this ;
73+ }
74+
6375 public EventQueue build () {
64- if (hook != null ) {
65- return new MainQueue (queueSize , hook );
76+ if (hook != null || onCloseCallback != null ) {
77+ return new MainQueue (queueSize , hook , taskId , onCloseCallback );
6678 } else {
6779 return new MainQueue (queueSize );
6880 }
@@ -154,11 +166,11 @@ public boolean isClosed() {
154166 return closed ;
155167 }
156168
157- public void doClose () {
169+ protected void doClose () {
158170 doClose (false );
159171 }
160172
161- public void doClose (boolean immediate ) {
173+ protected void doClose (boolean immediate ) {
162174 synchronized (this ) {
163175 if (closed ) {
164176 return ;
@@ -180,25 +192,43 @@ static class MainQueue extends EventQueue {
180192 private final CountDownLatch pollingStartedLatch = new CountDownLatch (1 );
181193 private final AtomicBoolean pollingStarted = new AtomicBoolean (false );
182194 private final EventEnqueueHook enqueueHook ;
195+ private final String taskId ;
196+ private final Runnable onCloseCallback ;
183197
184198 MainQueue () {
185199 super ();
186200 this .enqueueHook = null ;
201+ this .taskId = null ;
202+ this .onCloseCallback = null ;
187203 }
188204
189205 MainQueue (int queueSize ) {
190206 super (queueSize );
191207 this .enqueueHook = null ;
208+ this .taskId = null ;
209+ this .onCloseCallback = null ;
192210 }
193211
194212 MainQueue (EventEnqueueHook hook ) {
195213 super ();
196214 this .enqueueHook = hook ;
215+ this .taskId = null ;
216+ this .onCloseCallback = null ;
197217 }
198218
199219 MainQueue (int queueSize , EventEnqueueHook hook ) {
200220 super (queueSize );
201221 this .enqueueHook = hook ;
222+ this .taskId = null ;
223+ this .onCloseCallback = null ;
224+ }
225+
226+ MainQueue (int queueSize , EventEnqueueHook hook , String taskId , Runnable onCloseCallback ) {
227+ super (queueSize );
228+ this .enqueueHook = hook ;
229+ this .taskId = taskId ;
230+ this .onCloseCallback = onCloseCallback ;
231+ LOGGER .debug ("Created MainQueue for task {} with onClose callback: {}" , taskId , onCloseCallback != null );
202232 }
203233
204234 EventQueue tap () {
@@ -254,6 +284,20 @@ public int getActiveChildCount() {
254284 return children .size ();
255285 }
256286
287+ @ Override
288+ protected void doClose (boolean immediate ) {
289+ super .doClose (immediate );
290+ // Invoke callback after closing to notify QueueManager
291+ if (onCloseCallback != null ) {
292+ LOGGER .debug ("Invoking onClose callback for task {}" , taskId );
293+ try {
294+ onCloseCallback .run ();
295+ } catch (Exception e ) {
296+ LOGGER .error ("Error in onClose callback for task {}" , taskId , e );
297+ }
298+ }
299+ }
300+
257301 @ Override
258302 public void close () {
259303 close (false );
0 commit comments