This is an automated email from the ASF dual-hosted git repository.

zhuzh pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git

commit 01a84892675e0326cd294bfcced7d28626dbb46c
Author: Yi Zhang <[email protected]>
AuthorDate: Thu Mar 5 13:49:35 2026 +0800

    [hotfix][runtime] Fix statusListeners NPE after application deserialization
---
 .../flink/runtime/application/AbstractApplication.java  | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git 
a/flink-runtime/src/main/java/org/apache/flink/runtime/application/AbstractApplication.java
 
b/flink-runtime/src/main/java/org/apache/flink/runtime/application/AbstractApplication.java
index d910c2c8a2c..58134466583 100644
--- 
a/flink-runtime/src/main/java/org/apache/flink/runtime/application/AbstractApplication.java
+++ 
b/flink-runtime/src/main/java/org/apache/flink/runtime/application/AbstractApplication.java
@@ -75,7 +75,7 @@ public abstract class AbstractApplication implements 
Serializable {
      * For example, the Dispatcher registers itself as a listener to perform 
operations such as
      * archiving when the application reaches a terminal state.
      */
-    private final transient List<ApplicationStatusListener> statusListeners = 
new ArrayList<>();
+    private transient List<ApplicationStatusListener> statusListeners = new 
ArrayList<>();
 
     public AbstractApplication(ApplicationID applicationId) {
         this.applicationId = checkNotNull(applicationId);
@@ -159,7 +159,14 @@ public abstract class AbstractApplication implements 
Serializable {
      * <p>This method is not thread-safe and should not be called concurrently.
      */
     public void registerStatusListener(ApplicationStatusListener listener) {
-        statusListeners.add(listener);
+        getStatusListeners().add(listener);
+    }
+
+    private List<ApplicationStatusListener> getStatusListeners() {
+        if (statusListeners == null) {
+            statusListeners = new ArrayList<>();
+        }
+        return statusListeners;
     }
 
     // ------------------------------------------------------------------------
@@ -228,8 +235,10 @@ public abstract class AbstractApplication implements 
Serializable {
                 targetState);
         this.statusTimestamps[targetState.ordinal()] = 
System.currentTimeMillis();
         this.applicationState = targetState;
-        statusListeners.forEach(
-                listener -> 
listener.notifyApplicationStatusChange(applicationId, targetState));
+        getStatusListeners()
+                .forEach(
+                        listener ->
+                                
listener.notifyApplicationStatusChange(applicationId, targetState));
     }
 
     private void validateTransition(ApplicationState targetState) {

Reply via email to