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/06/09 15:58:21 UTC

(artemis) branch main updated: ARTEMIS-6110 fix JSON broker properties array handling

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


The following commit(s) were added to refs/heads/main by this push:
     new 2f7183b97c ARTEMIS-6110 fix JSON broker properties array handling
2f7183b97c is described below

commit 2f7183b97c04e15bef476734f0fb4035f16b1121
Author: Thomas Lavocat <th...@gmail.com>
AuthorDate: Mon Jun 1 10:55:53 2026 +0200

    ARTEMIS-6110 fix JSON broker properties array handling
    
    On origin/main, InsertionOrderedProperties.loadJsonObject handles
    OBJECT, STRING, NUMBER, TRUE, FALSE — and throws on anything else.
    Any JSON config file containing an array value (routingTypes,
    staticConnectors, interceptorClassNames, etc.) causes a hard crash
    during broker startup.
    
    Add a case ARRAY: to the switch that joins array elements into a
    comma-separated string — the exact format the downstream
    parsePrefixedProperties machinery already expects for list-typed
    properties.
    
    Add JsonConfigurationFullTest: an exhaustive integration test that
    loads a hand-crafted JSON config covering every exportable
    configuration section, applies it via parseFileProperties(), and
    asserts every configured value. The test resource uses JSON arrays
    in ~9 places, directly exercising the fix.
    
    Co-authored-by: Cursor <cu...@cursor.com>
---
 .../core/config/impl/ConfigurationImpl.java        |  11 +
 .../config/impl/AbstractConfigurationFullTest.java | 697 +++++++++++++++++++++
 .../config/impl/JsonConfigurationFullTest.java     |  33 +
 .../config/impl/YamlConfigurationFullTest.java     |  33 +
 .../src/test/resources/broker-full-config.json     | 490 +++++++++++++++
 .../src/test/resources/broker-full-config.yaml     | 434 +++++++++++++
 6 files changed, 1698 insertions(+)

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 beacb7b740..de5ed223a6 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
@@ -3913,6 +3913,10 @@ public class ConfigurationImpl extends javax.security.auth.login.Configuration i
             Object value = entry.getValue();
             if (value instanceof Map) {
                loadYamlMap(keySurroundString, propertyKey + ".", (Map<String, Object>) value);
+            } else if (value instanceof List<?> list) {
+               put(propertyKey, list.stream()
+                  .map(String::valueOf)
+                  .collect(java.util.stream.Collectors.joining(",")));
             } else if (value != null) {
                put(propertyKey, String.valueOf(value));
             }
@@ -3950,6 +3954,13 @@ public class ConfigurationImpl extends javax.security.auth.login.Configuration i
                case FALSE:
                   put(propertyKey, String.valueOf(jsonValue));
                   break;
+               case ARRAY:
+                  put(propertyKey, jsonValue.asJsonArray().stream()
+                     .map(v -> v.getValueType() == JsonValue.ValueType.STRING
+                        ? ((JsonString) v).getString()
+                        : String.valueOf(v))
+                     .collect(java.util.stream.Collectors.joining(",")));
+                  break;
                default:
                   throw new IllegalStateException("JSON value type not supported: " + jsonValueType);
             }
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/AbstractConfigurationFullTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/AbstractConfigurationFullTest.java
new file mode 100644
index 0000000000..fa179ca470
--- /dev/null
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/AbstractConfigurationFullTest.java
@@ -0,0 +1,697 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq.artemis.core.config.impl;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.io.File;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.StandardCopyOption;
+
+import org.apache.activemq.artemis.api.core.RoutingType;
+import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.api.core.TransportConfiguration;
+import java.util.Map;
+import java.util.Set;
+
+import java.util.List;
+
+import org.apache.activemq.artemis.core.config.BridgeConfiguration;
+import org.apache.activemq.artemis.core.config.ClusterConnectionConfiguration;
+import org.apache.activemq.artemis.core.config.CoreAddressConfiguration;
+import org.apache.activemq.artemis.core.config.DivertConfiguration;
+import org.apache.activemq.artemis.core.config.HAPolicyConfiguration;
+import org.apache.activemq.artemis.core.config.JaasAppConfiguration;
+import org.apache.activemq.artemis.core.config.JaasAppConfigurationEntry;
+import org.apache.activemq.artemis.core.config.MetricsConfiguration;
+import org.apache.activemq.artemis.core.config.WildcardConfiguration;
+import org.apache.activemq.artemis.core.config.amqpBrokerConnectivity.AMQPBrokerConnectConfiguration;
+import org.apache.activemq.artemis.core.config.amqpBrokerConnectivity.AMQPMirrorBrokerConnectionElement;
+import org.apache.activemq.artemis.core.config.FederationConfiguration;
+import org.apache.activemq.artemis.core.config.LockCoordinatorConfiguration;
+import org.apache.activemq.artemis.core.config.federation.FederationAddressPolicyConfiguration;
+import org.apache.activemq.artemis.core.config.federation.FederationQueuePolicyConfiguration;
+import org.apache.activemq.artemis.core.config.ha.LiveOnlyPolicyConfiguration;
+import org.apache.activemq.artemis.core.config.routing.ConnectionRouterConfiguration;
+import org.apache.activemq.artemis.core.server.group.impl.GroupingHandlerConfiguration;
+import org.apache.activemq.artemis.core.security.Role;
+import org.apache.activemq.artemis.core.server.impl.LegacyLDAPSecuritySettingPlugin;
+import org.apache.activemq.artemis.core.server.plugin.impl.LoggingActiveMQServerPlugin;
+import org.apache.activemq.artemis.core.server.routing.KeyType;
+import org.apache.activemq.artemis.core.server.ComponentConfigurationRoutingType;
+import org.apache.activemq.artemis.core.server.cluster.impl.MessageLoadBalancingType;
+import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy;
+import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
+import org.apache.activemq.artemis.core.settings.impl.DeletionPolicy;
+import org.apache.activemq.artemis.core.settings.impl.DiskFullMessagePolicy;
+import org.apache.activemq.artemis.core.settings.impl.ResourceLimitSettings;
+import org.apache.activemq.artemis.core.settings.impl.SlowConsumerPolicy;
+import org.apache.activemq.artemis.core.settings.impl.SlowConsumerThresholdMeasurementUnit;
+import org.apache.activemq.artemis.core.server.JournalType;
+import org.apache.activemq.artemis.utils.critical.CriticalAnalyzerPolicy;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInstance;
+import org.junit.jupiter.api.io.TempDir;
+
+/**
+ * Exhaustive integration test for broker configuration loaded from a structured
+ * file format (JSON or YAML).
+ *
+ * Loads a hand-crafted static config covering every exportable configuration
+ * section, applies it to ConfigurationImpl via parseFileProperties(), and asserts
+ * every configured value.
+ *
+ * Subclasses provide the resource path and local file name for the format under test.
+ */
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+public abstract class AbstractConfigurationFullTest {
+
+   @TempDir
+   File tempDir;
+
+   protected ConfigurationImpl configuration;
+
+   protected abstract String getConfigResource();
+
+   protected abstract String getConfigFileName();
+
+   @BeforeAll
+   public void loadConfiguration() throws Exception {
+      configuration = new ConfigurationImpl();
+
+      File tmpFile = new File(tempDir, getConfigFileName());
+      try (InputStream is = getClass().getResourceAsStream(getConfigResource())) {
+         assertNotNull(is, "Test resource " + getConfigResource() + " not found on classpath");
+         Files.copy(is, tmpFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
+      }
+
+      configuration.parseFileProperties(tmpFile);
+
+      assertTrue(configuration.getStatus().contains("\"errors\":[]"),
+         "Configuration apply had errors: " + configuration.getStatus());
+   }
+
+   @AfterAll
+   public void restoreJaasConfiguration() {
+      javax.security.auth.login.Configuration.setConfiguration(null);
+   }
+
+   @Test
+   public void testRootPrimitives() {
+      assertEquals("full-test-broker", configuration.getName());
+      assertTrue(configuration.isPersistenceEnabled());
+      assertTrue(configuration.isPersistDeliveryCountBeforeDelivery());
+      assertEquals(10, configuration.getScheduledThreadPoolMaxSize());
+      assertEquals(50, configuration.getThreadPoolMaxSize());
+      assertFalse(configuration.isSecurityEnabled());
+      assertTrue(configuration.isGracefulShutdownEnabled());
+      assertEquals(30000, configuration.getGracefulShutdownTimeout());
+
+      assertEquals(JournalType.NIO, configuration.getJournalType());
+      assertTrue(configuration.isJournalSyncTransactional());
+      assertFalse(configuration.isJournalSyncNonTransactional());
+      assertEquals(10485760, configuration.getJournalFileSize());
+      assertEquals(5, configuration.getJournalMinFiles());
+      assertEquals(10, configuration.getJournalPoolFiles());
+      assertEquals(15, configuration.getJournalCompactMinFiles());
+      assertEquals(50, configuration.getJournalCompactPercentage());
+      assertEquals(4, configuration.getJournalMaxIO_NIO());
+      assertEquals(3334, configuration.getJournalBufferTimeout_NIO());
+      assertEquals(307200, configuration.getJournalBufferSize_NIO());
+      assertEquals(5, configuration.getJournalMaxAtticFiles());
+      assertEquals(10, configuration.getJournalFileOpenTimeout());
+      assertEquals(20, configuration.getJournalLockAcquisitionTimeout());
+      assertTrue(configuration.isReadWholePage());
+      assertFalse(configuration.isLogJournalWriteRate());
+      assertTrue(configuration.isCreateBindingsDir());
+      assertTrue(configuration.isCreateJournalDir());
+      assertFalse(configuration.isLargeMessageSync());
+      assertTrue(configuration.isJournalDatasync());
+
+      assertEquals("test-data/bindings", configuration.getBindingsDirectory());
+      assertEquals("test-data/journal", configuration.getJournalDirectory());
+      assertEquals("test-data/paging", configuration.getPagingDirectory());
+      assertEquals("test-data/large-messages", configuration.getLargeMessagesDirectory());
+      assertEquals("test-data/lock", configuration.getNodeManagerLockDirectory());
+
+      assertEquals(5000, configuration.getSecurityInvalidationInterval());
+      assertEquals(500, configuration.getAuthenticationCacheSize());
+      assertEquals(500, configuration.getAuthorizationCacheSize());
+      assertEquals(60000, configuration.getConnectionTTLOverride());
+      assertEquals(1000, configuration.getConnectionTtlCheckInterval());
+
+      assertEquals(100 * 1024 * 1024, configuration.getGlobalMaxSize());
+      assertEquals(5000, configuration.getGlobalMaxMessages());
+      assertEquals(95, configuration.getMaxDiskUsage());
+      assertEquals(1048576, configuration.getMinDiskFree());
+      assertEquals(10000, configuration.getDiskScanPeriod());
+
+      assertTrue(configuration.isJMXManagementEnabled());
+      assertEquals("org.apache.activemq.test", configuration.getJMXDomain());
+      assertTrue(configuration.isJMXUseBrokerName());
+      assertEquals(SimpleString.of("activemq.management.test"), configuration.getManagementAddress());
+      assertEquals(SimpleString.of("activemq.notifications.test"), configuration.getManagementNotificationAddress());
+      assertFalse(configuration.isManagementMessageRbac());
+      assertEquals("mops.rbac", configuration.getManagementRbacPrefix());
+      assertEquals("^(get|is|count|list|browse|query).*$", configuration.getViewPermissionMethodMatchPattern());
+
+      assertEquals("test-cluster-user", configuration.getClusterUser());
+      assertEquals("test-cluster-password", configuration.getClusterPassword());
+
+      assertTrue(configuration.isMessageCounterEnabled());
+      assertEquals(5000, configuration.getMessageCounterSamplePeriod());
+      assertEquals(5, configuration.getMessageCounterMaxDayHistory());
+      assertEquals(15000, configuration.getMessageExpiryScanPeriod());
+      assertEquals(5, configuration.getMessageExpiryThreadPriority());
+      assertEquals(25000, configuration.getAddressQueueScanPeriod());
+      assertEquals(120000, configuration.getTransactionTimeout());
+      assertEquals(5000, configuration.getTransactionTimeoutScanPeriod());
+
+      assertTrue(configuration.isCriticalAnalyzer());
+      assertEquals(CriticalAnalyzerPolicy.SHUTDOWN, configuration.getCriticalAnalyzerPolicy());
+      assertEquals(120000, configuration.getCriticalAnalyzerTimeout());
+      assertEquals(30000, configuration.getCriticalAnalyzerCheckPeriod());
+
+      assertEquals(7, configuration.getMirrorAckManagerQueueAttempts());
+      assertEquals(3, configuration.getMirrorAckManagerPageAttempts());
+      assertEquals(200, configuration.getMirrorAckManagerRetryDelay());
+      assertTrue(configuration.isMirrorPageTransaction());
+      assertTrue(configuration.isMirrorAckManagerWarnUnacked());
+
+      assertEquals(2000, configuration.getMqttSessionScanInterval());
+      assertTrue(configuration.isMqttSubscriptionPersistenceEnabled());
+
+      assertEquals(20, configuration.getMaxRedeliveryRecords());
+      assertEquals(500, configuration.getIDCacheSize());
+      assertTrue(configuration.isPersistIDCache());
+      assertEquals(30000, configuration.getServerDumpInterval());
+      assertEquals(70, configuration.getMemoryWarningThreshold());
+      assertEquals(5000, configuration.getMemoryMeasureInterval());
+      assertTrue(configuration.isAmqpUseCoreSubscriptionNaming());
+      assertTrue(configuration.isSuppressSessionNotifications());
+      assertEquals(3334, configuration.getPageSyncTimeout());
+      assertEquals(10, configuration.getPageMaxConcurrentIO());
+      assertEquals("`", configuration.getLiteralMatchMarkers());
+      assertEquals(3000, configuration.getConfigurationFileRefreshPeriod());
+      assertTrue(configuration.isPurgePageFolders());
+      assertEquals(1000, configuration.getFileDeployerScanPeriod());
+      assertTrue(configuration.isPopulateValidatedUser());
+      assertTrue(configuration.isRejectEmptyValidatedUser());
+   }
+
+   @Test
+   public void testConnectorConfigurations() {
+      assertEquals(2, configuration.getConnectorConfigurations().size());
+
+      TransportConfiguration nettyConnector = configuration.getConnectorConfigurations().get("netty-connector");
+      assertNotNull(nettyConnector);
+      assertEquals("org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnectorFactory", nettyConnector.getFactoryClassName());
+      assertEquals("localhost", nettyConnector.getParams().get("HOST"));
+      assertEquals("61617", nettyConnector.getParams().get("PORT"));
+
+      TransportConfiguration invmConnector = configuration.getConnectorConfigurations().get("invm-connector");
+      assertNotNull(invmConnector);
+      assertEquals("org.apache.activemq.artemis.core.remoting.impl.invm.InVMConnectorFactory", invmConnector.getFactoryClassName());
+      assertEquals("0", invmConnector.getParams().get("ID"));
+   }
+
+   @Test
+   public void testAcceptorConfigurations() {
+      assertEquals(2, configuration.getAcceptorConfigurations().size());
+
+      TransportConfiguration nettyAcceptor = configuration.getAcceptorConfigurations().stream()
+         .filter(tc -> "netty-acceptor".equals(tc.getName())).findFirst().orElse(null);
+      assertNotNull(nettyAcceptor);
+      assertEquals("org.apache.activemq.artemis.core.remoting.impl.netty.NettyAcceptorFactory", nettyAcceptor.getFactoryClassName());
+      assertEquals("0.0.0.0", nettyAcceptor.getParams().get("HOST"));
+      assertEquals("61616", nettyAcceptor.getParams().get("PORT"));
+      assertEquals("false", nettyAcceptor.getExtraParams().get("supportAdvisory"));
+
+      TransportConfiguration invmAcceptor = configuration.getAcceptorConfigurations().stream()
+         .filter(tc -> "invm-acceptor".equals(tc.getName())).findFirst().orElse(null);
+      assertNotNull(invmAcceptor);
+      assertEquals("org.apache.activemq.artemis.core.remoting.impl.invm.InVMAcceptorFactory", invmAcceptor.getFactoryClassName());
+      assertEquals("0", invmAcceptor.getParams().get("ID"));
+   }
+
+   @Test
+   public void testAddressConfigurations() {
+      assertEquals(2, configuration.getAddressConfigurations().size());
+
+      CoreAddressConfiguration ordersAddr = configuration.getAddressConfigurations().stream()
+         .filter(a -> "orders".equals(a.getName())).findFirst().orElse(null);
+      assertNotNull(ordersAddr);
+      assertEquals(1, ordersAddr.getQueueConfigs().size());
+      assertEquals(SimpleString.of("orders"), ordersAddr.getQueueConfigs().get(0).getName());
+      assertEquals(RoutingType.ANYCAST, ordersAddr.getQueueConfigs().get(0).getRoutingType());
+      assertTrue(ordersAddr.getQueueConfigs().get(0).isDurable());
+
+      CoreAddressConfiguration notifAddr = configuration.getAddressConfigurations().stream()
+         .filter(a -> "notifications".equals(a.getName())).findFirst().orElse(null);
+      assertNotNull(notifAddr);
+      assertEquals(1, notifAddr.getQueueConfigs().size());
+      assertEquals(SimpleString.of("notifications"), notifAddr.getQueueConfigs().get(0).getName());
+      assertEquals(RoutingType.MULTICAST, notifAddr.getQueueConfigs().get(0).getRoutingType());
+      assertFalse(notifAddr.getQueueConfigs().get(0).isDurable());
+   }
+
+   @Test
+   public void testSecurityRoles() {
+      Map<String, Set<Role>> roles = configuration.getSecurityRoles();
+      assertEquals(2, roles.size());
+
+      Set<Role> ordersRoles = roles.get("orders.#");
+      assertNotNull(ordersRoles, "Expected security roles for wildcard 'orders.#'");
+      assertEquals(2, ordersRoles.size());
+
+      Role producers = ordersRoles.stream().filter(r -> "producers".equals(r.getName())).findFirst().orElse(null);
+      assertNotNull(producers);
+      assertTrue(producers.isSend());
+      assertFalse(producers.isConsume());
+      assertFalse(producers.isCreateDurableQueue());
+      assertFalse(producers.isManage());
+
+      Role consumers = ordersRoles.stream().filter(r -> "consumers".equals(r.getName())).findFirst().orElse(null);
+      assertNotNull(consumers);
+      assertFalse(consumers.isSend());
+      assertTrue(consumers.isConsume());
+      assertTrue(consumers.isCreateNonDurableQueue());
+      assertTrue(consumers.isDeleteNonDurableQueue());
+      assertTrue(consumers.isBrowse());
+
+      Set<Role> notifRoles = roles.get("notifications.*");
+      assertNotNull(notifRoles, "Expected security roles for wildcard 'notifications.*'");
+      assertEquals(1, notifRoles.size());
+      Role monitors = notifRoles.iterator().next();
+      assertEquals("monitors", monitors.getName());
+      assertTrue(monitors.isConsume());
+      assertTrue(monitors.isBrowse());
+      assertFalse(monitors.isSend());
+   }
+
+   @Test
+   public void testBridgeConfigurations() {
+      assertEquals(1, configuration.getBridgeConfigurations().size());
+      BridgeConfiguration bridge = configuration.getBridgeConfigurations().get(0);
+      assertEquals("orders-bridge", bridge.getName());
+      assertEquals("orders", bridge.getQueueName());
+      assertEquals("orders.remote", bridge.getForwardingAddress());
+      assertEquals(1, bridge.getStaticConnectors().size());
+      assertEquals("netty-connector", bridge.getStaticConnectors().get(0));
+      assertEquals(10, bridge.getConfirmationWindowSize());
+      assertEquals(ComponentConfigurationRoutingType.STRIP, bridge.getRoutingType());
+      assertEquals(500, bridge.getRetryInterval());
+      assertEquals(2.0, bridge.getRetryIntervalMultiplier(), 0.01);
+      assertEquals(3, bridge.getReconnectAttempts());
+      assertTrue(bridge.isUseDuplicateDetection());
+      assertNotNull(bridge.getTransformerConfiguration());
+      assertEquals("org.apache.activemq.artemis.core.server.transformer.AddHeadersTransformer",
+         bridge.getTransformerConfiguration().getClassName());
+      assertEquals("value1", bridge.getTransformerConfiguration().getProperties().get("header1"));
+      assertEquals("value2", bridge.getTransformerConfiguration().getProperties().get("header2"));
+   }
+
+   @Test
+   public void testClusterConfigurations() {
+      assertEquals(1, configuration.getClusterConfigurations().size());
+      ClusterConnectionConfiguration cluster = configuration.getClusterConfigurations().get(0);
+      assertEquals("my-cluster", cluster.getName());
+      assertEquals("netty-connector", cluster.getConnectorName());
+      assertEquals(1, cluster.getStaticConnectors().size());
+      assertEquals("netty-connector", cluster.getStaticConnectors().get(0));
+      assertEquals(MessageLoadBalancingType.ON_DEMAND, cluster.getMessageLoadBalancingType());
+      assertEquals(2, cluster.getMaxHops());
+      assertEquals(1000, cluster.getRetryInterval());
+      assertEquals(30000, cluster.getCallTimeout());
+      assertEquals(5000, cluster.getCallFailoverTimeout());
+      assertTrue(cluster.isDuplicateDetection());
+      assertEquals(1048576, cluster.getConfirmationWindowSize());
+   }
+
+   @Test
+   public void testDivertConfigurations() {
+      assertEquals(1, configuration.getDivertConfigurations().size());
+      DivertConfiguration divert = configuration.getDivertConfigurations().get(0);
+      assertEquals("my-divert", divert.getName());
+      assertEquals("my-divert-routing", divert.getRoutingName());
+      assertEquals("orders", divert.getAddress());
+      assertEquals("orders.archive", divert.getForwardingAddress());
+      assertFalse(divert.isExclusive());
+      assertNotNull(divert.getTransformerConfiguration());
+      assertEquals("org.apache.activemq.artemis.core.server.transformer.AddHeadersTransformer",
+         divert.getTransformerConfiguration().getClassName());
+      assertEquals("divert", divert.getTransformerConfiguration().getProperties().get("archivedBy"));
+   }
+
+   @Test
+   public void testAddressSettings() {
+      Map<String, AddressSettings> settings = configuration.getAddressSettings();
+      assertTrue(settings.size() >= 2);
+
+      AddressSettings global = settings.get("#");
+      assertNotNull(global);
+      assertEquals(SimpleString.of("globalExpiry"), global.getExpiryAddress());
+      assertEquals(SimpleString.of("globalDLQ"), global.getDeadLetterAddress());
+      assertEquals(5, global.getMaxDeliveryAttempts());
+
+      AddressSettings orders = settings.get("orders");
+      assertNotNull(orders);
+      assertEquals(SimpleString.of("orders.expiry"), orders.getExpiryAddress());
+      assertEquals(SimpleString.of("orders.dlq"), orders.getDeadLetterAddress());
+      assertEquals(10, orders.getMaxDeliveryAttempts());
+      assertEquals(2000, orders.getRedeliveryDelay());
+      assertEquals(2.5, orders.getRedeliveryMultiplier(), 0.01);
+      assertEquals(0.25, orders.getRedeliveryCollisionAvoidanceFactor(), 0.01);
+      assertEquals(30000, orders.getMaxRedeliveryDelay());
+      assertEquals(10485760, orders.getMaxSizeBytes());
+      assertEquals(50000, orders.getMaxSizeMessages());
+      assertEquals(20971520, orders.getMaxSizeBytesRejectThreshold());
+      assertEquals(65536, orders.getPageSizeBytes());
+      assertEquals(10, orders.getPageCacheMaxSize());
+      assertEquals(1048576, orders.getMaxReadPageBytes());
+      assertEquals(500, orders.getMaxReadPageMessages());
+      assertEquals(524288, orders.getPrefetchPageBytes());
+      assertEquals(250, orders.getPrefetchPageMessages());
+      assertEquals(Long.valueOf(104857600), orders.getPageLimitBytes());
+      assertEquals(Long.valueOf(100000), orders.getPageLimitMessages());
+      assertEquals(AddressFullMessagePolicy.PAGE, orders.getAddressFullMessagePolicy());
+      assertEquals(DiskFullMessagePolicy.BLOCK, orders.getDiskFullMessagePolicy());
+      assertEquals(50, orders.getSlowConsumerThreshold());
+      assertEquals(SlowConsumerThresholdMeasurementUnit.MESSAGES_PER_HOUR, orders.getSlowConsumerThresholdMeasurementUnit());
+      assertEquals(30, orders.getSlowConsumerCheckPeriod());
+      assertEquals(SlowConsumerPolicy.NOTIFY, orders.getSlowConsumerPolicy());
+      assertEquals(10, orders.getMessageCounterHistoryDayLimit());
+      assertEquals(5000, orders.getRedistributionDelay());
+      assertTrue(orders.isSendToDLAOnNoRoute());
+      assertTrue(orders.isAutoCreateExpiryResources());
+      assertEquals(SimpleString.of("EXP."), orders.getExpiryQueuePrefix());
+      assertEquals(SimpleString.of(".EXPIRED"), orders.getExpiryQueueSuffix());
+      assertEquals(Long.valueOf(60000), orders.getExpiryDelay());
+      assertEquals(Long.valueOf(10000), orders.getMinExpiryDelay());
+      assertEquals(Long.valueOf(120000), orders.getMaxExpiryDelay());
+      assertFalse(orders.isNoExpiry());
+      assertTrue(orders.isAutoCreateDeadLetterResources());
+      assertEquals(SimpleString.of("DLQ."), orders.getDeadLetterQueuePrefix());
+      assertEquals(SimpleString.of(".DLQ"), orders.getDeadLetterQueueSuffix());
+      assertEquals(200, orders.getManagementBrowsePageSize());
+      assertEquals(1024, orders.getManagementMessageAttributeSizeLimit());
+      assertEquals(1000, orders.getQueuePrefetch());
+      assertEquals(2048, orders.getDefaultConsumerWindowSize());
+      assertEquals(Integer.valueOf(25), orders.getDefaultMaxConsumers());
+      assertEquals(Integer.valueOf(1), orders.getDefaultConsumersBeforeDispatch());
+      assertEquals(Long.valueOf(100), orders.getDefaultDelayBeforeDispatch());
+      assertFalse(orders.isDefaultPurgeOnNoConsumers());
+      assertEquals(RoutingType.ANYCAST, orders.getDefaultQueueRoutingType());
+      assertEquals(RoutingType.ANYCAST, orders.getDefaultAddressRoutingType());
+      assertFalse(orders.isDefaultLastValueQueue());
+      assertEquals(SimpleString.of("myLastValueKey"), orders.getDefaultLastValueKey());
+      assertFalse(orders.isDefaultNonDestructive());
+      assertFalse(orders.isDefaultExclusiveQueue());
+      assertTrue(orders.isDefaultGroupRebalance());
+      assertFalse(orders.isDefaultGroupRebalancePauseDispatch());
+      assertEquals(64, orders.getDefaultGroupBuckets());
+      assertEquals(SimpleString.of("myGroupFirstKey"), orders.getDefaultGroupFirstKey());
+      assertEquals(1000, orders.getDefaultRingSize());
+      assertEquals(100, orders.getRetroactiveMessageCount());
+      assertTrue(orders.isAutoCreateQueues());
+      assertTrue(orders.isAutoDeleteQueues());
+      assertFalse(orders.isAutoDeleteCreatedQueues());
+      assertEquals(30000, orders.getAutoDeleteQueuesDelay());
+      assertEquals(0, orders.getAutoDeleteQueuesMessageCount());
+      assertFalse(orders.getAutoDeleteQueuesSkipUsageCheck());
+      assertTrue(orders.isAutoCreateAddresses());
+      assertTrue(orders.isAutoDeleteAddresses());
+      assertEquals(30000, orders.getAutoDeleteAddressesDelay());
+      assertFalse(orders.isAutoDeleteAddressesSkipUsageCheck());
+      assertEquals(DeletionPolicy.OFF, orders.getConfigDeleteQueues());
+      assertEquals(DeletionPolicy.OFF, orders.getConfigDeleteAddresses());
+      assertEquals(DeletionPolicy.OFF, orders.getConfigDeleteDiverts());
+      assertTrue(orders.isEnableMetrics());
+      assertTrue(orders.isEnableIngressTimestamp());
+      assertEquals(Integer.valueOf(100), orders.getIDCacheSize());
+   }
+
+   @Test
+   public void testAMQPConnections() {
+      assertEquals(1, configuration.getAMQPConnections().size());
+      AMQPBrokerConnectConfiguration amqp = configuration.getAMQPConnections().get(0);
+      assertEquals("mirror-target", amqp.getName());
+      assertEquals("tcp://mirror-host:5672", amqp.getUri());
+      assertEquals(5000, amqp.getRetryInterval());
+      assertEquals(-1, amqp.getReconnectAttempts());
+      assertEquals("mirror-user", amqp.getUser());
+      assertEquals("mirror-password", amqp.getPassword());
+      assertFalse(amqp.isAutostart());
+
+      assertEquals(1, amqp.getConnectionElements().size());
+      assertTrue(amqp.getConnectionElements().get(0) instanceof AMQPMirrorBrokerConnectionElement);
+      AMQPMirrorBrokerConnectionElement mirror = (AMQPMirrorBrokerConnectionElement) amqp.getConnectionElements().get(0);
+      assertEquals("mirror1", mirror.getName());
+      assertTrue(mirror.isMessageAcknowledgements());
+      assertTrue(mirror.isQueueCreation());
+      assertFalse(mirror.isQueueRemoval());
+      assertEquals("orders", mirror.getAddressFilter());
+      assertTrue(mirror.isSync());
+      assertEquals("mirrorVal1", mirror.getProperties().get("mirrorProp1"));
+   }
+
+   @Test
+   public void testHAPolicyConfiguration() {
+      HAPolicyConfiguration haPolicy = configuration.getHAPolicyConfiguration();
+      assertNotNull(haPolicy);
+      assertTrue(haPolicy instanceof LiveOnlyPolicyConfiguration);
+   }
+
+   @Test
+   public void testResourceLimitSettings() {
+      Map<String, ResourceLimitSettings> limits = configuration.getResourceLimitSettings();
+      assertEquals(1, limits.size());
+      ResourceLimitSettings user1 = limits.get("user1");
+      assertNotNull(user1);
+      assertEquals(100, user1.getMaxConnections());
+      assertEquals(50, user1.getMaxQueues());
+   }
+
+   @Test
+   public void testWildcardConfiguration() {
+      WildcardConfiguration wc = configuration.getWildcardConfiguration();
+      assertNotNull(wc);
+      assertTrue(wc.isRoutingEnabled());
+      assertEquals('#', wc.getAnyWords());
+      assertEquals('*', wc.getSingleWord());
+      assertEquals('.', wc.getDelimiter());
+   }
+
+   @Test
+   public void testMetricsConfiguration() {
+      MetricsConfiguration mc = configuration.getMetricsConfiguration();
+      assertNotNull(mc);
+      assertTrue(mc.isJvmMemory());
+      assertTrue(mc.isJvmGc());
+      assertTrue(mc.isJvmThread());
+      assertTrue(mc.isNettyPool());
+   }
+
+   @Test
+   public void testFederationDownstreamAuthorization() {
+      List<String> auth = configuration.getFederationDownstreamAuthorization();
+      assertNotNull(auth);
+      assertEquals(3, auth.size());
+      assertTrue(auth.contains("admin"));
+      assertTrue(auth.contains("operator"));
+      assertTrue(auth.contains("monitor"));
+   }
+
+   @Test
+   public void testJaasConfigs() {
+      Map<String, JaasAppConfiguration> jaas = configuration.getJaasConfigs();
+      assertEquals(1, jaas.size());
+      JaasAppConfiguration artemisRealm = jaas.get("artemis");
+      assertNotNull(artemisRealm);
+      assertEquals(2, artemisRealm.getModules().size());
+
+      JaasAppConfigurationEntry propsModule = artemisRealm.getModules().stream()
+         .filter(m -> "properties-module".equals(m.getName())).findFirst().orElse(null);
+      assertNotNull(propsModule);
+      assertEquals("org.apache.activemq.artemis.spi.core.security.jaas.PropertiesLoginModule", propsModule.getLoginModuleClass());
+      assertEquals("required", propsModule.getControlFlag());
+      assertEquals("artemis-users.properties", propsModule.getParams().get("user"));
+      assertEquals("artemis-roles.properties", propsModule.getParams().get("role"));
+
+      JaasAppConfigurationEntry guestModule = artemisRealm.getModules().stream()
+         .filter(m -> "guest-module".equals(m.getName())).findFirst().orElse(null);
+      assertNotNull(guestModule);
+      assertEquals("org.apache.activemq.artemis.spi.core.security.jaas.GuestLoginModule", guestModule.getLoginModuleClass());
+      assertEquals("optional", guestModule.getControlFlag());
+      assertEquals("guest", guestModule.getParams().get("org.apache.activemq.jaas.guest.user"));
+      assertEquals("guest", guestModule.getParams().get("org.apache.activemq.jaas.guest.role"));
+   }
+
+   @Test
+   public void testConnectionRouters() {
+      assertEquals(1, configuration.getConnectionRouters().size());
+      ConnectionRouterConfiguration router = configuration.getConnectionRouters().get(0);
+      assertEquals("my-router", router.getName());
+      assertEquals(KeyType.SOURCE_IP, router.getKeyType());
+      assertEquals("netty-acceptor|invm-acceptor", router.getLocalTargetFilter());
+      assertEquals("STARTS_WITH", router.getKeyFilter());
+   }
+
+   @Test
+   @SuppressWarnings("deprecation")
+   public void testBrokerPlugins() {
+      assertFalse(configuration.getBrokerPlugins().isEmpty());
+      assertTrue(configuration.getBrokerPlugins().get(0) instanceof LoggingActiveMQServerPlugin);
+      LoggingActiveMQServerPlugin plugin = (LoggingActiveMQServerPlugin) configuration.getBrokerPlugins().get(0);
+      assertTrue(plugin.isLogAll());
+      assertFalse(plugin.isLogSessionEvents());
+   }
+
+   @Test
+   public void testSecuritySettingPlugins() {
+      assertEquals(1, configuration.getSecuritySettingPlugins().size());
+      assertTrue(configuration.getSecuritySettingPlugins().get(0) instanceof LegacyLDAPSecuritySettingPlugin);
+      LegacyLDAPSecuritySettingPlugin ldapPlugin =
+         (LegacyLDAPSecuritySettingPlugin) configuration.getSecuritySettingPlugins().get(0);
+      assertEquals("com.sun.jndi.ldap.LdapCtxFactory", ldapPlugin.getInitialContextFactory());
+      assertEquals("ldap://localhost:1024", ldapPlugin.getConnectionURL());
+   }
+
+   @Test
+   public void testFederationConfigurations() {
+      assertEquals(1, configuration.getFederationConfigurations().size());
+      FederationConfiguration fed = configuration.getFederationConfigurations().get(0);
+      assertEquals("f1", fed.getName());
+      assertEquals("federation-user", fed.getCredentials().getUser());
+
+      assertEquals(1, fed.getUpstreamConfigurations().size());
+      assertEquals("upstream1", fed.getUpstreamConfigurations().get(0).getName());
+      assertEquals(5, fed.getUpstreamConfigurations().get(0).getConnectionConfiguration().getReconnectAttempts());
+      assertEquals(1, fed.getUpstreamConfigurations().get(0).getPolicyRefs().size());
+      assertTrue(fed.getUpstreamConfigurations().get(0).getPolicyRefs().contains("qp1"));
+
+      assertNotNull(fed.getFederationPolicyMap().get("qp1"));
+      assertTrue(fed.getFederationPolicyMap().get("qp1") instanceof FederationQueuePolicyConfiguration);
+      FederationQueuePolicyConfiguration qp1 = (FederationQueuePolicyConfiguration) fed.getFederationPolicyMap().get("qp1");
+      assertEquals("myTransform", qp1.getTransformerRef());
+      assertEquals(1, qp1.getIncludes().size());
+
+      assertNotNull(fed.getFederationPolicyMap().get("ap1"));
+      assertTrue(fed.getFederationPolicyMap().get("ap1") instanceof FederationAddressPolicyConfiguration);
+      FederationAddressPolicyConfiguration ap1 = (FederationAddressPolicyConfiguration) fed.getFederationPolicyMap().get("ap1");
+      assertEquals("myTransform", ap1.getTransformerRef());
+      assertEquals(1, ap1.getExcludes().size());
+
+      assertNotNull(fed.getTransformerConfigurations().get("myTransform"));
+      assertEquals("com.example.MyTransformer",
+         fed.getTransformerConfigurations().get("myTransform").getTransformerConfiguration().getClassName());
+      assertEquals("value1",
+         fed.getTransformerConfigurations().get("myTransform").getTransformerConfiguration().getProperties().get("key1"));
+   }
+
+   @Test
+   public void testLockCoordinatorConfigurations() {
+      assertEquals(1, configuration.getLockCoordinatorConfigurations().size());
+      LockCoordinatorConfiguration lock = configuration.getLockCoordinatorConfigurations().iterator().next();
+      assertEquals("myZK", lock.getName());
+      assertEquals("org.apache.activemq.artemis.lockmanager.zookeeper.CuratorDistributedLockManager", lock.getClassName());
+      assertEquals("broker-01", lock.getLockId());
+      assertEquals(5000, lock.getCheckPeriod());
+      assertEquals("zk1:2181,zk2:2181,zk3:2181", lock.getProperties().get("connect-string"));
+      assertEquals("18000", lock.getProperties().get("session-ms"));
+      assertEquals("/artemis/ha", lock.getProperties().get("namespace"));
+   }
+
+   @Test
+   public void testGroupingHandlerConfiguration() {
+      GroupingHandlerConfiguration ghc = configuration.getGroupingHandlerConfiguration();
+      assertNotNull(ghc);
+      assertEquals(SimpleString.of("my-grouping-handler"), ghc.getName());
+      assertEquals(GroupingHandlerConfiguration.TYPE.LOCAL, ghc.getType());
+      assertEquals(SimpleString.of("jms.queue.grouping"), ghc.getAddress());
+      assertEquals(5000, ghc.getTimeout());
+      assertEquals(10000, ghc.getGroupTimeout());
+      assertEquals(30000, ghc.getReaperPeriod());
+   }
+
+   @Test
+   public void testInterceptorClassNames() {
+      List<String> incoming = configuration.getIncomingInterceptorClassNames();
+      assertEquals(2, incoming.size());
+      assertEquals("com.example.IncomingInterceptor1", incoming.get(0));
+      assertEquals("com.example.IncomingInterceptor2", incoming.get(1));
+
+      List<String> outgoing = configuration.getOutgoingInterceptorClassNames();
+      assertEquals(1, outgoing.size());
+      assertEquals("com.example.OutgoingInterceptor1", outgoing.get(0));
+   }
+
+   @Test
+   public void testRoundTripExport() throws Exception {
+      File exportFile = new File(tempDir, "broker-export.properties");
+      configuration.exportAsProperties(exportFile);
+      assertTrue(exportFile.exists());
+      assertTrue(exportFile.length() > 0);
+
+      ConfigurationImpl reloaded = new ConfigurationImpl();
+      reloaded.parseFileProperties(exportFile);
+      String status = reloaded.getStatus();
+      if (!status.contains("\"errors\":[]")) {
+         assertTrue(status.contains("securitySettingPlugins") || status.contains("SecuritySettingPlugin"),
+            "Re-import had unexpected errors (not just securitySettingPlugins): " + status);
+      }
+
+      assertEquals(configuration.getName(), reloaded.getName());
+      assertEquals(configuration.isPersistenceEnabled(), reloaded.isPersistenceEnabled());
+      assertEquals(configuration.getScheduledThreadPoolMaxSize(), reloaded.getScheduledThreadPoolMaxSize());
+      assertEquals(configuration.getThreadPoolMaxSize(), reloaded.getThreadPoolMaxSize());
+      assertEquals(configuration.isSecurityEnabled(), reloaded.isSecurityEnabled());
+      assertEquals(configuration.getJournalType(), reloaded.getJournalType());
+      assertEquals(configuration.getJournalFileSize(), reloaded.getJournalFileSize());
+      assertEquals(configuration.getJournalMinFiles(), reloaded.getJournalMinFiles());
+      assertEquals(configuration.getGlobalMaxSize(), reloaded.getGlobalMaxSize());
+      assertEquals(configuration.getCriticalAnalyzerPolicy(), reloaded.getCriticalAnalyzerPolicy());
+      assertEquals(configuration.getCriticalAnalyzerTimeout(), reloaded.getCriticalAnalyzerTimeout());
+      assertEquals(configuration.getIDCacheSize(), reloaded.getIDCacheSize());
+      assertEquals(configuration.getMaxRedeliveryRecords(), reloaded.getMaxRedeliveryRecords());
+
+      assertEquals(configuration.getConnectorConfigurations().size(), reloaded.getConnectorConfigurations().size());
+      assertEquals(configuration.getAcceptorConfigurations().size(), reloaded.getAcceptorConfigurations().size());
+      assertEquals(configuration.getAddressConfigurations().size(), reloaded.getAddressConfigurations().size());
+      assertEquals(configuration.getSecurityRoles().size(), reloaded.getSecurityRoles().size());
+      assertEquals(configuration.getBridgeConfigurations().size(), reloaded.getBridgeConfigurations().size());
+      assertEquals(configuration.getBridgeConfigurations().get(0).getName(),
+         reloaded.getBridgeConfigurations().get(0).getName());
+      assertEquals(configuration.getClusterConfigurations().size(), reloaded.getClusterConfigurations().size());
+      assertEquals(configuration.getDivertConfigurations().size(), reloaded.getDivertConfigurations().size());
+      assertEquals(configuration.getAddressSettings().size(), reloaded.getAddressSettings().size());
+      assertEquals(configuration.getAddressSettings().get("orders").getMaxDeliveryAttempts(),
+         reloaded.getAddressSettings().get("orders").getMaxDeliveryAttempts());
+      assertEquals(configuration.getAMQPConnections().size(), reloaded.getAMQPConnections().size());
+      assertNotNull(reloaded.getHAPolicyConfiguration());
+      assertEquals(configuration.getHAPolicyConfiguration().getType(), reloaded.getHAPolicyConfiguration().getType());
+      assertEquals(configuration.getResourceLimitSettings().size(), reloaded.getResourceLimitSettings().size());
+      assertEquals(configuration.getJaasConfigs().size(), reloaded.getJaasConfigs().size());
+      assertEquals(configuration.getFederationDownstreamAuthorization(), reloaded.getFederationDownstreamAuthorization());
+   }
+}
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/JsonConfigurationFullTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/JsonConfigurationFullTest.java
new file mode 100644
index 0000000000..4415300700
--- /dev/null
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/JsonConfigurationFullTest.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq.artemis.core.config.impl;
+
+import org.junit.jupiter.api.TestInstance;
+
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+public class JsonConfigurationFullTest extends AbstractConfigurationFullTest {
+
+   @Override
+   protected String getConfigResource() {
+      return "/broker-full-config.json";
+   }
+
+   @Override
+   protected String getConfigFileName() {
+      return "broker-full-config.json";
+   }
+}
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/YamlConfigurationFullTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/YamlConfigurationFullTest.java
new file mode 100644
index 0000000000..19fa3eff4d
--- /dev/null
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/YamlConfigurationFullTest.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq.artemis.core.config.impl;
+
+import org.junit.jupiter.api.TestInstance;
+
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+public class YamlConfigurationFullTest extends AbstractConfigurationFullTest {
+
+   @Override
+   protected String getConfigResource() {
+      return "/broker-full-config.yaml";
+   }
+
+   @Override
+   protected String getConfigFileName() {
+      return "broker-full-config.yaml";
+   }
+}
diff --git a/artemis-server/src/test/resources/broker-full-config.json b/artemis-server/src/test/resources/broker-full-config.json
new file mode 100644
index 0000000000..d61138a578
--- /dev/null
+++ b/artemis-server/src/test/resources/broker-full-config.json
@@ -0,0 +1,490 @@
+{
+  "name": "full-test-broker",
+  "persistenceEnabled": true,
+  "persistDeliveryCountBeforeDelivery": true,
+  "scheduledThreadPoolMaxSize": 10,
+  "threadPoolMaxSize": 50,
+  "securityEnabled": false,
+  "gracefulShutdownEnabled": true,
+  "gracefulShutdownTimeout": 30000,
+  "journalType": "NIO",
+  "journalSyncTransactional": true,
+  "journalSyncNonTransactional": false,
+  "journalFileSize": 10485760,
+  "journalMinFiles": 5,
+  "journalPoolFiles": 10,
+  "journalCompactMinFiles": 15,
+  "journalCompactPercentage": 50,
+  "journalMaxIO_NIO": 4,
+  "journalBufferTimeout_NIO": 3334,
+  "journalBufferSize_NIO": 307200,
+  "journalMaxAtticFiles": 5,
+  "journalFileOpenTimeout": 10,
+  "journalLockAcquisitionTimeout": 20,
+  "readWholePage": true,
+  "logJournalWriteRate": false,
+  "createBindingsDir": true,
+  "createJournalDir": true,
+  "largeMessageSync": false,
+  "journalDatasync": true,
+  "bindingsDirectory": "test-data/bindings",
+  "journalDirectory": "test-data/journal",
+  "pagingDirectory": "test-data/paging",
+  "largeMessagesDirectory": "test-data/large-messages",
+  "nodeManagerLockDirectory": "test-data/lock",
+  "securityInvalidationInterval": 5000,
+  "authenticationCacheSize": 500,
+  "authorizationCacheSize": 500,
+  "connectionTTLOverride": 60000,
+  "connectionTtlCheckInterval": 1000,
+  "globalMaxSize": "100M",
+  "globalMaxMessages": 5000,
+  "maxDiskUsage": 95,
+  "minDiskFree": 1048576,
+  "diskScanPeriod": 10000,
+  "jMXManagementEnabled": true,
+  "jMXDomain": "org.apache.activemq.test",
+  "jMXUseBrokerName": true,
+  "managementAddress": "activemq.management.test",
+  "managementNotificationAddress": "activemq.notifications.test",
+  "managementMessageRbac": false,
+  "managementRbacPrefix": "mops.rbac",
+  "viewPermissionMethodMatchPattern": "^(get|is|count|list|browse|query).*$",
+  "clusterUser": "test-cluster-user",
+  "clusterPassword": "test-cluster-password",
+  "messageCounterEnabled": true,
+  "messageCounterSamplePeriod": 5000,
+  "messageCounterMaxDayHistory": 5,
+  "messageExpiryScanPeriod": 15000,
+  "messageExpiryThreadPriority": 5,
+  "addressQueueScanPeriod": 25000,
+  "transactionTimeout": 120000,
+  "transactionTimeoutScanPeriod": 5000,
+  "criticalAnalyzer": true,
+  "criticalAnalyzerPolicy": "SHUTDOWN",
+  "criticalAnalyzerTimeout": 120000,
+  "criticalAnalyzerCheckPeriod": 30000,
+  "mirrorAckManagerQueueAttempts": 7,
+  "mirrorAckManagerPageAttempts": 3,
+  "mirrorAckManagerRetryDelay": 200,
+  "mirrorPageTransaction": true,
+  "mirrorAckManagerWarnUnacked": true,
+  "mqttSessionScanInterval": 2000,
+  "mqttSubscriptionPersistenceEnabled": true,
+  "maxRedeliveryRecords": 20,
+  "iDCacheSize": 500,
+  "persistIDCache": true,
+  "serverDumpInterval": 30000,
+  "memoryWarningThreshold": 70,
+  "memoryMeasureInterval": 5000,
+  "amqpUseCoreSubscriptionNaming": true,
+  "suppressSessionNotifications": true,
+  "pageSyncTimeout": 3334,
+  "pageMaxConcurrentIO": 10,
+  "literalMatchMarkers": "`",
+  "configurationFileRefreshPeriod": 3000,
+  "purgePageFolders": true,
+  "fileDeployerScanPeriod": 1000,
+  "populateValidatedUser": true,
+  "rejectEmptyValidatedUser": true,
+
+  "connectorConfigurations": {
+    "netty-connector": {
+      "factoryClassName": "org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnectorFactory",
+      "params": {
+        "HOST": "localhost",
+        "PORT": "61617"
+      }
+    },
+    "invm-connector": {
+      "factoryClassName": "org.apache.activemq.artemis.core.remoting.impl.invm.InVMConnectorFactory",
+      "params": {
+        "ID": "0"
+      }
+    }
+  },
+
+  "acceptorConfigurations": {
+    "netty-acceptor": {
+      "factoryClassName": "org.apache.activemq.artemis.core.remoting.impl.netty.NettyAcceptorFactory",
+      "params": {
+        "HOST": "0.0.0.0",
+        "PORT": "61616"
+      },
+      "extraParams": {
+        "supportAdvisory": "false"
+      }
+    },
+    "invm-acceptor": {
+      "factoryClassName": "org.apache.activemq.artemis.core.remoting.impl.invm.InVMAcceptorFactory",
+      "params": {
+        "ID": "0"
+      }
+    }
+  },
+
+  "addressConfigurations": {
+    "orders": {
+      "routingTypes": ["ANYCAST"],
+      "queueConfigs": {
+        "orders": {
+          "routingType": "ANYCAST",
+          "durable": true
+        }
+      }
+    },
+    "notifications": {
+      "routingTypes": ["MULTICAST"],
+      "queueConfigs": {
+        "notifications": {
+          "routingType": "MULTICAST",
+          "durable": false
+        }
+      }
+    }
+  },
+
+  "securityRoles": {
+    "orders.#": {
+      "producers": {
+        "send": true,
+        "consume": false,
+        "createDurableQueue": false,
+        "deleteDurableQueue": false,
+        "createNonDurableQueue": false,
+        "deleteNonDurableQueue": false,
+        "manage": false,
+        "browse": false,
+        "createAddress": false,
+        "deleteAddress": false
+      },
+      "consumers": {
+        "send": false,
+        "consume": true,
+        "createDurableQueue": false,
+        "deleteDurableQueue": false,
+        "createNonDurableQueue": true,
+        "deleteNonDurableQueue": true,
+        "manage": false,
+        "browse": true,
+        "createAddress": false,
+        "deleteAddress": false
+      }
+    },
+    "notifications.*": {
+      "monitors": {
+        "send": false,
+        "consume": true,
+        "createDurableQueue": false,
+        "deleteDurableQueue": false,
+        "createNonDurableQueue": true,
+        "deleteNonDurableQueue": true,
+        "manage": false,
+        "browse": true,
+        "createAddress": false,
+        "deleteAddress": false
+      }
+    }
+  },
+
+  "bridgeConfigurations": {
+    "orders-bridge": {
+      "queueName": "orders",
+      "forwardingAddress": "orders.remote",
+      "staticConnectors": ["netty-connector"],
+      "confirmationWindowSize": 10,
+      "routingType": "STRIP",
+      "retryInterval": 500,
+      "retryIntervalMultiplier": 2.0,
+      "reconnectAttempts": 3,
+      "useDuplicateDetection": true,
+      "transformerConfiguration": {
+        "className": "org.apache.activemq.artemis.core.server.transformer.AddHeadersTransformer",
+        "properties": {
+          "header1": "value1",
+          "header2": "value2"
+        }
+      }
+    }
+  },
+
+  "clusterConfigurations": {
+    "my-cluster": {
+      "name": "my-cluster",
+      "connectorName": "netty-connector",
+      "staticConnectors": ["netty-connector"],
+      "messageLoadBalancingType": "ON_DEMAND",
+      "maxHops": 2,
+      "retryInterval": 1000,
+      "callTimeout": 30000,
+      "callFailoverTimeout": 5000,
+      "duplicateDetection": true,
+      "confirmationWindowSize": 1048576
+    }
+  },
+
+  "divertConfigurations": {
+    "my-divert": {
+      "routingName": "my-divert-routing",
+      "address": "orders",
+      "forwardingAddress": "orders.archive",
+      "exclusive": false,
+      "transformerConfiguration": {
+        "className": "org.apache.activemq.artemis.core.server.transformer.AddHeadersTransformer",
+        "properties": {
+          "archivedBy": "divert"
+        }
+      }
+    }
+  },
+
+  "addressSettings": {
+    "#": {
+      "expiryAddress": "globalExpiry",
+      "deadLetterAddress": "globalDLQ",
+      "maxDeliveryAttempts": 5
+    },
+    "orders": {
+      "expiryAddress": "orders.expiry",
+      "deadLetterAddress": "orders.dlq",
+      "maxDeliveryAttempts": 10,
+      "redeliveryDelay": 2000,
+      "redeliveryMultiplier": 2.5,
+      "redeliveryCollisionAvoidanceFactor": 0.25,
+      "maxRedeliveryDelay": 30000,
+      "maxSizeBytes": 10485760,
+      "maxSizeMessages": 50000,
+      "maxSizeBytesRejectThreshold": 20971520,
+      "pageSizeBytes": 65536,
+      "pageCacheMaxSize": 10,
+      "maxReadPageBytes": 1048576,
+      "maxReadPageMessages": 500,
+      "prefetchPageBytes": 524288,
+      "prefetchPageMessages": 250,
+      "pageLimitBytes": 104857600,
+      "pageLimitMessages": 100000,
+      "pageFullMessagePolicy": "DROP",
+      "addressFullMessagePolicy": "PAGE",
+      "diskFullMessagePolicy": "BLOCK",
+      "slowConsumerThreshold": 50,
+      "slowConsumerThresholdMeasurementUnit": "MESSAGES_PER_HOUR",
+      "slowConsumerCheckPeriod": 30,
+      "slowConsumerPolicy": "NOTIFY",
+      "messageCounterHistoryDayLimit": 10,
+      "redistributionDelay": 5000,
+      "sendToDLAOnNoRoute": true,
+      "autoCreateExpiryResources": true,
+      "expiryQueuePrefix": "EXP.",
+      "expiryQueueSuffix": ".EXPIRED",
+      "expiryDelay": 60000,
+      "minExpiryDelay": 10000,
+      "maxExpiryDelay": 120000,
+      "noExpiry": false,
+      "autoCreateDeadLetterResources": true,
+      "deadLetterQueuePrefix": "DLQ.",
+      "deadLetterQueueSuffix": ".DLQ",
+      "managementBrowsePageSize": 200,
+      "managementMessageAttributeSizeLimit": 1024,
+      "queuePrefetch": 1000,
+      "defaultConsumerWindowSize": 2048,
+      "defaultMaxConsumers": 25,
+      "defaultConsumersBeforeDispatch": 1,
+      "defaultDelayBeforeDispatch": 100,
+      "defaultPurgeOnNoConsumers": false,
+      "defaultQueueRoutingType": "ANYCAST",
+      "defaultAddressRoutingType": "ANYCAST",
+      "defaultLastValueQueue": false,
+      "defaultLastValueKey": "myLastValueKey",
+      "defaultNonDestructive": false,
+      "defaultExclusiveQueue": false,
+      "defaultGroupRebalance": true,
+      "defaultGroupRebalancePauseDispatch": false,
+      "defaultGroupBuckets": 64,
+      "defaultGroupFirstKey": "myGroupFirstKey",
+      "defaultRingSize": 1000,
+      "retroactiveMessageCount": 100,
+      "autoCreateQueues": true,
+      "autoDeleteQueues": true,
+      "autoDeleteCreatedQueues": false,
+      "autoDeleteQueuesDelay": 30000,
+      "autoDeleteQueuesMessageCount": 0,
+      "autoDeleteQueuesSkipUsageCheck": false,
+      "autoCreateAddresses": true,
+      "autoDeleteAddresses": true,
+      "autoDeleteAddressesDelay": 30000,
+      "autoDeleteAddressesSkipUsageCheck": false,
+      "configDeleteQueues": "OFF",
+      "configDeleteAddresses": "OFF",
+      "configDeleteDiverts": "OFF",
+      "enableMetrics": true,
+      "enableIngressTimestamp": true,
+      "iDCacheSize": 100
+    }
+  },
+
+  "AMQPConnections": {
+    "mirror-target": {
+      "uri": "tcp://mirror-host:5672",
+      "retryInterval": 5000,
+      "reconnectAttempts": -1,
+      "user": "mirror-user",
+      "password": "mirror-password",
+      "autostart": false,
+      "mirrors": {
+        "mirror1": {
+          "type": "MIRROR",
+          "messageAcknowledgements": true,
+          "queueCreation": true,
+          "queueRemoval": false,
+          "addressFilter": "orders",
+          "sync": true,
+          "properties": {
+            "mirrorProp1": "mirrorVal1"
+          }
+        }
+      }
+    }
+  },
+
+  "HAPolicyConfiguration": "PRIMARY_ONLY",
+
+  "resourceLimitSettings": {
+    "user1": {
+      "maxConnections": 100,
+      "maxQueues": 50
+    }
+  },
+
+  "wildcardConfiguration": {
+    "routingEnabled": true,
+    "anyWords": "#",
+    "singleWord": "*",
+    "delimiter": "."
+  },
+
+  "metricsConfiguration": {
+    "jvmMemory": true,
+    "jvmGc": true,
+    "jvmThread": true,
+    "nettyPool": true
+  },
+
+  "federationDownstreamAuthorization": ["admin", "operator", "monitor"],
+
+  "jaasConfigs": {
+    "artemis": {
+      "modules": {
+        "properties-module": {
+          "loginModuleClass": "org.apache.activemq.artemis.spi.core.security.jaas.PropertiesLoginModule",
+          "controlFlag": "required",
+          "params": {
+            "user": "artemis-users.properties",
+            "role": "artemis-roles.properties"
+          }
+        },
+        "guest-module": {
+          "loginModuleClass": "org.apache.activemq.artemis.spi.core.security.jaas.GuestLoginModule",
+          "controlFlag": "optional",
+          "params": {
+            "org.apache.activemq.jaas.guest.user": "guest",
+            "org.apache.activemq.jaas.guest.role": "guest"
+          }
+        }
+      }
+    }
+  },
+
+  "connectionRouters": {
+    "my-router": {
+      "keyType": "SOURCE_IP",
+      "localTargetFilter": "netty-acceptor|invm-acceptor",
+      "keyFilter": "STARTS_WITH"
+    }
+  },
+
+  "brokerPlugins": {
+    "org.apache.activemq.artemis.core.server.plugin.impl.LoggingActiveMQServerPlugin.class": {
+      "init": "LOG_ALL_EVENTS=true,LOG_SESSION_EVENTS=false"
+    }
+  },
+
+  "securitySettingPlugins": {
+    "org.apache.activemq.artemis.core.server.impl.LegacyLDAPSecuritySettingPlugin.class": {
+      "init": "initialContextFactory=com.sun.jndi.ldap.LdapCtxFactory,connectionURL=ldap://localhost:1024"
+    }
+  },
+
+  "federationConfigurations": {
+    "f1": {
+      "credentials": {
+        "user": "federation-user",
+        "password": "federation-pass"
+      },
+      "upstreamConfigurations": {
+        "upstream1": {
+          "connectionConfiguration": {
+            "reconnectAttempts": 5,
+            "staticConnectors": ["netty-connector"]
+          },
+          "policyRefs": ["qp1"]
+        }
+      },
+      "queuePolicies": {
+        "qp1": {
+          "transformerRef": "myTransform",
+          "includes": {
+            "all-queues": {
+              "queueMatch": "#"
+            }
+          }
+        }
+      },
+      "addressPolicies": {
+        "ap1": {
+          "transformerRef": "myTransform",
+          "excludes": {
+            "internal": {
+              "addressMatch": "activemq.#"
+            }
+          }
+        }
+      },
+      "transformerConfigurations": {
+        "myTransform": {
+          "transformerConfiguration": {
+            "className": "com.example.MyTransformer",
+            "properties": {
+              "key1": "value1"
+            }
+          }
+        }
+      }
+    }
+  },
+
+  "lockCoordinatorConfigurations": {
+    "myZK": {
+      "name": "myZK",
+      "className": "org.apache.activemq.artemis.lockmanager.zookeeper.CuratorDistributedLockManager",
+      "lockId": "broker-01",
+      "checkPeriod": 5000,
+      "properties": {
+        "connect-string": "zk1:2181,zk2:2181,zk3:2181",
+        "session-ms": "18000",
+        "namespace": "/artemis/ha"
+      }
+    }
+  },
+
+  "groupingHandlerConfiguration": {
+    "name": "my-grouping-handler",
+    "type": "LOCAL",
+    "address": "jms.queue.grouping",
+    "timeout": 5000,
+    "groupTimeout": 10000,
+    "reaperPeriod": 30000
+  },
+
+  "incomingInterceptorClassNames": ["com.example.IncomingInterceptor1", "com.example.IncomingInterceptor2"],
+  "outgoingInterceptorClassNames": ["com.example.OutgoingInterceptor1"]
+}
diff --git a/artemis-server/src/test/resources/broker-full-config.yaml b/artemis-server/src/test/resources/broker-full-config.yaml
new file mode 100644
index 0000000000..7233d9dde4
--- /dev/null
+++ b/artemis-server/src/test/resources/broker-full-config.yaml
@@ -0,0 +1,434 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+name: "full-test-broker"
+persistenceEnabled: true
+persistDeliveryCountBeforeDelivery: true
+scheduledThreadPoolMaxSize: 10
+threadPoolMaxSize: 50
+securityEnabled: false
+gracefulShutdownEnabled: true
+gracefulShutdownTimeout: 30000
+journalType: "NIO"
+journalSyncTransactional: true
+journalSyncNonTransactional: false
+journalFileSize: 10485760
+journalMinFiles: 5
+journalPoolFiles: 10
+journalCompactMinFiles: 15
+journalCompactPercentage: 50
+journalMaxIO_NIO: 4
+journalBufferTimeout_NIO: 3334
+journalBufferSize_NIO: 307200
+journalMaxAtticFiles: 5
+journalFileOpenTimeout: 10
+journalLockAcquisitionTimeout: 20
+readWholePage: true
+logJournalWriteRate: false
+createBindingsDir: true
+createJournalDir: true
+largeMessageSync: false
+journalDatasync: true
+bindingsDirectory: "test-data/bindings"
+journalDirectory: "test-data/journal"
+pagingDirectory: "test-data/paging"
+largeMessagesDirectory: "test-data/large-messages"
+nodeManagerLockDirectory: "test-data/lock"
+securityInvalidationInterval: 5000
+authenticationCacheSize: 500
+authorizationCacheSize: 500
+connectionTTLOverride: 60000
+connectionTtlCheckInterval: 1000
+globalMaxSize: "100M"
+globalMaxMessages: 5000
+maxDiskUsage: 95
+minDiskFree: 1048576
+diskScanPeriod: 10000
+jMXManagementEnabled: true
+jMXDomain: "org.apache.activemq.test"
+jMXUseBrokerName: true
+managementAddress: "activemq.management.test"
+managementNotificationAddress: "activemq.notifications.test"
+managementMessageRbac: false
+managementRbacPrefix: "mops.rbac"
+viewPermissionMethodMatchPattern: "^(get|is|count|list|browse|query).*$"
+clusterUser: "test-cluster-user"
+clusterPassword: "test-cluster-password"
+messageCounterEnabled: true
+messageCounterSamplePeriod: 5000
+messageCounterMaxDayHistory: 5
+messageExpiryScanPeriod: 15000
+messageExpiryThreadPriority: 5
+addressQueueScanPeriod: 25000
+transactionTimeout: 120000
+transactionTimeoutScanPeriod: 5000
+criticalAnalyzer: true
+criticalAnalyzerPolicy: "SHUTDOWN"
+criticalAnalyzerTimeout: 120000
+criticalAnalyzerCheckPeriod: 30000
+mirrorAckManagerQueueAttempts: 7
+mirrorAckManagerPageAttempts: 3
+mirrorAckManagerRetryDelay: 200
+mirrorPageTransaction: true
+mirrorAckManagerWarnUnacked: true
+mqttSessionScanInterval: 2000
+mqttSubscriptionPersistenceEnabled: true
+maxRedeliveryRecords: 20
+iDCacheSize: 500
+persistIDCache: true
+serverDumpInterval: 30000
+memoryWarningThreshold: 70
+memoryMeasureInterval: 5000
+amqpUseCoreSubscriptionNaming: true
+suppressSessionNotifications: true
+pageSyncTimeout: 3334
+pageMaxConcurrentIO: 10
+literalMatchMarkers: "`"
+configurationFileRefreshPeriod: 3000
+purgePageFolders: true
+fileDeployerScanPeriod: 1000
+populateValidatedUser: true
+rejectEmptyValidatedUser: true
+
+connectorConfigurations:
+  netty-connector:
+    factoryClassName: "org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnectorFactory"
+    params:
+      HOST: "localhost"
+      PORT: "61617"
+  invm-connector:
+    factoryClassName: "org.apache.activemq.artemis.core.remoting.impl.invm.InVMConnectorFactory"
+    params:
+      ID: "0"
+
+acceptorConfigurations:
+  netty-acceptor:
+    factoryClassName: "org.apache.activemq.artemis.core.remoting.impl.netty.NettyAcceptorFactory"
+    params:
+      HOST: "0.0.0.0"
+      PORT: "61616"
+    extraParams:
+      supportAdvisory: "false"
+  invm-acceptor:
+    factoryClassName: "org.apache.activemq.artemis.core.remoting.impl.invm.InVMAcceptorFactory"
+    params:
+      ID: "0"
+
+addressConfigurations:
+  orders:
+    routingTypes:
+      - "ANYCAST"
+    queueConfigs:
+      orders:
+        routingType: "ANYCAST"
+        durable: true
+  notifications:
+    routingTypes:
+      - "MULTICAST"
+    queueConfigs:
+      notifications:
+        routingType: "MULTICAST"
+        durable: false
+
+securityRoles:
+  "orders.#":
+    producers:
+      send: true
+      consume: false
+      createDurableQueue: false
+      deleteDurableQueue: false
+      createNonDurableQueue: false
+      deleteNonDurableQueue: false
+      manage: false
+      browse: false
+      createAddress: false
+      deleteAddress: false
+    consumers:
+      send: false
+      consume: true
+      createDurableQueue: false
+      deleteDurableQueue: false
+      createNonDurableQueue: true
+      deleteNonDurableQueue: true
+      manage: false
+      browse: true
+      createAddress: false
+      deleteAddress: false
+  "notifications.*":
+    monitors:
+      send: false
+      consume: true
+      createDurableQueue: false
+      deleteDurableQueue: false
+      createNonDurableQueue: true
+      deleteNonDurableQueue: true
+      manage: false
+      browse: true
+      createAddress: false
+      deleteAddress: false
+
+bridgeConfigurations:
+  orders-bridge:
+    queueName: "orders"
+    forwardingAddress: "orders.remote"
+    staticConnectors:
+      - "netty-connector"
+    confirmationWindowSize: 10
+    routingType: "STRIP"
+    retryInterval: 500
+    retryIntervalMultiplier: 2.0
+    reconnectAttempts: 3
+    useDuplicateDetection: true
+    transformerConfiguration:
+      className: "org.apache.activemq.artemis.core.server.transformer.AddHeadersTransformer"
+      properties:
+        header1: "value1"
+        header2: "value2"
+
+clusterConfigurations:
+  my-cluster:
+    name: "my-cluster"
+    connectorName: "netty-connector"
+    staticConnectors:
+      - "netty-connector"
+    messageLoadBalancingType: "ON_DEMAND"
+    maxHops: 2
+    retryInterval: 1000
+    callTimeout: 30000
+    callFailoverTimeout: 5000
+    duplicateDetection: true
+    confirmationWindowSize: 1048576
+
+divertConfigurations:
+  my-divert:
+    routingName: "my-divert-routing"
+    address: "orders"
+    forwardingAddress: "orders.archive"
+    exclusive: false
+    transformerConfiguration:
+      className: "org.apache.activemq.artemis.core.server.transformer.AddHeadersTransformer"
+      properties:
+        archivedBy: "divert"
+
+addressSettings:
+  "#":
+    expiryAddress: "globalExpiry"
+    deadLetterAddress: "globalDLQ"
+    maxDeliveryAttempts: 5
+  orders:
+    expiryAddress: "orders.expiry"
+    deadLetterAddress: "orders.dlq"
+    maxDeliveryAttempts: 10
+    redeliveryDelay: 2000
+    redeliveryMultiplier: 2.5
+    redeliveryCollisionAvoidanceFactor: 0.25
+    maxRedeliveryDelay: 30000
+    maxSizeBytes: 10485760
+    maxSizeMessages: 50000
+    maxSizeBytesRejectThreshold: 20971520
+    pageSizeBytes: 65536
+    pageCacheMaxSize: 10
+    maxReadPageBytes: 1048576
+    maxReadPageMessages: 500
+    prefetchPageBytes: 524288
+    prefetchPageMessages: 250
+    pageLimitBytes: 104857600
+    pageLimitMessages: 100000
+    pageFullMessagePolicy: "DROP"
+    addressFullMessagePolicy: "PAGE"
+    diskFullMessagePolicy: "BLOCK"
+    slowConsumerThreshold: 50
+    slowConsumerThresholdMeasurementUnit: "MESSAGES_PER_HOUR"
+    slowConsumerCheckPeriod: 30
+    slowConsumerPolicy: "NOTIFY"
+    messageCounterHistoryDayLimit: 10
+    redistributionDelay: 5000
+    sendToDLAOnNoRoute: true
+    autoCreateExpiryResources: true
+    expiryQueuePrefix: "EXP."
+    expiryQueueSuffix: ".EXPIRED"
+    expiryDelay: 60000
+    minExpiryDelay: 10000
+    maxExpiryDelay: 120000
+    noExpiry: false
+    autoCreateDeadLetterResources: true
+    deadLetterQueuePrefix: "DLQ."
+    deadLetterQueueSuffix: ".DLQ"
+    managementBrowsePageSize: 200
+    managementMessageAttributeSizeLimit: 1024
+    queuePrefetch: 1000
+    defaultConsumerWindowSize: 2048
+    defaultMaxConsumers: 25
+    defaultConsumersBeforeDispatch: 1
+    defaultDelayBeforeDispatch: 100
+    defaultPurgeOnNoConsumers: false
+    defaultQueueRoutingType: "ANYCAST"
+    defaultAddressRoutingType: "ANYCAST"
+    defaultLastValueQueue: false
+    defaultLastValueKey: "myLastValueKey"
+    defaultNonDestructive: false
+    defaultExclusiveQueue: false
+    defaultGroupRebalance: true
+    defaultGroupRebalancePauseDispatch: false
+    defaultGroupBuckets: 64
+    defaultGroupFirstKey: "myGroupFirstKey"
+    defaultRingSize: 1000
+    retroactiveMessageCount: 100
+    autoCreateQueues: true
+    autoDeleteQueues: true
+    autoDeleteCreatedQueues: false
+    autoDeleteQueuesDelay: 30000
+    autoDeleteQueuesMessageCount: 0
+    autoDeleteQueuesSkipUsageCheck: false
+    autoCreateAddresses: true
+    autoDeleteAddresses: true
+    autoDeleteAddressesDelay: 30000
+    autoDeleteAddressesSkipUsageCheck: false
+    configDeleteQueues: "OFF"
+    configDeleteAddresses: "OFF"
+    configDeleteDiverts: "OFF"
+    enableMetrics: true
+    enableIngressTimestamp: true
+    iDCacheSize: 100
+
+AMQPConnections:
+  mirror-target:
+    uri: "tcp://mirror-host:5672"
+    retryInterval: 5000
+    reconnectAttempts: -1
+    user: "mirror-user"
+    password: "mirror-password"
+    autostart: false
+    mirrors:
+      mirror1:
+        type: "MIRROR"
+        messageAcknowledgements: true
+        queueCreation: true
+        queueRemoval: false
+        addressFilter: "orders"
+        sync: true
+        properties:
+          mirrorProp1: "mirrorVal1"
+
+HAPolicyConfiguration: "PRIMARY_ONLY"
+
+resourceLimitSettings:
+  user1:
+    maxConnections: 100
+    maxQueues: 50
+
+wildcardConfiguration:
+  routingEnabled: true
+  anyWords: "#"
+  singleWord: "*"
+  delimiter: "."
+
+metricsConfiguration:
+  jvmMemory: true
+  jvmGc: true
+  jvmThread: true
+  nettyPool: true
+
+federationDownstreamAuthorization:
+  - "admin"
+  - "operator"
+  - "monitor"
+
+jaasConfigs:
+  artemis:
+    modules:
+      properties-module:
+        loginModuleClass: "org.apache.activemq.artemis.spi.core.security.jaas.PropertiesLoginModule"
+        controlFlag: "required"
+        params:
+          user: "artemis-users.properties"
+          role: "artemis-roles.properties"
+      guest-module:
+        loginModuleClass: "org.apache.activemq.artemis.spi.core.security.jaas.GuestLoginModule"
+        controlFlag: "optional"
+        params:
+          org.apache.activemq.jaas.guest.user: "guest"
+          org.apache.activemq.jaas.guest.role: "guest"
+
+connectionRouters:
+  my-router:
+    keyType: "SOURCE_IP"
+    localTargetFilter: "netty-acceptor|invm-acceptor"
+    keyFilter: "STARTS_WITH"
+
+brokerPlugins:
+  org.apache.activemq.artemis.core.server.plugin.impl.LoggingActiveMQServerPlugin.class:
+    init: "LOG_ALL_EVENTS=true,LOG_SESSION_EVENTS=false"
+
+securitySettingPlugins:
+  org.apache.activemq.artemis.core.server.impl.LegacyLDAPSecuritySettingPlugin.class:
+    init: "initialContextFactory=com.sun.jndi.ldap.LdapCtxFactory,connectionURL=ldap://localhost:1024"
+
+federationConfigurations:
+  f1:
+    credentials:
+      user: "federation-user"
+      password: "federation-pass"
+    upstreamConfigurations:
+      upstream1:
+        connectionConfiguration:
+          reconnectAttempts: 5
+          staticConnectors:
+            - "netty-connector"
+        policyRefs:
+          - "qp1"
+    queuePolicies:
+      qp1:
+        transformerRef: "myTransform"
+        includes:
+          all-queues:
+            queueMatch: "#"
+    addressPolicies:
+      ap1:
+        transformerRef: "myTransform"
+        excludes:
+          internal:
+            addressMatch: "activemq.#"
+    transformerConfigurations:
+      myTransform:
+        transformerConfiguration:
+          className: "com.example.MyTransformer"
+          properties:
+            key1: "value1"
+
+lockCoordinatorConfigurations:
+  myZK:
+    name: "myZK"
+    className: "org.apache.activemq.artemis.lockmanager.zookeeper.CuratorDistributedLockManager"
+    lockId: "broker-01"
+    checkPeriod: 5000
+    properties:
+      connect-string: "zk1:2181,zk2:2181,zk3:2181"
+      session-ms: "18000"
+      namespace: "/artemis/ha"
+
+groupingHandlerConfiguration:
+  name: "my-grouping-handler"
+  type: "LOCAL"
+  address: "jms.queue.grouping"
+  timeout: 5000
+  groupTimeout: 10000
+  reaperPeriod: 30000
+
+incomingInterceptorClassNames:
+  - "com.example.IncomingInterceptor1"
+  - "com.example.IncomingInterceptor2"
+outgoingInterceptorClassNames:
+  - "com.example.OutgoingInterceptor1"


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@artemis.apache.org
For additional commands, e-mail: commits-help@artemis.apache.org