From 6b053dd290c140d36ca446f9a4799cfd629f7a3b Mon Sep 17 00:00:00 2001 From: Andy Taylor Date: Wed, 23 Aug 2023 13:26:44 +0100 Subject: [PATCH] ARTEMIS-4398 - support configuring database using Broker Properties https://issues.apache.org/jira/browse/ARTEMIS-4398 --- .../core/config/impl/ConfigurationImpl.java | 12 +++++ .../core/server/ActiveMQMessageBundle.java | 3 ++ .../config/impl/ConfigurationImplTest.java | 54 +++++++++++++++++++ 3 files changed, 69 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 45a452cb4e..dcf1e45da2 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 @@ -84,6 +84,7 @@ import org.apache.activemq.artemis.core.remoting.impl.invm.InVMConnectorFactory; import org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnectorFactory; import org.apache.activemq.artemis.core.security.Role; import org.apache.activemq.artemis.core.server.ActiveMQServerLogger; +import org.apache.activemq.artemis.core.server.ActiveMQMessageBundle; import org.apache.activemq.artemis.core.server.JournalType; import org.apache.activemq.artemis.core.server.NetworkHealthCheck; import org.apache.activemq.artemis.core.server.SecuritySettingPlugin; @@ -773,6 +774,17 @@ public class ConfigurationImpl implements Configuration, Serializable { } }, TransformerConfiguration.class); + beanUtils.getConvertUtils().register(new Converter() { + @Override + public T convert(Class type, Object value) { + //we only care about DATABASE type as it is the only one used + if (StoreConfiguration.StoreType.DATABASE.toString().equals(value)) { + return (T) new DatabaseStorageConfiguration(); + } + throw ActiveMQMessageBundle.BUNDLE.unsupportedStorePropertyType(); + } + }, StoreConfiguration.class); + beanUtils.getConvertUtils().register(new Converter() { @Override public T convert(Class type, Object value) { diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQMessageBundle.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQMessageBundle.java index 2018d3f136..5de85adb7f 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQMessageBundle.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQMessageBundle.java @@ -536,4 +536,7 @@ public interface ActiveMQMessageBundle { @Message(id = 229248, value = "Invalid value for webSocketEncoderType: '{}'. Supported values: 'binary', 'text'.") IllegalStateException invalidWebSocketEncoderType(String webSocketEncoderType); + + @Message(id = 229249, value = "Invalid Store property, only DATABASE property is supported") + RuntimeException unsupportedStorePropertyType(); } diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java index a36de3b148..c7eb9d676d 100644 --- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java +++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java @@ -50,6 +50,7 @@ import org.apache.activemq.artemis.core.config.federation.FederationAddressPolic import org.apache.activemq.artemis.core.config.federation.FederationPolicySet; 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.storage.DatabaseStorageConfiguration; import org.apache.activemq.artemis.core.deployers.impl.FileConfigurationParser; import org.apache.activemq.artemis.core.io.SequentialFileFactory; import org.apache.activemq.artemis.core.paging.PagingManager; @@ -1554,6 +1555,59 @@ public class ConfigurationImplTest extends ActiveMQTestBase { } } + @Test + public void testDatabaseStoreConfigurationProps() throws Exception { + ConfigurationImpl configuration = new ConfigurationImpl(); + Properties insertionOrderedProperties = new ConfigurationImpl.InsertionOrderedProperties(); + insertionOrderedProperties.put("storeConfiguration", "DATABASE"); + insertionOrderedProperties.put("storeConfiguration.largeMessageTableName", "lmtn"); + insertionOrderedProperties.put("storeConfiguration.messageTableName", "mtn"); + insertionOrderedProperties.put("storeConfiguration.bindingsTableName", "btn"); + insertionOrderedProperties.put("storeConfiguration.dataSourceClassName", "dscn"); + insertionOrderedProperties.put("storeConfiguration.nodeManagerStoreTableName", "nmtn"); + insertionOrderedProperties.put("storeConfiguration.pageStoreTableName", "pstn"); + insertionOrderedProperties.put("storeConfiguration.jdbcAllowedTimeDiff", 123); + insertionOrderedProperties.put("storeConfiguration.jdbcConnectionUrl", "url"); + insertionOrderedProperties.put("storeConfiguration.jdbcDriverClassName", "dcn"); + insertionOrderedProperties.put("storeConfiguration.jdbcJournalSyncPeriodMillis", 456); + insertionOrderedProperties.put("storeConfiguration.jdbcLockAcquisitionTimeoutMillis", 789); + insertionOrderedProperties.put("storeConfiguration.jdbcLockExpirationMillis", 321); + insertionOrderedProperties.put("storeConfiguration.jdbcLockRenewPeriodMillis", 654); + insertionOrderedProperties.put("storeConfiguration.jdbcNetworkTimeout", 987); + insertionOrderedProperties.put("storeConfiguration.jdbcPassword", "pass"); + insertionOrderedProperties.put("storeConfiguration.jdbcUser", "user"); + configuration.parsePrefixedProperties(insertionOrderedProperties, null); + Assert.assertTrue(configuration.getStoreConfiguration() instanceof DatabaseStorageConfiguration); + DatabaseStorageConfiguration dsc = (DatabaseStorageConfiguration) configuration.getStoreConfiguration(); + Assert.assertEquals(dsc.getLargeMessageTableName(), "lmtn"); + Assert.assertEquals(dsc.getMessageTableName(), "mtn"); + Assert.assertEquals(dsc.getBindingsTableName(), "btn"); + Assert.assertEquals(dsc.getDataSourceClassName(), "dscn"); + Assert.assertEquals(dsc.getJdbcAllowedTimeDiff(), 123); + Assert.assertEquals(dsc.getJdbcConnectionUrl(), "url"); + Assert.assertEquals(dsc.getJdbcDriverClassName(), "dcn"); + Assert.assertEquals(dsc.getJdbcJournalSyncPeriodMillis(), 456); + Assert.assertEquals(dsc.getJdbcLockAcquisitionTimeoutMillis(), 789); + Assert.assertEquals(dsc.getJdbcLockExpirationMillis(), 321); + Assert.assertEquals(dsc.getJdbcLockRenewPeriodMillis(), 654); + Assert.assertEquals(dsc.getJdbcNetworkTimeout(), 987); + Assert.assertEquals(dsc.getJdbcPassword(), "pass"); + Assert.assertEquals(dsc.getJdbcUser(), "user"); + Assert.assertEquals(dsc.getNodeManagerStoreTableName(), "nmtn"); + Assert.assertEquals(dsc.getPageStoreTableName(), "pstn"); + } + + @Test + public void testInvalidStoreConfigurationProps() throws Exception { + ConfigurationImpl configuration = new ConfigurationImpl(); + Properties insertionOrderedProperties = new ConfigurationImpl.InsertionOrderedProperties(); + insertionOrderedProperties.put("storeConfiguration", "File"); + configuration.parsePrefixedProperties(insertionOrderedProperties, null); + String status = configuration.getStatus(); + //test for exception code + Assert.assertTrue(status.contains("AMQ229249")); + } + @Test public void testEnumConversion() throws Exception { ConfigurationImpl configuration = new ConfigurationImpl();