You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@artemis.apache.org by gt...@apache.org on 2026/02/18 16:58:26 UTC
(artemis) 01/02: ARTEMIS-5871 restrict reload of properties config to the set of reloadable config elements
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 <ga...@gmail.com>
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: commits-unsubscribe@artemis.apache.org
For additional commands, e-mail: commits-help@artemis.apache.org