ARTEMIS-4398 - support configuring database using Broker Properties

https://issues.apache.org/jira/browse/ARTEMIS-4398
This commit is contained in:
Andy Taylor 2023-08-23 13:26:44 +01:00 committed by Gary Tully
parent c1648d5917
commit 6b053dd290
3 changed files with 69 additions and 0 deletions

View File

@ -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> T convert(Class<T> 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> T convert(Class<T> type, Object value) {

View File

@ -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();
}

View File

@ -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();