/*
* 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.jms.server.config.impl;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.client.ActiveMQClient;
import org.apache.activemq.artemis.api.jms.JMSFactoryType;
import org.apache.activemq.artemis.jms.server.config.ConnectionFactoryConfiguration;
import org.apache.activemq.artemis.utils.BufferHelper;
import org.apache.activemq.artemis.utils.DataConstants;
/**
* This class contains the configuration properties of a connection factory.
* <p>
* It is also persisted on the journal at the time of management is used to created a connection factory and set to store.
* <p>
* Every property on this class has to be also set through encoders through EncodingSupport implementation at this class.
*/
public class ConnectionFactoryConfigurationImpl implements ConnectionFactoryConfiguration {
// Constants -----------------------------------------------------
// Attributes ----------------------------------------------------
private String name = null;
private boolean persisted = false;
private String[] bindings = null;
private List<String> connectorNames = null;
private String discoveryGroupName = null;
private String clientID = null;
private boolean ha = ActiveMQClient.DEFAULT_HA;
private long clientFailureCheckPeriod = ActiveMQClient.DEFAULT_CLIENT_FAILURE_CHECK_PERIOD;
private long connectionTTL = ActiveMQClient.DEFAULT_CONNECTION_TTL;
private long callTimeout = ActiveMQClient.DEFAULT_CALL_TIMEOUT;
private long callFailoverTimeout = ActiveMQClient.DEFAULT_CALL_FAILOVER_TIMEOUT;
private boolean cacheLargeMessagesClient = ActiveMQClient.DEFAULT_CACHE_LARGE_MESSAGE_CLIENT;
private int minLargeMessageSize = ActiveMQClient.DEFAULT_MIN_LARGE_MESSAGE_SIZE;
private boolean compressLargeMessage = ActiveMQClient.DEFAULT_COMPRESS_LARGE_MESSAGES;
private int consumerWindowSize = ActiveMQClient.DEFAULT_CONSUMER_WINDOW_SIZE;
private int consumerMaxRate = ActiveMQClient.DEFAULT_CONSUMER_MAX_RATE;
private int confirmationWindowSize = ActiveMQClient.DEFAULT_CONFIRMATION_WINDOW_SIZE;
private int producerWindowSize = ActiveMQClient.DEFAULT_PRODUCER_WINDOW_SIZE;
private int producerMaxRate = ActiveMQClient.DEFAULT_PRODUCER_MAX_RATE;
private boolean blockOnAcknowledge = ActiveMQClient.DEFAULT_BLOCK_ON_ACKNOWLEDGE;
private boolean blockOnDurableSend = ActiveMQClient.DEFAULT_BLOCK_ON_DURABLE_SEND;
private boolean blockOnNonDurableSend = ActiveMQClient.DEFAULT_BLOCK_ON_NON_DURABLE_SEND;
private boolean autoGroup = ActiveMQClient.DEFAULT_AUTO_GROUP;
private boolean preAcknowledge = ActiveMQClient.DEFAULT_PRE_ACKNOWLEDGE;
private String loadBalancingPolicyClassName = ActiveMQClient.DEFAULT_CONNECTION_LOAD_BALANCING_POLICY_CLASS_NAME;
private int transactionBatchSize = ActiveMQClient.DEFAULT_ACK_BATCH_SIZE;
private int dupsOKBatchSize = ActiveMQClient.DEFAULT_ACK_BATCH_SIZE;
private long initialWaitTimeout = ActiveMQClient.DEFAULT_DISCOVERY_INITIAL_WAIT_TIMEOUT;
private boolean useGlobalPools = ActiveMQClient.DEFAULT_USE_GLOBAL_POOLS;
private int scheduledThreadPoolMaxSize = ActiveMQClient.DEFAULT_SCHEDULED_THREAD_POOL_MAX_SIZE;
private int threadPoolMaxSize = ActiveMQClient.DEFAULT_THREAD_POOL_MAX_SIZE;
private long retryInterval = ActiveMQClient.DEFAULT_RETRY_INTERVAL;
private double retryIntervalMultiplier = ActiveMQClient.DEFAULT_RETRY_INTERVAL_MULTIPLIER;
private long maxRetryInterval = ActiveMQClient.DEFAULT_MAX_RETRY_INTERVAL;
private int reconnectAttempts = ActiveMQClient.DEFAULT_RECONNECT_ATTEMPTS;
private boolean failoverOnInitialConnection = ActiveMQClient.DEFAULT_FAILOVER_ON_INITIAL_CONNECTION;
private String groupID = null;
private String protocolManagerFactoryStr;
private JMSFactoryType factoryType = JMSFactoryType.CF;
private String deserializationBlackList;
private String deserializationWhiteList;
// Static --------------------------------------------------------
// Constructors --------------------------------------------------
public ConnectionFactoryConfigurationImpl() {
}
// ConnectionFactoryConfiguration implementation -----------------
@Override
public String[] getBindings() {
return bindings;
}
@Override
public ConnectionFactoryConfiguration setBindings(final String... bindings) {
this.bindings = bindings;
return this;
}
@Override
public String getName() {
return name;
}
@Override
public ConnectionFactoryConfiguration setName(String name) {
this.name = name;
return this;
}
@Override
public boolean isPersisted() {
return persisted;
}
/**
* @return the discoveryGroupName
*/
@Override
public String getDiscoveryGroupName() {
return discoveryGroupName;
}
/**
* @param discoveryGroupName the discoveryGroupName to set
*/
@Override
public ConnectionFactoryConfiguration setDiscoveryGroupName(String discoveryGroupName) {
this.discoveryGroupName = discoveryGroupName;
return this;
}
@Override
public List<String> getConnectorNames() {
return connectorNames;
}
@Override
public ConnectionFactoryConfiguration setConnectorNames(final List<String> connectorNames) {
this.connectorNames = connectorNames;
return this;
}
@Override
public ConnectionFactoryConfiguration setConnectorNames(final String... names) {
return this.setConnectorNames(Arrays.asList(names));
}
@Override
public boolean isHA() {
return ha;
}
@Override
public ConnectionFactoryConfiguration setHA(final boolean ha) {
this.ha = ha;
return this;
}
@Override
public String getClientID() {
return clientID;
}
@Override
public ConnectionFactoryConfiguration setClientID(final String clientID) {
this.clientID = clientID;
return this;
}
@Override
public long getClientFailureCheckPeriod() {
return clientFailureCheckPeriod;
}
@Override
public ConnectionFactoryConfiguration setClientFailureCheckPeriod(final long clientFailureCheckPeriod) {
this.clientFailureCheckPeriod = clientFailureCheckPeriod;
return this;
}
@Override
public long getConnectionTTL() {
return connectionTTL;
}
@Override
public ConnectionFactoryConfiguration setConnectionTTL(final long connectionTTL) {
this.connectionTTL = connectionTTL;
return this;
}
@Override
public long getCallTimeout() {
return callTimeout;
}
@Override
public ConnectionFactoryConfiguration setCallTimeout(final long callTimeout) {
this.callTimeout = callTimeout;
return this;
}
@Override
public long getCallFailoverTimeout() {
return callFailoverTimeout;
}
@Override
public ConnectionFactoryConfiguration setCallFailoverTimeout(long callFailoverTimeout) {
this.callFailoverTimeout = callFailoverTimeout;
return this;
}
@Override
public boolean isCacheLargeMessagesClient() {
return cacheLargeMessagesClient;
}
@Override
public ConnectionFactoryConfiguration setCacheLargeMessagesClient(final boolean cacheLargeMessagesClient) {
this.cacheLargeMessagesClient = cacheLargeMessagesClient;
return this;
}
@Override
public int getMinLargeMessageSize() {
return minLargeMessageSize;
}
@Override
public ConnectionFactoryConfiguration setMinLargeMessageSize(final int minLargeMessageSize) {
this.minLargeMessageSize = minLargeMessageSize;
return this;
}
@Override
public int getConsumerWindowSize() {
return consumerWindowSize;
}
@Override
public ConnectionFactoryConfiguration setConsumerWindowSize(final int consumerWindowSize) {
this.consumerWindowSize = consumerWindowSize;
return this;
}
@Override
public int getConsumerMaxRate() {
return consumerMaxRate;
}
@Override
public ConnectionFactoryConfiguration setConsumerMaxRate(final int consumerMaxRate) {
this.consumerMaxRate = consumerMaxRate;
return this;
}
@Override
public int getConfirmationWindowSize() {
return confirmationWindowSize;
}
@Override
public ConnectionFactoryConfiguration setConfirmationWindowSize(final int confirmationWindowSize) {
this.confirmationWindowSize = confirmationWindowSize;
return this;
}
@Override
public int getProducerMaxRate() {
return producerMaxRate;
}
@Override
public ConnectionFactoryConfiguration setProducerMaxRate(final int producerMaxRate) {
this.producerMaxRate = producerMaxRate;
return this;
}
@Override
public int getProducerWindowSize() {
return producerWindowSize;
}
@Override
public ConnectionFactoryConfiguration setProducerWindowSize(final int producerWindowSize) {
this.producerWindowSize = producerWindowSize;
return this;
}
@Override
public boolean isBlockOnAcknowledge() {
return blockOnAcknowledge;
}
@Override
public ConnectionFactoryConfiguration setBlockOnAcknowledge(final boolean blockOnAcknowledge) {
this.blockOnAcknowledge = blockOnAcknowledge;
return this;
}
@Override
public boolean isBlockOnDurableSend() {
return blockOnDurableSend;
}
@Override
public ConnectionFactoryConfiguration setBlockOnDurableSend(final boolean blockOnDurableSend) {
this.blockOnDurableSend = blockOnDurableSend;
return this;
}
@Override
public boolean isBlockOnNonDurableSend() {
return blockOnNonDurableSend;
}
@Override
public ConnectionFactoryConfiguration setBlockOnNonDurableSend(final boolean blockOnNonDurableSend) {
this.blockOnNonDurableSend = blockOnNonDurableSend;
return this;
}
@Override
public boolean isAutoGroup() {
return autoGroup;
}
@Override
public ConnectionFactoryConfiguration setAutoGroup(final boolean autoGroup) {
this.autoGroup = autoGroup;
return this;
}
@Override
public boolean isPreAcknowledge() {
return preAcknowledge;
}
@Override
public ConnectionFactoryConfiguration setPreAcknowledge(final boolean preAcknowledge) {
this.preAcknowledge = preAcknowledge;
return this;
}
@Override
public String getLoadBalancingPolicyClassName() {
return loadBalancingPolicyClassName;
}
@Override
public ConnectionFactoryConfiguration setLoadBalancingPolicyClassName(final String loadBalancingPolicyClassName) {
this.loadBalancingPolicyClassName = loadBalancingPolicyClassName;
return this;
}
@Override
public int getTransactionBatchSize() {
return transactionBatchSize;
}
@Override
public ConnectionFactoryConfiguration setTransactionBatchSize(final int transactionBatchSize) {
this.transactionBatchSize = transactionBatchSize;
return this;
}
@Override
public int getDupsOKBatchSize() {
return dupsOKBatchSize;
}
@Override
public ConnectionFactoryConfiguration setDupsOKBatchSize(final int dupsOKBatchSize) {
this.dupsOKBatchSize = dupsOKBatchSize;
return this;
}
public long getInitialWaitTimeout() {
return initialWaitTimeout;
}
public ConnectionFactoryConfiguration setInitialWaitTimeout(final long initialWaitTimeout) {
this.initialWaitTimeout = initialWaitTimeout;
return this;
}
@Override
public boolean isUseGlobalPools() {
return useGlobalPools;
}
@Override
public ConnectionFactoryConfiguration setUseGlobalPools(final boolean useGlobalPools) {
this.useGlobalPools = useGlobalPools;
return this;
}
@Override
public int getScheduledThreadPoolMaxSize() {
return scheduledThreadPoolMaxSize;
}
@Override
public ConnectionFactoryConfiguration setScheduledThreadPoolMaxSize(final int scheduledThreadPoolMaxSize) {
this.scheduledThreadPoolMaxSize = scheduledThreadPoolMaxSize;
return this;
}
@Override
public int getThreadPoolMaxSize() {
return threadPoolMaxSize;
}
@Override
public ConnectionFactoryConfiguration setThreadPoolMaxSize(final int threadPoolMaxSize) {
this.threadPoolMaxSize = threadPoolMaxSize;
return this;
}
@Override
public long getRetryInterval() {
return retryInterval;
}
@Override
public ConnectionFactoryConfiguration setRetryInterval(final long retryInterval) {
this.retryInterval = retryInterval;
return this;
}
@Override
public double getRetryIntervalMultiplier() {
return retryIntervalMultiplier;
}
@Override
public ConnectionFactoryConfiguration setRetryIntervalMultiplier(final double retryIntervalMultiplier) {
this.retryIntervalMultiplier = retryIntervalMultiplier;
return this;
}
@Override
public long getMaxRetryInterval() {
return maxRetryInterval;
}
@Override
public ConnectionFactoryConfiguration setMaxRetryInterval(final long maxRetryInterval) {
this.maxRetryInterval = maxRetryInterval;
return this;
}
@Override
public int getReconnectAttempts() {
return reconnectAttempts;
}
@Override
public ConnectionFactoryConfiguration setReconnectAttempts(final int reconnectAttempts) {
this.reconnectAttempts = reconnectAttempts;
return this;
}
@Override
public boolean isFailoverOnInitialConnection() {
return failoverOnInitialConnection;
}
@Override
public ConnectionFactoryConfiguration setFailoverOnInitialConnection(final boolean failover) {
failoverOnInitialConnection = failover;
return this;
}
@Override
public String getGroupID() {
return groupID;
}
@Override
public ConnectionFactoryConfiguration setGroupID(final String groupID) {
this.groupID = groupID;
return this;
}
// Encoding Support Implementation --------------------------------------------------------------
@Override
public void decode(final ActiveMQBuffer buffer) {
persisted = true;
name = buffer.readSimpleString().toString();
discoveryGroupName = BufferHelper.readNullableSimpleStringAsString(buffer);
int nConnectors = buffer.readInt();
if (nConnectors > 0) {
connectorNames = new ArrayList<>(nConnectors);
for (int i = 0; i < nConnectors; i++) {
SimpleString str = buffer.readSimpleString();
connectorNames.add(str.toString());
}
}
ha = buffer.readBoolean();
clientID = BufferHelper.readNullableSimpleStringAsString(buffer);
clientFailureCheckPeriod = buffer.readLong();
connectionTTL = buffer.readLong();
callTimeout = buffer.readLong();
cacheLargeMessagesClient = buffer.readBoolean();
minLargeMessageSize = buffer.readInt();
consumerWindowSize = buffer.readInt();
consumerMaxRate = buffer.readInt();
confirmationWindowSize = buffer.readInt();
producerWindowSize = buffer.readInt();
producerMaxRate = buffer.readInt();
blockOnAcknowledge = buffer.readBoolean();
blockOnDurableSend = buffer.readBoolean();
blockOnNonDurableSend = buffer.readBoolean();
autoGroup = buffer.readBoolean();
preAcknowledge = buffer.readBoolean();
loadBalancingPolicyClassName = buffer.readSimpleString().toString();
transactionBatchSize = buffer.readInt();
dupsOKBatchSize = buffer.readInt();
initialWaitTimeout = buffer.readLong();
useGlobalPools = buffer.readBoolean();
scheduledThreadPoolMaxSize = buffer.readInt();
threadPoolMaxSize = buffer.readInt();
retryInterval = buffer.readLong();
retryIntervalMultiplier = buffer.readDouble();
maxRetryInterval = buffer.readLong();
reconnectAttempts = buffer.readInt();
failoverOnInitialConnection = buffer.readBoolean();
compressLargeMessage = buffer.readBoolean();
groupID = BufferHelper.readNullableSimpleStringAsString(buffer);
factoryType = JMSFactoryType.valueOf(buffer.readInt());
protocolManagerFactoryStr = BufferHelper.readNullableSimpleStringAsString(buffer);
deserializationBlackList = BufferHelper.readNullableSimpleStringAsString(buffer);
deserializationWhiteList = BufferHelper.readNullableSimpleStringAsString(buffer);
}
@Override
public void encode(final ActiveMQBuffer buffer) {
persisted = true;
BufferHelper.writeAsSimpleString(buffer, name);
BufferHelper.writeAsNullableSimpleString(buffer, discoveryGroupName);
if (this.connectorNames == null) {
buffer.writeInt(0);
} else {
buffer.writeInt(connectorNames.size());
for (String tc : connectorNames) {
BufferHelper.writeAsSimpleString(buffer, tc);
}
}
buffer.writeBoolean(ha);
BufferHelper.writeAsNullableSimpleString(buffer, clientID);
buffer.writeLong(clientFailureCheckPeriod);
buffer.writeLong(connectionTTL);
buffer.writeLong(callTimeout);
buffer.writeBoolean(cacheLargeMessagesClient);
buffer.writeInt(minLargeMessageSize);
buffer.writeInt(consumerWindowSize);
buffer.writeInt(consumerMaxRate);
buffer.writeInt(confirmationWindowSize);
buffer.writeInt(producerWindowSize);
buffer.writeInt(producerMaxRate);
buffer.writeBoolean(blockOnAcknowledge);
buffer.writeBoolean(blockOnDurableSend);
buffer.writeBoolean(blockOnNonDurableSend);
buffer.writeBoolean(autoGroup);
buffer.writeBoolean(preAcknowledge);
BufferHelper.writeAsSimpleString(buffer, loadBalancingPolicyClassName);
buffer.writeInt(transactionBatchSize);
buffer.writeInt(dupsOKBatchSize);
buffer.writeLong(initialWaitTimeout);
buffer.writeBoolean(useGlobalPools);
buffer.writeInt(scheduledThreadPoolMaxSize);
buffer.writeInt(threadPoolMaxSize);
buffer.writeLong(retryInterval);
buffer.writeDouble(retryIntervalMultiplier);
buffer.writeLong(maxRetryInterval);
buffer.writeInt(reconnectAttempts);
buffer.writeBoolean(failoverOnInitialConnection);
buffer.writeBoolean(compressLargeMessage);
BufferHelper.writeAsNullableSimpleString(buffer, groupID);
buffer.writeInt(factoryType.intValue());
BufferHelper.writeAsNullableSimpleString(buffer, protocolManagerFactoryStr);
BufferHelper.writeAsNullableSimpleString(buffer, deserializationBlackList);
BufferHelper.writeAsNullableSimpleString(buffer, deserializationWhiteList);
}
@Override
public int getEncodeSize() {
int size = BufferHelper.sizeOfSimpleString(name) +
BufferHelper.sizeOfNullableSimpleString(discoveryGroupName);
size += DataConstants.SIZE_INT;
if (this.connectorNames != null) {
for (String tc : connectorNames) {
size += BufferHelper.sizeOfSimpleString(tc);
}
}
size += BufferHelper.sizeOfNullableSimpleString(clientID) +
DataConstants.SIZE_BOOLEAN +
// ha
DataConstants.SIZE_LONG +
// clientFailureCheckPeriod
DataConstants.SIZE_LONG +
// connectionTTL
DataConstants.SIZE_LONG +
// callTimeout
DataConstants.SIZE_BOOLEAN +
// cacheLargeMessagesClient
DataConstants.SIZE_INT +
// minLargeMessageSize
DataConstants.SIZE_INT +
// consumerWindowSize
DataConstants.SIZE_INT +
// consumerMaxRate
DataConstants.SIZE_INT +
// confirmationWindowSize
DataConstants.SIZE_INT +
// producerWindowSize
DataConstants.SIZE_INT +
// producerMaxRate
DataConstants.SIZE_BOOLEAN +
// blockOnAcknowledge
DataConstants.SIZE_BOOLEAN +
// blockOnDurableSend
DataConstants.SIZE_BOOLEAN +
// blockOnNonDurableSend
DataConstants.SIZE_BOOLEAN +
// autoGroup
DataConstants.SIZE_BOOLEAN +
// preAcknowledge
BufferHelper.sizeOfSimpleString(loadBalancingPolicyClassName) +
DataConstants.SIZE_INT +
// transactionBatchSize
DataConstants.SIZE_INT +
// dupsOKBatchSize
DataConstants.SIZE_LONG +
// initialWaitTimeout
DataConstants.SIZE_BOOLEAN +
// useGlobalPools
DataConstants.SIZE_INT +
// scheduledThreadPoolMaxSize
DataConstants.SIZE_INT +
// threadPoolMaxSize
DataConstants.SIZE_LONG +
// retryInterval
DataConstants.SIZE_DOUBLE +
// retryIntervalMultiplier
DataConstants.SIZE_LONG +
// maxRetryInterval
DataConstants.SIZE_INT +
// reconnectAttempts
DataConstants.SIZE_BOOLEAN +
// failoverOnInitialConnection
DataConstants.SIZE_BOOLEAN +
// compress-large-message
BufferHelper.sizeOfNullableSimpleString(groupID) +
DataConstants.SIZE_INT +
// factoryType
BufferHelper.sizeOfNullableSimpleString(protocolManagerFactoryStr) +
BufferHelper.sizeOfNullableSimpleString(deserializationBlackList) +
BufferHelper.sizeOfNullableSimpleString(deserializationWhiteList);
return size;
}
@Override
public ConnectionFactoryConfiguration setFactoryType(final JMSFactoryType factoryType) {
this.factoryType = factoryType;
return this;
}
@Override
public JMSFactoryType getFactoryType() {
return factoryType;
}
@Override
public String getDeserializationBlackList() {
return deserializationBlackList;
}
@Override
public void setDeserializationBlackList(String blackList) {
this.deserializationBlackList = blackList;
}
@Override
public String getDeserializationWhiteList() {
return this.deserializationWhiteList;
}
@Override
public void setDeserializationWhiteList(String whiteList) {
this.deserializationWhiteList = whiteList;
}
@Override
public ConnectionFactoryConfiguration setCompressLargeMessages(boolean compressLargeMessage) {
this.compressLargeMessage = compressLargeMessage;
return this;
}
@Override
public boolean isCompressLargeMessages() {
return this.compressLargeMessage;
}
@Override
public ConnectionFactoryConfiguration setProtocolManagerFactoryStr(String protocolManagerFactoryStr) {
this.protocolManagerFactoryStr = protocolManagerFactoryStr;
return this;
}
@Override
public String getProtocolManagerFactoryStr() {
return protocolManagerFactoryStr;
}
// Public --------------------------------------------------------
// Package protected ---------------------------------------------
// Protected -----------------------------------------------------
// Private -------------------------------------------------------
// Inner classes -------------------------------------------------
}