/* * JBoss, Home of Professional Open Source. * Copyright 2010, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.wildfly.extension.messaging.activemq.jms; import static org.jboss.as.controller.SimpleAttributeDefinitionBuilder.create; import static org.jboss.as.controller.client.helpers.MeasurementUnit.BYTES; import static org.jboss.as.controller.client.helpers.MeasurementUnit.MILLISECONDS; import static org.jboss.as.controller.client.helpers.MeasurementUnit.PER_SECOND; import static org.jboss.dmr.ModelType.BIG_DECIMAL; import static org.jboss.dmr.ModelType.BOOLEAN; import static org.jboss.dmr.ModelType.INT; import static org.jboss.dmr.ModelType.LONG; import static org.jboss.dmr.ModelType.STRING; import static org.wildfly.extension.messaging.activemq.MessagingExtension.MESSAGING_SECURITY_SENSITIVE_TARGET; import static org.wildfly.extension.messaging.activemq.jms.ConnectionFactoryAttribute.create; import org.apache.activemq.artemis.api.config.ActiveMQDefaultConfiguration; import org.apache.activemq.artemis.api.core.client.ActiveMQClient; import org.jboss.as.controller.AttributeDefinition; import org.jboss.as.controller.AttributeMarshaller; import org.jboss.as.controller.AttributeParser; import org.jboss.as.controller.ObjectTypeAttributeDefinition; import org.jboss.as.controller.SimpleAttributeDefinition; import org.jboss.as.controller.SimpleAttributeDefinitionBuilder; import org.jboss.as.controller.StringListAttributeDefinition; import org.jboss.as.controller.access.management.SensitiveTargetAccessConstraintDefinition; import org.jboss.as.controller.descriptions.ModelDescriptionConstants; import org.jboss.as.controller.operations.validation.StringLengthValidator; import org.jboss.as.controller.security.CredentialReference; import org.jboss.dmr.ModelNode; import org.wildfly.extension.messaging.activemq.CommonAttributes; public interface ConnectionFactoryAttributes { interface Common { AttributeDefinition AUTO_GROUP = SimpleAttributeDefinitionBuilder.create("auto-group", BOOLEAN) .setDefaultValue(new ModelNode().set(ActiveMQClient.DEFAULT_AUTO_GROUP)) .setRequired(false) .setAllowExpression(true) .build(); AttributeDefinition BLOCK_ON_ACKNOWLEDGE = SimpleAttributeDefinitionBuilder.create("block-on-acknowledge", BOOLEAN) .setDefaultValue(new ModelNode().set(ActiveMQClient.DEFAULT_BLOCK_ON_ACKNOWLEDGE)) .setRequired(false) .setAllowExpression(true) .build(); AttributeDefinition BLOCK_ON_DURABLE_SEND = SimpleAttributeDefinitionBuilder.create("block-on-durable-send", BOOLEAN) .setDefaultValue(new ModelNode().set(ActiveMQClient.DEFAULT_BLOCK_ON_DURABLE_SEND)) .setRequired(false) .setAllowExpression(true) .build(); AttributeDefinition BLOCK_ON_NON_DURABLE_SEND = SimpleAttributeDefinitionBuilder.create("block-on-non-durable-send", BOOLEAN) .setDefaultValue(new ModelNode().set(ActiveMQClient.DEFAULT_BLOCK_ON_NON_DURABLE_SEND)) .setRequired(false) .setAllowExpression(true) .build(); AttributeDefinition CACHE_LARGE_MESSAGE_CLIENT = SimpleAttributeDefinitionBuilder.create("cache-large-message-client", BOOLEAN) .setDefaultValue(new ModelNode().set(ActiveMQClient.DEFAULT_CACHE_LARGE_MESSAGE_CLIENT)) .setRequired(false) .setAllowExpression(true) .build(); AttributeDefinition CLIENT_FAILURE_CHECK_PERIOD =SimpleAttributeDefinitionBuilder.create("client-failure-check-period", LONG) .setDefaultValue(new ModelNode().set(ActiveMQClient.DEFAULT_CLIENT_FAILURE_CHECK_PERIOD)) .setMeasurementUnit(MILLISECONDS) .setRequired(false) .setAllowExpression(true) .build(); AttributeDefinition COMPRESS_LARGE_MESSAGES = SimpleAttributeDefinitionBuilder.create("compress-large-messages", BOOLEAN) .setDefaultValue(new ModelNode().set(ActiveMQClient.DEFAULT_COMPRESS_LARGE_MESSAGES)) .setRequired(false) .setAllowExpression(true) .build(); AttributeDefinition CONFIRMATION_WINDOW_SIZE = SimpleAttributeDefinitionBuilder.create("confirmation-window-size", INT) .setDefaultValue(new ModelNode().set(ActiveMQClient.DEFAULT_CONFIRMATION_WINDOW_SIZE)) .setMeasurementUnit(BYTES) .setRequired(false) .setAllowExpression(true) .build(); AttributeDefinition CONNECTION_LOAD_BALANCING_CLASS_NAME = SimpleAttributeDefinitionBuilder.create("connection-load-balancing-policy-class-name", STRING) .setDefaultValue(new ModelNode().set(ActiveMQClient.DEFAULT_CONNECTION_LOAD_BALANCING_POLICY_CLASS_NAME)) .setRequired(false) .setAllowExpression(false) .build(); AttributeDefinition CONNECTION_TTL = new SimpleAttributeDefinitionBuilder("connection-ttl", LONG) .setDefaultValue(new ModelNode().set(ActiveMQClient.DEFAULT_CONNECTION_TTL)) .setRequired(false) .setAllowExpression(true) .setMeasurementUnit(MILLISECONDS) .build(); StringListAttributeDefinition CONNECTORS = new StringListAttributeDefinition.Builder(CommonAttributes.CONNECTORS) .setAlternatives(CommonAttributes.DISCOVERY_GROUP) .setRequired(true) .setAttributeParser(AttributeParser.STRING_LIST) .setAttributeMarshaller(AttributeMarshaller.STRING_LIST) .setRestartAllServices() .build(); AttributeDefinition CONSUMER_MAX_RATE = SimpleAttributeDefinitionBuilder.create("consumer-max-rate", INT) .setDefaultValue(new ModelNode(ActiveMQClient.DEFAULT_CONSUMER_MAX_RATE)) .setMeasurementUnit(PER_SECOND) .setRequired(false) .setAllowExpression(true) .build(); AttributeDefinition CONSUMER_WINDOW_SIZE = SimpleAttributeDefinitionBuilder.create("consumer-window-size", INT) .setDefaultValue(new ModelNode().set(ActiveMQClient.DEFAULT_CONSUMER_WINDOW_SIZE)) .setMeasurementUnit(BYTES) .setRequired(false) .setAllowExpression(true) .build(); SimpleAttributeDefinition DISCOVERY_GROUP = SimpleAttributeDefinitionBuilder.create(CommonAttributes.DISCOVERY_GROUP, STRING) .setRequired(true) .setAlternatives(CommonAttributes.CONNECTORS) .setRestartAllServices() .build(); AttributeDefinition DUPS_OK_BATCH_SIZE = SimpleAttributeDefinitionBuilder.create("dups-ok-batch-size", INT) .setDefaultValue(new ModelNode().set(ActiveMQClient.DEFAULT_ACK_BATCH_SIZE)) .setRequired(false) .setAllowExpression(true) .build(); StringListAttributeDefinition ENTRIES = new StringListAttributeDefinition.Builder(CommonAttributes.ENTRIES) .setRequired(true) .setAllowExpression(true) .setListValidator(Validators.noDuplicateElements(new StringLengthValidator(1, false, true))) .setAttributeParser(AttributeParser.STRING_LIST) .setAttributeMarshaller(AttributeMarshaller.STRING_LIST) .setRestartAllServices() .build(); AttributeDefinition FAILOVER_ON_INITIAL_CONNECTION = SimpleAttributeDefinitionBuilder.create("failover-on-initial-connection", BOOLEAN) .setDefaultValue(new ModelNode().set(ActiveMQClient.DEFAULT_FAILOVER_ON_INITIAL_CONNECTION)) .setRequired(false) .setAllowExpression(true) .build(); AttributeDefinition GROUP_ID = SimpleAttributeDefinitionBuilder.create("group-id", STRING) .setRequired(false) .setAllowExpression(true) .build(); AttributeDefinition MAX_RETRY_INTERVAL = SimpleAttributeDefinitionBuilder.create("max-retry-interval", LONG) .setDefaultValue(new ModelNode().set(ActiveMQClient.DEFAULT_MAX_RETRY_INTERVAL)) .setMeasurementUnit(MILLISECONDS) .setRequired(false) .setAllowExpression(true) .build(); AttributeDefinition MIN_LARGE_MESSAGE_SIZE = SimpleAttributeDefinitionBuilder.create("min-large-message-size", INT) .setDefaultValue(new ModelNode().set(ActiveMQClient.DEFAULT_MIN_LARGE_MESSAGE_SIZE)) .setMeasurementUnit(BYTES) .setRequired(false) .setAllowExpression(true) .build(); AttributeDefinition PRE_ACKNOWLEDGE = SimpleAttributeDefinitionBuilder.create("pre-acknowledge", BOOLEAN) .setDefaultValue(new ModelNode().set(ActiveMQClient.DEFAULT_PRE_ACKNOWLEDGE)) .setRequired(false) .setAllowExpression(true) .build(); AttributeDefinition PRODUCER_MAX_RATE = SimpleAttributeDefinitionBuilder.create("producer-max-rate", INT) .setDefaultValue(new ModelNode().set(ActiveMQClient.DEFAULT_PRODUCER_MAX_RATE)) .setMeasurementUnit(PER_SECOND) .setRequired(false) .setAllowExpression(true) .build(); AttributeDefinition PRODUCER_WINDOW_SIZE = SimpleAttributeDefinitionBuilder.create("producer-window-size", INT) .setDefaultValue(new ModelNode().set(ActiveMQClient.DEFAULT_PRODUCER_WINDOW_SIZE)) .setMeasurementUnit(BYTES) .setRequired(false) .setAllowExpression(true) .build(); AttributeDefinition PROTOCOL_MANAGER_FACTORY = SimpleAttributeDefinitionBuilder.create("protocol-manager-factory", STRING) .setRequired(false) .build(); AttributeDefinition RECONNECT_ATTEMPTS = create("reconnect-attempts", INT) .setDefaultValue(new ModelNode().set(ActiveMQClient.DEFAULT_RECONNECT_ATTEMPTS)) .setRequired(false) .setAllowExpression(true) .build(); AttributeDefinition RETRY_INTERVAL = SimpleAttributeDefinitionBuilder.create("retry-interval", LONG) .setDefaultValue(new ModelNode().set(ActiveMQClient.DEFAULT_RETRY_INTERVAL)) .setMeasurementUnit(MILLISECONDS) .setRequired(false) .setAllowExpression(true) .build(); AttributeDefinition RETRY_INTERVAL_MULTIPLIER = create("retry-interval-multiplier", BIG_DECIMAL) .setDefaultValue(new ModelNode().set(ActiveMQClient.DEFAULT_RETRY_INTERVAL_MULTIPLIER)) .setRequired(false) .setAllowExpression(true) .build(); AttributeDefinition SCHEDULED_THREAD_POOL_MAX_SIZE = SimpleAttributeDefinitionBuilder.create("scheduled-thread-pool-max-size", INT) .setDefaultValue(new ModelNode().set(ActiveMQDefaultConfiguration.getDefaultScheduledThreadPoolMaxSize())) .setRequired(false) .setAllowExpression(true) .build(); AttributeDefinition THREAD_POOL_MAX_SIZE = SimpleAttributeDefinitionBuilder.create("thread-pool-max-size", INT) .setDefaultValue(new ModelNode().set(ActiveMQDefaultConfiguration.getDefaultThreadPoolMaxSize())) .setRequired(false) .setAllowExpression(true) .build(); AttributeDefinition TRANSACTION_BATCH_SIZE = SimpleAttributeDefinitionBuilder.create("transaction-batch-size", INT) .setDefaultValue(new ModelNode().set(ActiveMQClient.DEFAULT_ACK_BATCH_SIZE)) .setRequired(false) .setAllowExpression(true) .build(); AttributeDefinition USE_GLOBAL_POOLS = SimpleAttributeDefinitionBuilder.create("use-global-pools", BOOLEAN) .setDefaultValue(new ModelNode().set(ActiveMQClient.DEFAULT_USE_GLOBAL_POOLS)) .setRequired(false) .setAllowExpression(true) .build(); /** * Attributes are defined in the <em>same order than in the XSD schema</em> */ ConnectionFactoryAttribute[] ATTRIBUTES = { create(DISCOVERY_GROUP, null, false), create(CONNECTORS, null, false), create(ENTRIES, "entries", true), create(CommonAttributes.HA, "HA", true), create(CLIENT_FAILURE_CHECK_PERIOD, "clientFailureCheckPeriod", true), create(CONNECTION_TTL, "connectionTTL", true), create(CommonAttributes.CALL_TIMEOUT, "callTimeout", true), create(CommonAttributes.CALL_FAILOVER_TIMEOUT, "callFailoverTimeout", true), create(CONSUMER_WINDOW_SIZE, "consumerWindowSize", true), create(CONSUMER_MAX_RATE, "consumerMaxRate", true), create(CONFIRMATION_WINDOW_SIZE, "confirmationWindowSize", true), create(PRODUCER_WINDOW_SIZE, "producerWindowSize", true), create(PRODUCER_MAX_RATE, "producerMaxRate", true), create(PROTOCOL_MANAGER_FACTORY, "protocolManagerFactoryStr", true), create(COMPRESS_LARGE_MESSAGES, "compressLargeMessage", true), create(CACHE_LARGE_MESSAGE_CLIENT, "cacheLargeMessagesClient", true), create(CommonAttributes.MIN_LARGE_MESSAGE_SIZE, "minLargeMessageSize", true), create(CommonAttributes.CLIENT_ID, "clientID", true), create(DUPS_OK_BATCH_SIZE, "dupsOKBatchSize", true), create(TRANSACTION_BATCH_SIZE, "transactionBatchSize", true), create(BLOCK_ON_ACKNOWLEDGE, "blockOnAcknowledge", true), create(BLOCK_ON_NON_DURABLE_SEND, "blockOnNonDurableSend", true), create(BLOCK_ON_DURABLE_SEND, "blockOnDurableSend", true), create(AUTO_GROUP, "autoGroup", true), create(PRE_ACKNOWLEDGE, "preAcknowledge", true), create(RETRY_INTERVAL, "retryInterval", true), create(RETRY_INTERVAL_MULTIPLIER, "retryIntervalMultiplier", true), create(CommonAttributes.MAX_RETRY_INTERVAL, "maxRetryInterval", true), // the pooled CF has a different default value for the reconnect-attempts attribute. // the specific attribute is replaced when PooledConnectionFactoryDefinition#ATTRIBUTES is defined create(RECONNECT_ATTEMPTS, null, false), create(FAILOVER_ON_INITIAL_CONNECTION, "failoverOnInitialConnection", true), create(CONNECTION_LOAD_BALANCING_CLASS_NAME, "connectionLoadBalancingPolicyClassName", true), create(USE_GLOBAL_POOLS, "useGlobalPools", true), create(SCHEDULED_THREAD_POOL_MAX_SIZE, "scheduledThreadPoolMaxSize", true), create(THREAD_POOL_MAX_SIZE, "threadPoolMaxSize", true), create(GROUP_ID, "groupID", true), }; } interface Regular { AttributeDefinition FACTORY_TYPE = create("factory-type", STRING) .setDefaultValue(new ModelNode().set(ConnectionFactoryType.GENERIC.toString())) .setValidator(ConnectionFactoryType.VALIDATOR) .setRequired(false) .setAllowExpression(true) .setRestartAllServices() .build(); AttributeDefinition[] ATTRIBUTES = { FACTORY_TYPE } ; AttributeDefinition INITIAL_MESSAGE_PACKET_SIZE = create("initial-message-packet-size", INT) .setStorageRuntime() .build(); } interface Pooled { String USE_JNDI_PROP_NAME = "useJNDI"; String SETUP_ATTEMPTS_PROP_NAME = "setupAttempts"; String SETUP_INTERVAL_PROP_NAME = "setupInterval"; String REBALANCE_CONNECTIONS_PROP_NAME = "rebalanceConnections"; String RECONNECT_ATTEMPTS_PROP_NAME = "reconnectAttempts"; String PASSWORD_PROP_NAME = "password"; ObjectTypeAttributeDefinition CREDENTIAL_REFERENCE = CredentialReference.getAttributeBuilder(true, false) .setRestartAllServices() .addAccessConstraint(MESSAGING_SECURITY_SENSITIVE_TARGET) .setAlternatives(PASSWORD_PROP_NAME) .build(); SimpleAttributeDefinition ENLISTMENT_TRACE = SimpleAttributeDefinitionBuilder.create("enlistment-trace", BOOLEAN) .setRequired(false) .setAllowExpression(true) // no default value, this boolean is undefined .setRestartAllServices() .build(); SimpleAttributeDefinition INITIAL_CONNECT_ATTEMPTS = SimpleAttributeDefinitionBuilder.create("initial-connect-attempts", INT) .setRequired(false) .setAllowExpression(true) .setDefaultValue(new ModelNode(ActiveMQClient.INITIAL_CONNECT_ATTEMPTS)) .setRestartAllServices() .build(); SimpleAttributeDefinition INITIAL_MESSAGE_PACKET_SIZE = SimpleAttributeDefinitionBuilder.create("initial-message-packet-size", INT) .setRequired(false) .setAllowExpression(true) .setDefaultValue(new ModelNode(ActiveMQClient.DEFAULT_INITIAL_MESSAGE_PACKET_SIZE)) .setRestartAllServices() .build(); SimpleAttributeDefinition JNDI_PARAMS = SimpleAttributeDefinitionBuilder.create("jndi-params", STRING) .setAttributeGroup("inbound-config") .setRequired(false) .setAllowExpression(true) .setRestartAllServices() .build(); SimpleAttributeDefinition MANAGED_CONNECTION_POOL = SimpleAttributeDefinitionBuilder.create("managed-connection-pool", STRING) .setAllowExpression(true) .setRequired(false) .setRestartAllServices() .build(); SimpleAttributeDefinition MAX_POOL_SIZE = SimpleAttributeDefinitionBuilder.create("max-pool-size", INT) .setDefaultValue(new ModelNode().set(20)) .setRequired(false) .setAllowExpression(true) .setRestartAllServices() .build(); SimpleAttributeDefinition MIN_POOL_SIZE = SimpleAttributeDefinitionBuilder.create("min-pool-size", INT) .setDefaultValue(new ModelNode().set(0)) .setRequired(false) .setAllowExpression(true) .setRestartAllServices() .build(); SimpleAttributeDefinition PASSWORD = SimpleAttributeDefinitionBuilder.create(PASSWORD_PROP_NAME, STRING) .setRequired(false) .setAllowExpression(true) .setRestartAllServices() .addAccessConstraint(SensitiveTargetAccessConstraintDefinition.CREDENTIAL) .addAccessConstraint(MESSAGING_SECURITY_SENSITIVE_TARGET) .addAlternatives(CREDENTIAL_REFERENCE.getName()) .build(); SimpleAttributeDefinition REBALANCE_CONNECTIONS = SimpleAttributeDefinitionBuilder.create("rebalance-connections", BOOLEAN) .setRequired(false) .setAllowExpression(true) .setDefaultValue(new ModelNode(false)) .setAttributeGroup("inbound-config") .setRestartAllServices() .build(); /** * By default, the resource adapter must reconnect infinitely (see {@link org.apache.activemq.artemis.ra.ActiveMQResourceAdapter#setParams}) */ AttributeDefinition RECONNECT_ATTEMPTS = create("reconnect-attempts", INT) .setDefaultValue(new ModelNode().set(-1)) .setRequired(false) .setAllowExpression(true) .build(); SimpleAttributeDefinition SETUP_ATTEMPTS = SimpleAttributeDefinitionBuilder.create("setup-attempts", INT) .setAttributeGroup("inbound-config") .setRequired(false) .setAllowExpression(true) .setRestartAllServices() .build(); SimpleAttributeDefinition SETUP_INTERVAL = SimpleAttributeDefinitionBuilder.create("setup-interval", LONG) .setMeasurementUnit(MILLISECONDS) .setAttributeGroup("inbound-config") .setRequired(false) .setAllowExpression(true) .setRestartAllServices() .build(); SimpleAttributeDefinition TRANSACTION = SimpleAttributeDefinitionBuilder.create("transaction", STRING) .setDefaultValue(new ModelNode().set("transaction")) .setRequired(false) .setAllowExpression(true) .setRestartAllServices() .build(); AttributeDefinition USE_AUTO_RECOVERY = SimpleAttributeDefinitionBuilder.create("use-auto-recovery", BOOLEAN) .setDefaultValue(new ModelNode().set(true)) // ActiveMQQResourceAdapter.useAutoRecovery = true but is not exposed publicly .setRequired(false) .setAllowExpression(true) .setRestartAllServices() .build(); AttributeDefinition USE_JNDI = SimpleAttributeDefinitionBuilder.create("use-jndi", BOOLEAN) .setAttributeGroup("inbound-config") .setRequired(false) .setAllowExpression(true) .setRestartAllServices() .build(); AttributeDefinition USE_LOCAL_TX = SimpleAttributeDefinitionBuilder.create("use-local-tx", BOOLEAN) .setAttributeGroup("inbound-config") .setRequired(false) .setAllowExpression(true) .setRestartAllServices() .build(); SimpleAttributeDefinition USER = SimpleAttributeDefinitionBuilder.create("user", STRING) .setRequired(false) .setAllowExpression(true) .addAccessConstraint(SensitiveTargetAccessConstraintDefinition.CREDENTIAL) .addAccessConstraint(MESSAGING_SECURITY_SENSITIVE_TARGET) .build(); SimpleAttributeDefinition STATISTICS_ENABLED = SimpleAttributeDefinitionBuilder.create(ModelDescriptionConstants.STATISTICS_ENABLED, BOOLEAN) .setDefaultValue(new ModelNode(false)) .setRequired(false) .setAllowExpression(true) .build(); /** * Attributes are defined in the <em>same order than in the XSD schema</em> */ ConnectionFactoryAttribute[] ATTRIBUTES = { /* inbound config */ create(USE_JNDI, USE_JNDI_PROP_NAME, true, true), create(JNDI_PARAMS, "jndiParams", true, true), create(REBALANCE_CONNECTIONS, REBALANCE_CONNECTIONS_PROP_NAME, true, true), create(USE_LOCAL_TX, "useLocalTx", true, true), create(SETUP_ATTEMPTS, SETUP_ATTEMPTS_PROP_NAME, true, true), create(SETUP_INTERVAL, SETUP_INTERVAL_PROP_NAME, true, true), create(STATISTICS_ENABLED, null, false), create(TRANSACTION, null, false), create(USER, "userName", true), create(PASSWORD, "password", true), create(CREDENTIAL_REFERENCE, null, false), create(MANAGED_CONNECTION_POOL, null, false), create(ENLISTMENT_TRACE, null, false), create(MIN_POOL_SIZE, null, false), create(MAX_POOL_SIZE, null, false), create(USE_AUTO_RECOVERY, "useAutoRecovery", true), create(INITIAL_MESSAGE_PACKET_SIZE, "initialMessagePacketSize", true), create(INITIAL_CONNECT_ATTEMPTS, "initialConnectAttempts", true), }; } }