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

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


The following commit(s) were added to refs/heads/main by this push:
     new 1a7e23813c ARTEMIS-5588 allow config reload when there is no xml, just 
property files
1a7e23813c is described below

commit 1a7e23813ce6289b78eafd11f9bfa763f440f453
Author: Gary Tully <[email protected]>
AuthorDate: Fri Sep 26 16:51:35 2025 +0100

    ARTEMIS-5588 allow config reload when there is no xml, just property files
---
 .../core/server/impl/ActiveMQServerImpl.java       | 61 ++++++++++++----------
 docs/user-manual/config-reload.adoc                |  3 ++
 .../integration/server/ConfigurationTest.java      | 52 +++++++++++++++++-
 3 files changed, 86 insertions(+), 30 deletions(-)

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 a39508fe9b..f015a06766 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
@@ -3385,21 +3385,22 @@ public class ActiveMQServerImpl implements 
ActiveMQServer {
       if (configurationFileRefreshPeriod > 0) {
          this.reloadManager = new ReloadManagerImpl(getScheduledPool(), 
executorFactory.getExecutor(), configurationFileRefreshPeriod);
 
-         if (configuration.getConfigurationUrl() != null && getScheduledPool() 
!= null) {
-            final URL configUrl = configuration.getConfigurationUrl();
-            ReloadCallback xmlConfigReload = uri -> {
-               // ignore the argument from the callback such that we can 
respond
-               // to property file locations with a full reload
-               reloadConfigurationFile(configUrl);
-            };
-            reloadManager.addCallback(configUrl, xmlConfigReload);
-
-            // watch properties and reload xml config
-            String propsLocations = 
configuration.resolvePropertiesSources(propertiesFileUrl);
-            if (propsLocations != null) {
-               for (String fileUrl : propsLocations.split(",")) {
-                  reloadManager.addCallback(new File(fileUrl).toURI().toURL(), 
xmlConfigReload);
-               }
+         final URL configUrl = configuration.getConfigurationUrl();
+         ReloadCallback fullConfigReloadCallback = uri -> {
+            // ignore the argument from the callback such that we can respond
+            // to property file locations with a full reload
+            reloadConfigurationFile(configUrl);
+         };
+
+         if (configUrl != null) {
+            reloadManager.addCallback(configUrl, fullConfigReloadCallback);
+         }
+
+         // watch properties and reload config
+         String propsLocations = 
configuration.resolvePropertiesSources(propertiesFileUrl);
+         if (propsLocations != null) {
+            for (String fileUrl : propsLocations.split(",")) {
+               reloadManager.addCallback(new File(fileUrl).toURI().toURL(), 
fullConfigReloadCallback);
             }
          }
 
@@ -4623,20 +4624,22 @@ public class ActiveMQServerImpl implements 
ActiveMQServer {
       reloadConfigurationFile(configuration.getConfigurationUrl());
    }
 
-   private void reloadConfigurationFile(URL uri) throws Exception {
-      Configuration config = new 
FileConfigurationParser().parseMainConfig(uri.openStream());
-      LegacyJMSConfiguration legacyJMSConfiguration = new 
LegacyJMSConfiguration(config);
-      legacyJMSConfiguration.parseConfiguration(uri.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());
+   private void reloadConfigurationFile(URL xmlConfigUri) throws Exception {
+      if (xmlConfigUri != null) {
+         Configuration 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());
+      }
       configurationReloadDeployed.set(false);
       if (isActive()) {
          configuration.parseProperties(propertiesFileUrl);
diff --git a/docs/user-manual/config-reload.adoc 
b/docs/user-manual/config-reload.adoc
index 67e6865553..2803a21fed 100644
--- a/docs/user-manual/config-reload.adoc
+++ b/docs/user-manual/config-reload.adoc
@@ -557,3 +557,6 @@ Adding, updating and removing an `<acceptor>` is supported, 
updating or removing
 === `<jms>` _(Deprecated)_
 
 === `<queues>` _(Deprecated)_
+
+== Broker Properties
+The location of 
xref:configuration-index.adoc#broker-properties[brokerProperties] files will be 
tracked for reload. Any property values that relfect reloadable parameters will 
take effect after the `configuration-file-refresh-period`.
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 cc2bc897c1..c34bc35148 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
@@ -22,6 +22,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.File;
 import java.io.FileOutputStream;
+import java.util.Properties;
 
 import org.apache.activemq.artemis.api.core.SimpleString;
 import org.apache.activemq.artemis.core.config.CoreQueueConfiguration;
@@ -82,7 +83,7 @@ public class ConfigurationTest extends ActiveMQTestBase {
       propsFile.createNewFile();
 
       ConfigurationImpl.InsertionOrderedProperties config = new 
ConfigurationImpl.InsertionOrderedProperties();
-      config.put("configurationFileRefreshPeriod", "500");
+      config.put("configurationFileRefreshPeriod", "100");
 
       config.put("addressConfigurations.mytopic_3.routingTypes", "MULTICAST");
 
@@ -161,6 +162,55 @@ public class ConfigurationTest extends ActiveMQTestBase {
       }
    }
 
+   @Test
+   public void testPropertiesOnlyConfigReload() throws Exception {
+
+      File propsFile = new File(getTestDirfile(), "somemore.props");
+      propsFile.createNewFile();
+
+
+      Properties properties = new 
ConfigurationImpl.InsertionOrderedProperties();
+      properties.put("configurationFileRefreshPeriod", "100");
+      properties.put("persistenceEnabled", "false");
+      properties.put("connectionRouters.joe.localTargetFilter", "LF");
+
+      try (FileOutputStream outStream = new FileOutputStream(propsFile)) {
+         properties.store(outStream, null);
+      }
+      assertTrue(propsFile.exists());
+
+      FileConfiguration fc = new FileConfiguration();
+      ActiveMQJAASSecurityManager sm = new 
ActiveMQJAASSecurityManager(InVMLoginModule.class.getName(), new 
SecurityConfiguration());
+      ActiveMQServer server = addServer(new ActiveMQServerImpl(fc, sm));
+      server.setProperties(propsFile.getAbsolutePath());    // no xml config
+      try {
+
+         server.start();
+
+         assertEquals(1, 
server.getConfiguration().getConnectionRouters().size());
+         assertEquals("LF", 
server.getConfiguration().getConnectionRouters().get(0).getLocalTargetFilter());
+
+         properties.put("persistenceEnabled", "false");
+         properties.put("configurationFileRefreshPeriod", "100");
+
+         // verify update
+         properties.put("connectionRouters.joe.localTargetFilter", "UPDATED");
+         try (FileOutputStream outStream = new FileOutputStream(propsFile)) {
+            properties.store(outStream, null);
+         }
+
+         Wait.assertTrue(() -> {
+            return 
"UPDATED".equals(server.getConfiguration().getConnectionRouters().get(0).getLocalTargetFilter());
+         });
+
+      } finally {
+         try {
+            server.stop();
+         } catch (Exception e) {
+         }
+      }
+   }
+
    protected ActiveMQServer getActiveMQServer(String brokerConfig) throws 
Exception {
       FileConfiguration fc = new FileConfiguration();
       FileJMSConfiguration fileConfiguration = new FileJMSConfiguration();


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information, visit: https://activemq.apache.org/contact


Reply via email to