From ed7f4af94034184bfdf1d7a4cb09ef7ccae131bf Mon Sep 17 00:00:00 2001 From: Francesco Mari Date: Wed, 11 Mar 2026 12:53:53 +0100 Subject: [PATCH] Fix JMX MBean leak during Jetty restart cycle Call MBeanContainer.destroy() in MBeanServerTracker.removedService() to unregister all JMX MBeans before removing the event listener. Also move the MBeanServerTracker cleanup in stopJetty() to before server.stop() so MBeans are unregistered while the Server instance is still valid. Without this fix, restarting Jetty leaves stale MBean registrations (e.g. org.eclipse.jetty.server:type=server,id=0) in the platform MBeanServer, causing an InstanceAlreadyExistsException on the next startup cycle. --- .../felix/http/jetty/internal/JettyService.java | 12 ++++++------ .../http/jetty/internal/MBeanServerTracker.java | 1 + .../felix/http/jetty/internal/JettyService.java | 12 ++++++------ .../http/jetty/internal/MBeanServerTracker.java | 1 + 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java b/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java index b62f218fa2..88f70db86b 100644 --- a/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java +++ b/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java @@ -245,6 +245,12 @@ private void stopJetty() this.loadBalancerCustomizerTracker = null; } + if (this.mbeanServerTracker != null) + { + this.mbeanServerTracker.close(); + this.mbeanServerTracker = null; + } + try { this.server.stop(); @@ -255,12 +261,6 @@ private void stopJetty() { SystemLogger.LOGGER.error("Exception while stopping Jetty", e); } - - if (this.mbeanServerTracker != null) - { - this.mbeanServerTracker.close(); - this.mbeanServerTracker = null; - } } } diff --git a/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/MBeanServerTracker.java b/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/MBeanServerTracker.java index 4f1912d90f..5fd01f1338 100644 --- a/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/MBeanServerTracker.java +++ b/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/MBeanServerTracker.java @@ -59,6 +59,7 @@ public void removedService(ServiceReference reference, MBeanContain { if ( service != null ) { + service.destroy(); this.server.removeEventListener(service); super.removedService(reference, service); } diff --git a/http/jetty12/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java b/http/jetty12/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java index 24b45d8868..375b1e2d72 100644 --- a/http/jetty12/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java +++ b/http/jetty12/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java @@ -255,6 +255,12 @@ private void stopJetty() this.loadBalancerCustomizerTracker = null; } + if (this.mbeanServerTracker != null) + { + this.mbeanServerTracker.close(); + this.mbeanServerTracker = null; + } + try { this.server.stop(); @@ -265,12 +271,6 @@ private void stopJetty() { SystemLogger.LOGGER.error("Exception while stopping Jetty", e); } - - if (this.mbeanServerTracker != null) - { - this.mbeanServerTracker.close(); - this.mbeanServerTracker = null; - } } } diff --git a/http/jetty12/src/main/java/org/apache/felix/http/jetty/internal/MBeanServerTracker.java b/http/jetty12/src/main/java/org/apache/felix/http/jetty/internal/MBeanServerTracker.java index 4f1912d90f..5fd01f1338 100644 --- a/http/jetty12/src/main/java/org/apache/felix/http/jetty/internal/MBeanServerTracker.java +++ b/http/jetty12/src/main/java/org/apache/felix/http/jetty/internal/MBeanServerTracker.java @@ -59,6 +59,7 @@ public void removedService(ServiceReference reference, MBeanContain { if ( service != null ) { + service.destroy(); this.server.removeEventListener(service); super.removedService(reference, service); }