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 440abab3767..9d781e559aa 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 @@ default boolean isUsingDatabasePersistence() { } Map getJaasConfigs(); + Configuration setJaasConfigs(Map 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 85e21296e95..9b6dc9cf3dc 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 void addJaasConfig(JaasAppConfiguration config) { jaasConfigs.put(config.getName(), config); } + @Override + public Configuration setJaasConfigs(Map 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 336b81f43a4..32c20c91381 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 void reloadConfigurationFile() throws Exception { } 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 329f2cf5066..1c08ce33dab 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.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 void testPropertiesOnlyConfigReload() throws Exception { 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 void testPropertiesOnlyConfigReload() throws Exception { 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 void testPropertiesOnlyConfigReload() throws Exception { 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();