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

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

commit f9425647303bce6b3f0299af1d8115945ba6d0cf
Author: Gary Tully <[email protected]>
AuthorDate: Fri Jan 30 14:49:49 2026 +0000

    ARTEMIS-5871 restrict reload of properties config to the set of reloadable 
config elements
---
 .../artemis/core/config/Configuration.java         |  1 +
 .../core/config/impl/ConfigurationImpl.java        |  9 +++++
 .../core/server/impl/ActiveMQServerImpl.java       | 30 ++++++++++-------
 .../integration/server/ConfigurationTest.java      | 39 +++++++++++++++++-----
 4 files changed, 59 insertions(+), 20 deletions(-)

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 440abab376..9d781e559a 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
@@ -1545,4 +1545,5 @@ public interface Configuration {
    }
 
    Map<String, JaasAppConfiguration> getJaasConfigs();
+   Configuration setJaasConfigs(Map<String, JaasAppConfiguration> configs);
 }
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 50d2ee9e22..c21c03cd89 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
@@ -1040,6 +1040,15 @@ public class ConfigurationImpl extends 
javax.security.auth.login.Configuration i
       jaasConfigs.put(config.getName(), config);
    }
 
+   @Override
+   public Configuration setJaasConfigs(Map<String, JaasAppConfiguration> 
configs) {
+      jaasConfigs.putAll(configs);
+      // prune removed entries after update to retain existing entries, this 
is live config referenced by jaas
+      // see 
org.apache.activemq.artemis.core.config.impl.ConfigurationImpl.getAppConfigurationEntry
+      jaasConfigs.keySet().retainAll(configs.keySet());
+      return this;
+   }
+
    private void writeProperties(FileWriter writer) throws Exception {
       final BeanUtilsBean beanUtilsBean = new BeanUtilsBean();
       beanUtilsBean.getPropertyUtils().addBeanIntrospector(new 
FluentPropertyBeanIntrospectorWithIgnores());
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
index 336b81f43a..32c20c9138 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
@@ -4682,22 +4682,28 @@ public class ActiveMQServerImpl implements 
ActiveMQServer {
    }
 
    private void reloadConfigurationFile(URL xmlConfigUri) throws Exception {
+      Configuration config = new ConfigurationImpl();
       if (xmlConfigUri != null) {
-         Configuration config = new 
FileConfigurationParser().parseMainConfig(xmlConfigUri.openStream());
+         config = new 
FileConfigurationParser().parseMainConfig(xmlConfigUri.openStream());
          LegacyJMSConfiguration legacyJMSConfiguration = new 
LegacyJMSConfiguration(config);
          legacyJMSConfiguration.parseConfiguration(xmlConfigUri.openStream());
-         configuration.setSecurityRoles(config.getSecurityRoles());
-         configuration.setAddressSettings(config.getAddressSettings());
-         
configuration.setDivertConfigurations(config.getDivertConfigurations());
-         
configuration.setAddressConfigurations(config.getAddressConfigurations());
-         configuration.setQueueConfigs(config.getQueueConfigs());
-         
configuration.setBridgeConfigurations(config.getBridgeConfigurations());
-         
configuration.setConnectorConfigurations(config.getConnectorConfigurations());
-         
configuration.setAcceptorConfigurations(config.getAcceptorConfigurations());
-         
configuration.setAMQPConnectionConfigurations(config.getAMQPConnection());
-         configuration.setPurgePageFolders(config.isPurgePageFolders());
       }
-      configuration.parseProperties(propertiesFileUrl);
+      config.parseProperties(propertiesFileUrl);
+      configuration.setStatus(config.getStatus());
+
+      configuration.setSecurityRoles(config.getSecurityRoles());
+      configuration.setAddressSettings(config.getAddressSettings());
+      configuration.setDivertConfigurations(config.getDivertConfigurations());
+      
configuration.setAddressConfigurations(config.getAddressConfigurations());
+      configuration.setQueueConfigs(config.getQueueConfigs());
+      configuration.setBridgeConfigurations(config.getBridgeConfigurations());
+      
configuration.setConnectorConfigurations(config.getConnectorConfigurations());
+      
configuration.setAcceptorConfigurations(config.getAcceptorConfigurations());
+      
configuration.setAMQPConnectionConfigurations(config.getAMQPConnection());
+      configuration.setPurgePageFolders(config.isPurgePageFolders());
+      configuration.setConnectionRouters(config.getConnectionRouters());   // 
needs reload logic
+      configuration.setJaasConfigs(config.getJaasConfigs());
+
       updateStatus(ServerStatus.CONFIGURATION_COMPONENT, 
configuration.getStatus());
       configurationReloadDeployed.set(false);
       if (isActive()) {
diff --git 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/server/ConfigurationTest.java
 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/server/ConfigurationTest.java
index 329f2cf506..1c08ce33da 100644
--- 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/server/ConfigurationTest.java
+++ 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/server/ConfigurationTest.java
@@ -16,12 +16,9 @@
  */
 package org.apache.activemq.artemis.tests.integration.server;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
 import java.io.File;
 import java.io.FileOutputStream;
+import java.io.StringReader;
 import java.util.Properties;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
@@ -36,13 +33,20 @@ import org.apache.activemq.artemis.core.postoffice.Bindings;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl;
 import org.apache.activemq.artemis.jms.server.config.impl.FileJMSConfiguration;
+import org.apache.activemq.artemis.json.JsonObject;
 import 
org.apache.activemq.artemis.spi.core.security.ActiveMQJAASSecurityManager;
 import org.apache.activemq.artemis.spi.core.security.jaas.InVMLoginModule;
 import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
+import org.apache.activemq.artemis.utils.JsonLoader;
 import org.apache.activemq.artemis.utils.RandomUtil;
 import org.apache.activemq.artemis.tests.util.Wait;
 import org.junit.jupiter.api.Test;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 public class ConfigurationTest extends ActiveMQTestBase {
 
    @Test
@@ -183,11 +187,15 @@ public class ConfigurationTest extends ActiveMQTestBase {
       properties.put("configurationFileRefreshPeriod", "100");
       properties.put("persistenceEnabled", "false");
       properties.put("connectionRouters.joe.localTargetFilter", "LF");
+      properties.put("acceptorConfigurations.tcp.factoryClassName", 
NETTY_ACCEPTOR_FACTORY);
+      properties.put("acceptorConfigurations.tcp.params.HOST", "LOCALHOST");
+      properties.put("acceptorConfigurations.tcp.params.PORT", "61616");
 
       try (FileOutputStream outStream = new FileOutputStream(propsFile)) {
          properties.store(outStream, null);
       }
       assertTrue(propsFile.exists());
+      properties.clear();
 
       FileConfiguration fc = new FileConfiguration();
       ActiveMQJAASSecurityManager sm = new 
ActiveMQJAASSecurityManager(InVMLoginModule.class.getName(), new 
SecurityConfiguration());
@@ -199,12 +207,13 @@ public class ConfigurationTest extends ActiveMQTestBase {
 
          assertEquals(1, 
server.getConfiguration().getConnectionRouters().size());
          assertEquals("LF", 
server.getConfiguration().getConnectionRouters().get(0).getLocalTargetFilter());
-
-         properties.put("persistenceEnabled", "false");
-         properties.put("configurationFileRefreshPeriod", "100");
-
+         assertEquals(1, 
server.getActiveMQServerControl().getAcceptors().length);
          // verify update
+         properties.put("configurationFileRefreshPeriod", "100");
+         properties.put("persistenceEnabled", "false");
          properties.put("connectionRouters.joe.localTargetFilter", "UPDATED");
+
+         String startedStatus = server.getStatus();
          try (FileOutputStream outStream = new FileOutputStream(propsFile)) {
             properties.store(outStream, null);
          }
@@ -213,6 +222,20 @@ public class ConfigurationTest extends ActiveMQTestBase {
             return 
"UPDATED".equals(server.getConfiguration().getConnectionRouters().get(0).getLocalTargetFilter());
          });
 
+         // verify remove
+         assertEquals(0, 
server.getActiveMQServerControl().getAcceptors().length);
+
+         // verify status json reflects update
+         String updatedStatus = server.getStatus();
+         assertNotEquals(startedStatus, updatedStatus);
+         assertTrue(startedStatus.contains(propsFile.getName()));
+         assertTrue(updatedStatus.contains(propsFile.getName()));
+         JsonObject jsonStarted = JsonLoader.readObject(new 
StringReader(startedStatus));
+         JsonObject jsonUpdated = JsonLoader.readObject(new 
StringReader(updatedStatus));
+         String alder32Used = 
jsonStarted.getJsonObject("configuration").getJsonObject("properties").getJsonObject(propsFile.getName()).getString("fileAlder32");
+         String alder32Updated = 
jsonUpdated.getJsonObject("configuration").getJsonObject("properties").getJsonObject(propsFile.getName()).getString("fileAlder32");
+         assertNotEquals(alder32Used, alder32Updated);
+
       } finally {
          try {
             server.stop();


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

Reply via email to