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) {
