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

clebertsuconic pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/artemis.git


The following commit(s) were added to refs/heads/main by this push:
     new 3a5731c697 ARTEMIS-5607 Support disabling JMX notifications
3a5731c697 is described below

commit 3a5731c697c71514fe9c266fc7bc3aebf052ba2e
Author: Aayush Atharva <[email protected]>
AuthorDate: Fri Mar 6 14:31:27 2026 +0000

    ARTEMIS-5607 Support disabling JMX notifications
---
 .../api/config/ActiveMQDefaultConfiguration.java   | 10 +++++++++
 .../artemis/core/config/Configuration.java         | 12 +++++++++++
 .../core/config/impl/ConfigurationImpl.java        | 13 +++++++++++
 .../deployers/impl/FileConfigurationParser.java    |  2 ++
 .../management/impl/ActiveMQServerControlImpl.java | 12 +++++++++++
 .../management/impl/ManagementServiceImpl.java     |  2 +-
 .../resources/schema/artemis-configuration.xsd     |  8 +++++++
 .../core/config/impl/ConfigurationImplTest.java    | 25 ++++++++++++++++++++++
 .../config/impl/DefaultsFileConfigurationTest.java |  2 ++
 .../core/config/impl/FileConfigurationTest.java    |  1 +
 .../management/impl/ManagementServiceImplTest.java | 20 +++++++++++++++++
 .../resources/ConfigurationTest-full-config.xml    |  1 +
 .../ConfigurationTest-xinclude-config.xml          |  1 +
 .../ConfigurationTest-xinclude-schema-config.xml   |  1 +
 14 files changed, 109 insertions(+), 1 deletion(-)

diff --git 
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/config/ActiveMQDefaultConfiguration.java
 
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/config/ActiveMQDefaultConfiguration.java
index f49da2c223..e71fb2b9ed 100644
--- 
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/config/ActiveMQDefaultConfiguration.java
+++ 
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/config/ActiveMQDefaultConfiguration.java
@@ -192,6 +192,9 @@ public final class ActiveMQDefaultConfiguration {
    // true means that the management API is available via JMX
    private static boolean DEFAULT_JMX_MANAGEMENT_ENABLED = true;
 
+   // true means that management notifications are reproduced as JMX 
notifications
+   private static boolean DEFAULT_JMX_NOTIFICATION_ENABLED = true;
+
    // the JMX domain used to registered Apache Artemis MBeans in the 
MBeanServer
    private static String DEFAULT_JMX_DOMAIN = "org.apache.activemq.artemis";
 
@@ -900,6 +903,13 @@ public final class ActiveMQDefaultConfiguration {
       return DEFAULT_JMX_MANAGEMENT_ENABLED;
    }
 
+   /**
+    * {@code true} means that management notifications are reproduced as JMX 
notifications
+    */
+   public static boolean isDefaultJmxNotificationEnabled() {
+      return DEFAULT_JMX_NOTIFICATION_ENABLED;
+   }
+
    /**
     * the JMX domain used to registered Apache Artemis MBeans in the 
MBeanServer
     */
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
index fa58778bea..67aa0279cc 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
@@ -284,6 +284,18 @@ public interface Configuration {
     */
    Configuration setJMXManagementEnabled(boolean enabled);
 
+   /**
+    * {@return whether management notifications are reproduced as JMX 
notifications; default is {@link
+    * ActiveMQDefaultConfiguration#DEFAULT_JMX_NOTIFICATION_ENABLED}}
+    */
+   boolean isJMXNotificationEnabled();
+
+   /**
+    * Sets whether management notifications are reproduced as JMX 
notifications; default is
+    * {@link ActiveMQDefaultConfiguration#DEFAULT_JMX_NOTIFICATION_ENABLED}}
+    */
+   Configuration setJMXNotificationEnabled(boolean enabled);
+
    /**
     * {@return the domain used by JMX MBeans (provided JMX management is 
enabled); default is {@link
     * ActiveMQDefaultConfiguration#DEFAULT_JMX_DOMAIN}}
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
index 53f9c92505..5647b653a3 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
@@ -210,6 +210,8 @@ public class ConfigurationImpl extends 
javax.security.auth.login.Configuration i
 
    protected boolean jmxManagementEnabled = 
ActiveMQDefaultConfiguration.isDefaultJmxManagementEnabled();
 
+   protected boolean jmxNotificationEnabled = 
ActiveMQDefaultConfiguration.isDefaultJmxNotificationEnabled();
+
    protected String jmxDomain = 
ActiveMQDefaultConfiguration.getDefaultJmxDomain();
 
    protected boolean jmxUseBrokerName = 
ActiveMQDefaultConfiguration.isDefaultJMXUseBrokerName();
@@ -2173,6 +2175,17 @@ public class ConfigurationImpl extends 
javax.security.auth.login.Configuration i
       return this;
    }
 
+   @Override
+   public boolean isJMXNotificationEnabled() {
+      return jmxNotificationEnabled;
+   }
+
+   @Override
+   public ConfigurationImpl setJMXNotificationEnabled(final boolean enabled) {
+      jmxNotificationEnabled = enabled;
+      return this;
+   }
+
    @Override
    public String getJMXDomain() {
       return jmxDomain;
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
index 3e1963b4ed..7927aa6b73 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
@@ -462,6 +462,8 @@ public final class FileConfigurationParser extends 
XMLConfigurationUtil {
 
       config.setJMXManagementEnabled(getBoolean(e, "jmx-management-enabled", 
config.isJMXManagementEnabled()));
 
+      config.setJMXNotificationEnabled(getBoolean(e, 
"jmx-notification-enabled", config.isJMXNotificationEnabled()));
+
       config.setJMXDomain(getString(e, "jmx-domain", config.getJMXDomain(), 
NOT_NULL_OR_EMPTY));
 
       config.setJMXUseBrokerName(getBoolean(e, "jmx-use-broker-name", 
config.isJMXUseBrokerName()));
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
index 7f72ed455c..83be85e376 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
@@ -4226,6 +4226,9 @@ public class ActiveMQServerControlImpl extends 
AbstractControl implements Active
    public void removeNotificationListener(final NotificationListener listener,
                                           final NotificationFilter filter,
                                           final Object handback) throws 
ListenerNotFoundException {
+      if (broadcaster == null) {
+         return;
+      }
       if (AuditLogger.isBaseLoggingEnabled()) {
          AuditLogger.removeNotificationListener(this.server, listener, filter, 
handback);
       }
@@ -4239,6 +4242,9 @@ public class ActiveMQServerControlImpl extends 
AbstractControl implements Active
 
    @Override
    public void removeNotificationListener(final NotificationListener listener) 
throws ListenerNotFoundException {
+      if (broadcaster == null) {
+         return;
+      }
       if (AuditLogger.isBaseLoggingEnabled()) {
          AuditLogger.removeNotificationListener(this.server, listener);
       }
@@ -4254,6 +4260,9 @@ public class ActiveMQServerControlImpl extends 
AbstractControl implements Active
    public void addNotificationListener(final NotificationListener listener,
                                        final NotificationFilter filter,
                                        final Object handback) throws 
IllegalArgumentException {
+      if (broadcaster == null) {
+         return;
+      }
       if (AuditLogger.isBaseLoggingEnabled()) {
          AuditLogger.addNotificationListener(this.server, listener, filter, 
handback);
       }
@@ -4438,6 +4447,9 @@ public class ActiveMQServerControlImpl extends 
AbstractControl implements Active
 
    @Override
    public void 
onNotification(org.apache.activemq.artemis.core.server.management.Notification 
notification) {
+      if (broadcaster == null) {
+         return;
+      }
       if (!(notification.getType() instanceof CoreNotificationType type))
          return;
       if (type == CoreNotificationType.SESSION_CREATED) {
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
index f7e6734d0b..bb35f814c6 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
@@ -178,7 +178,7 @@ public class ManagementServiceImpl implements 
ManagementService {
       messageCounterEnabled = configuration.isMessageCounterEnabled();
       managementAddress = configuration.getManagementAddress();
       managementNotificationAddress = 
configuration.getManagementNotificationAddress();
-      broadcaster = new NotificationBroadcasterSupport();
+      broadcaster = configuration.isJMXNotificationEnabled() ? new 
NotificationBroadcasterSupport() : null;
       notificationsEnabled = true;
       objectNameBuilder = 
ObjectNameBuilder.create(configuration.getJMXDomain(), configuration.getName(), 
configuration.isJMXUseBrokerName());
       managementMessageRbacResourceNamePrefix = 
configuration.isManagementMessageRbac() ? 
SimpleString.of(configuration.getManagementRbacPrefix()).concat('.') : null;
diff --git a/artemis-server/src/main/resources/schema/artemis-configuration.xsd 
b/artemis-server/src/main/resources/schema/artemis-configuration.xsd
index d65b21327d..63c6cf5321 100644
--- a/artemis-server/src/main/resources/schema/artemis-configuration.xsd
+++ b/artemis-server/src/main/resources/schema/artemis-configuration.xsd
@@ -252,6 +252,14 @@
             </xsd:annotation>
          </xsd:element>
 
+         <xsd:element name="jmx-notification-enabled" type="xsd:boolean" 
default="true" maxOccurs="1" minOccurs="0">
+            <xsd:annotation>
+               <xsd:documentation>
+                  whether management notifications are reproduced as JMX 
notifications
+               </xsd:documentation>
+            </xsd:annotation>
+         </xsd:element>
+
          <xsd:element name="jmx-domain" type="xsd:string" 
default="org.apache.activemq" maxOccurs="1" minOccurs="0">
             <xsd:annotation>
                <xsd:documentation>
diff --git 
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java
 
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java
index 9a9c9990f6..8b2bf1f4ad 100644
--- 
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java
+++ 
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java
@@ -3148,6 +3148,31 @@ public class ConfigurationImplTest extends 
AbstractConfigurationTestBase {
       
assertTrue(properties.containsKey("addressConfigurations.test.queueConfigs.test.name"));
    }
 
+   @Test
+   public void testParseJMXEnabledOnProperties() throws Exception {
+      Properties properties = new Properties();
+
+      properties.put("JMXNotificationEnabled", "false");
+      ConfigurationImpl configuration = new ConfigurationImpl();
+      configuration.parsePrefixedProperties(properties, null);
+
+      assertFalse(configuration.isJMXNotificationEnabled());
+
+      File outputProperty = new File(getTestDirfile(), "broker.properties");
+      configuration.exportAsProperties(outputProperty);
+
+      Properties brokerProperties = new Properties();
+
+      try (FileInputStream is = new FileInputStream(outputProperty)) {
+         BufferedInputStream bis = new BufferedInputStream(is);
+         brokerProperties.load(bis);
+      }
+
+      assertEquals("false", brokerProperties.get("JMXNotificationEnabled"));
+   }
+
+
+
    /**
     * Verifies the lock coordinator configuration parsing and export process:
     * <ul>
diff --git 
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/DefaultsFileConfigurationTest.java
 
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/DefaultsFileConfigurationTest.java
index ac82dd031a..8701f6cc31 100644
--- 
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/DefaultsFileConfigurationTest.java
+++ 
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/DefaultsFileConfigurationTest.java
@@ -52,6 +52,8 @@ public class DefaultsFileConfigurationTest extends 
AbstractConfigurationTestBase
 
       
assertEquals(ActiveMQDefaultConfiguration.isDefaultJmxManagementEnabled(), 
conf.isJMXManagementEnabled());
 
+      
assertEquals(ActiveMQDefaultConfiguration.isDefaultJmxNotificationEnabled(), 
conf.isJMXNotificationEnabled());
+
       assertEquals(ActiveMQDefaultConfiguration.getDefaultJmxDomain(), 
conf.getJMXDomain());
 
       assertEquals(0, conf.getIncomingInterceptorClassNames().size());
diff --git 
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
 
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
index 4dead4742a..b885e6e3fd 100644
--- 
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
+++ 
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
@@ -205,6 +205,7 @@ public class FileConfigurationTest extends 
AbstractConfigurationTestBase {
       assertEquals("Frog", configInstance.getClusterUser());
       assertEquals("Wombat", configInstance.getClusterPassword());
       assertFalse(configInstance.isJMXManagementEnabled());
+      assertFalse(configInstance.isJMXNotificationEnabled());
       assertEquals("gro.qtenroh", configInstance.getJMXDomain());
       assertTrue(configInstance.isMessageCounterEnabled());
       assertEquals(5, configInstance.getMessageCounterMaxDayHistory());
diff --git 
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImplTest.java
 
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImplTest.java
index 198a6e3ddf..38ddebbc85 100644
--- 
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImplTest.java
+++ 
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImplTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.activemq.artemis.core.server.management.impl;
 
+import java.lang.reflect.Field;
 import javax.management.MBeanServer;
 
 import org.apache.activemq.artemis.api.core.RoutingType;
@@ -40,6 +41,9 @@ import 
org.apache.activemq.artemis.utils.actors.ArtemisExecutor;
 import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
 public class ManagementServiceImplTest {
 
    MBeanServer mBeanServer = Mockito.mock(MBeanServer.class);
@@ -190,6 +194,22 @@ public class ManagementServiceImplTest {
 
    }
 
+   @Test
+   public void testBroadcasterNullWhenJMXNotificationDisabled() throws 
Exception {
+      Field broadcasterField = 
ManagementServiceImpl.class.getDeclaredField("broadcaster");
+      broadcasterField.setAccessible(true);
+
+      FileConfiguration enabledConfig = new FileConfiguration();
+      enabledConfig.setJMXNotificationEnabled(true);
+      ManagementServiceImpl enabledService = new 
ManagementServiceImpl(mBeanServer, enabledConfig);
+      assertNotNull(broadcasterField.get(enabledService));
+
+      FileConfiguration disabledConfig = new FileConfiguration();
+      disabledConfig.setJMXNotificationEnabled(false);
+      ManagementServiceImpl disabledService = new 
ManagementServiceImpl(mBeanServer, disabledConfig);
+      assertNull(broadcasterField.get(disabledService));
+   }
+
    @Test
    public void testGetAttributeNoSecurityCheck() throws Exception {
 
diff --git 
a/artemis-server/src/test/resources/ConfigurationTest-full-config.xml 
b/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
index 14b76645c8..88a7619c8f 100644
--- a/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
+++ b/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
@@ -40,6 +40,7 @@
       <mask-password>true</mask-password>
       
<log-delegate-factory-class-name>com.foo</log-delegate-factory-class-name>
       <jmx-management-enabled>false</jmx-management-enabled>
+      <jmx-notification-enabled>false</jmx-notification-enabled>
       <jmx-domain>gro.qtenroh</jmx-domain>
       <message-counter-enabled>true</message-counter-enabled>
       <message-counter-sample-period>123456</message-counter-sample-period>
diff --git 
a/artemis-server/src/test/resources/ConfigurationTest-xinclude-config.xml 
b/artemis-server/src/test/resources/ConfigurationTest-xinclude-config.xml
index 803eed9747..86274bc7a2 100644
--- a/artemis-server/src/test/resources/ConfigurationTest-xinclude-config.xml
+++ b/artemis-server/src/test/resources/ConfigurationTest-xinclude-config.xml
@@ -41,6 +41,7 @@
       <mask-password>true</mask-password>
       
<log-delegate-factory-class-name>com.foo</log-delegate-factory-class-name>
       <jmx-management-enabled>false</jmx-management-enabled>
+      <jmx-notification-enabled>false</jmx-notification-enabled>
       <jmx-domain>gro.qtenroh</jmx-domain>
       <message-counter-enabled>true</message-counter-enabled>
       <message-counter-sample-period>123456</message-counter-sample-period>
diff --git 
a/artemis-server/src/test/resources/ConfigurationTest-xinclude-schema-config.xml
 
b/artemis-server/src/test/resources/ConfigurationTest-xinclude-schema-config.xml
index eec3aae8e7..05c9e062be 100644
--- 
a/artemis-server/src/test/resources/ConfigurationTest-xinclude-schema-config.xml
+++ 
b/artemis-server/src/test/resources/ConfigurationTest-xinclude-schema-config.xml
@@ -41,6 +41,7 @@
       <mask-password>true</mask-password>
       
<log-delegate-factory-class-name>com.foo</log-delegate-factory-class-name>
       <jmx-management-enabled>false</jmx-management-enabled>
+      <jmx-notification-enabled>false</jmx-notification-enabled>
       <jmx-domain>gro.qtenroh</jmx-domain>
       <message-counter-enabled>true</message-counter-enabled>
       <message-counter-sample-period>123456</message-counter-sample-period>


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to