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