blob: 76c30a964679a53ea912aa09c22d38f8b4ee9d3f [file] [log] [blame]
/* 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.qpid.configuration;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* This class centralized the Qpid client properties.
*
* @see CommonProperties
*/
public class ClientProperties
{
private static final Logger LOGGER = LoggerFactory.getLogger(ClientProperties.class);
/**
* Currently with Qpid it is not possible to change the client ID.
* If one is not specified upon connection construction, an id is generated automatically.
* Therefore an exception is always thrown unless this property is set to true.
* type: boolean
*/
public static final String IGNORE_SET_CLIENTID_PROP_NAME = "ignore_setclientID";
/**
* This property is currently used within the 0.10 code path only
* The maximum number of pre-fetched messages per destination
* This property is used for all the connection unless it is overwritten by the connectionURL
* type: long
*/
public static final String MAX_PREFETCH_PROP_NAME = "max_prefetch";
public static final String MAX_PREFETCH_DEFAULT = "500";
/**
* When true a sync command is sent after every persistent messages.
* type: boolean
*/
public static final String SYNC_PERSISTENT_PROP_NAME = "sync_persistence";
/**
* When true a sync command is sent after sending a message ack.
* type: boolean
*/
public static final String SYNC_ACK_PROP_NAME = "sync_ack";
/**
* When true a sync command is sent after sending a message ack on a CLIENT_ACK session.
* type: boolean
*/
public static final String SYNC_CLIENT_ACK = "sync_client_ack";
/**
* sync_publish property - {persistent|all}
* If set to 'persistent',then persistent messages will be publish synchronously
* If set to 'all', then all messages regardless of the delivery mode will be
* published synchronously.
*/
public static final String SYNC_PUBLISH_PROP_NAME = "sync_publish";
/**
* Frequency of heartbeat messages (in seconds)
*/
public static final String QPID_HEARTBEAT_INTERVAL = "qpid.heartbeat";
/**
* Default heartbeat interval (used by 0-10 protocol).
*/
public static final int QPID_HEARTBEAT_INTERVAL_010_DEFAULT = 120;
/**
* The factor applied to {@link #QPID_HEARTBEAT_INTERVAL} that determines the maximum
* length of time that may elapse before the peer is deemed to have failed.
*
* @see #QPID_HEARTBEAT_TIMEOUT_FACTOR_DEFAULT
*/
public static final String QPID_HEARTBEAT_TIMEOUT_FACTOR = "qpid.heartbeat_timeout_factor";
/**
* Default heartbeat timeout factor.
*/
public static final float QPID_HEARTBEAT_TIMEOUT_FACTOR_DEFAULT = 2.0f;
/**
* This value will be used to determine the default destination syntax type.
* Currently the two types are Binding URL (java only) and the Addressing format (used by
* all clients).
*/
public static final String DEST_SYNTAX = "qpid.dest_syntax";
public static final String USE_LEGACY_MAP_MESSAGE_FORMAT = "qpid.use_legacy_map_message";
public static final String USE_LEGACY_STREAM_MESSAGE_FORMAT = "qpid.use_legacy_stream_message";
public static final String AMQP_VERSION = "qpid.amqp.version";
public static final String QPID_VERIFY_CLIENT_ID = "qpid.verify_client_id";
/**
* System properties to change the default timeout used during
* synchronous operations.
*/
public static final String QPID_SYNC_OP_TIMEOUT = "qpid.sync_op_timeout";
/**
* A default timeout value for synchronous operations
*/
public static final int DEFAULT_SYNC_OPERATION_TIMEOUT = 60000;
/**
* System properties to change the default timeout used whilst closing connections
* and underlying sessions.
*/
public static final String QPID_CLOSE_TIMEOUT = "qpid.close_timeout";
/**
* A default timeout value for close operations
*/
public static final int DEFAULT_CLOSE_TIMEOUT = 2000;
/**
* System properties to change the default value used for TCP_NODELAY
*/
public static final String QPID_TCP_NODELAY_PROP_NAME = "qpid.tcp_nodelay";
/**
* System property to set the reject behaviour. default value will be 'normal' but can be
* changed to 'server' in which case the server decides whether a message should be requeued
* or dead lettered.
* This can be overridden by the more specific settings at connection or binding URL level.
*/
public static final String REJECT_BEHAVIOUR_PROP_NAME = "qpid.reject.behaviour";
/**
* System property used to set the key manager factory algorithm.
*/
public static final String QPID_SSL_KEY_MANAGER_FACTORY_ALGORITHM_PROP_NAME = "qpid.ssl.KeyManagerFactory.algorithm";
/**
* System property used to set the trust manager factory algorithm.
*/
public static final String QPID_SSL_TRUST_MANAGER_FACTORY_ALGORITHM_PROP_NAME = "qpid.ssl.TrustManagerFactory.algorithm";
/**
* System property to enable allow dispatcher thread to be run as a daemon thread
*/
public static final String DAEMON_DISPATCHER = "qpid.jms.daemon.dispatcher";
/**
* Used to name the process utilising the Qpid client, to override the default
* value is used in the ConnectionStartOk reply to the broker.
*/
public static final String PROCESS_NAME = "qpid.client_process";
/**
* System property used to set the socket receive buffer size.
*/
public static final String RECEIVE_BUFFER_SIZE_PROP_NAME = "qpid.receive_buffer_size";
/**
* System property used to set the socket send buffer size.
*/
public static final String SEND_BUFFER_SIZE_PROP_NAME = "qpid.send_buffer_size";
/**
* System property to set the time (in millis) to wait before failing when sending and
* the client has been flow controlled by the broker.
*/
public static final String QPID_FLOW_CONTROL_WAIT_FAILURE = "qpid.flow_control_wait_failure";
/**
* Default time (in millis) to wait before failing when sending and the client has been
* flow controlled by the broker.
*/
public static final long DEFAULT_FLOW_CONTROL_WAIT_FAILURE = 60000L;
/**
* System property to set the time (in millis) between log notifications that a
* send is waiting because the client was flow controlled by the broker.
*/
public static final String QPID_FLOW_CONTROL_WAIT_NOTIFY_PERIOD = "qpid.flow_control_wait_notify_period";
/**
* Default time (in millis) between log notifications that a send is
* waiting because the client was flow controlled by the broker.
*/
public static final long DEFAULT_FLOW_CONTROL_WAIT_NOTIFY_PERIOD = 5000L;
/**
* System property to control whether the client will declare queues during
* consumer creation when using BindingURLs.
*/
public static final String QPID_DECLARE_QUEUES_PROP_NAME = "qpid.declare_queues";
/**
* System property to control whether the client will declare exchanges during
* producer/consumer creation when using BindingURLs.
*/
public static final String QPID_DECLARE_EXCHANGES_PROP_NAME = "qpid.declare_exchanges";
/**
* System property to control whether the client will bind queues during
* consumer creation when using BindingURLs.
*/
public static final String QPID_BIND_QUEUES_PROP_NAME = "qpid.bind_queues";
public static final String VERIFY_QUEUE_ON_SEND = "qpid.verify_queue_on_send";
public static final String QPID_MAX_CACHED_ADDR_OPTION_STRINGS = "qpid.max_cached_address_option_strings";
public static final int DEFAULT_MAX_CACHED_ADDR_OPTION_STRINGS = 10;
/**
* System property to control whether the 0-8/0-9/0-9-1 client will set the message
* 'expiration' header using the computed expiration value (default, when false) or instead set
* it to the raw TTL (when true). May be necessary for interop with other vendors.
*/
public static final String SET_EXPIRATION_AS_TTL = "qpid.set_expiration_as_ttl";
/**
* System property to set a default value for a connection option 'ssl_verify_hostname'
*/
public static final String CONNECTION_OPTION_SSL_VERIFY_HOST_NAME = "qpid.connection_ssl_verify_hostname";
public static final boolean DEFAULT_CONNECTION_OPTION_SSL_VERIFY_HOST_NAME = true;
/**
* System property to set a default value for a connection option 'compress_messages'
*/
public static final String CONNECTION_OPTION_COMPRESS_MESSAGES = "qpid.connection_compress_messages";
public static final boolean DEFAULT_CONNECTION_OPTION_COMPRESS_MESSAGES = false;
/**
* System property to set a default value for a connection option 'message_compression_threshold_size'
*/
public static final String CONNECTION_OPTION_MESSAGE_COMPRESSION_THRESHOLD_SIZE = "qpid.message_compression_threshold_size";
public static final int DEFAULT_MESSAGE_COMPRESSION_THRESHOLD_SIZE = 102400;
public static final String ADDR_SYNTAX_SUPPORTED_IN_0_8 = "qpid.addr_syntax_supported";
public static final boolean DEFAULT_ADDR_SYNTAX_0_8_SUPPORT = true;
/**
* Before 0.30, when using AMQP 0-8..0-9-1 requesting queue depth (AMQSession#getQueueDepth) for a queue that
* did not exist resulted in AMQChannelException. From 0.30 forward, 0 is returned in common with 0-10
* behaviour.
*
* Setting this system property true restores the old behaviour. It also avoids the isBound with a null exchange
* that causes an error in the Apache Qpid Broker-J (0.28 and earlier).
*/
public static final String QPID_USE_LEGACY_GETQUEUEDEPTH_BEHAVIOUR = "qpid.use_legacy_getqueuedepth_behavior";
private volatile static boolean _loaded;
static
{
ensureIsLoaded();
}
public static synchronized void ensureIsLoaded()
{
if (!_loaded)
{
CommonProperties.ensureIsLoaded();
Properties props = new Properties();
String initialProperties = System.getProperty("qpid.client_properties_file");
URL initialPropertiesLocation = null;
try
{
if (initialProperties == null)
{
initialPropertiesLocation = ClientProperties.class.getClassLoader().getResource("qpid-client.properties");
}
else
{
initialPropertiesLocation = (new File(initialProperties)).toURI().toURL();
}
if (initialPropertiesLocation != null)
{
props.load(initialPropertiesLocation.openStream());
}
}
catch (MalformedURLException e)
{
LOGGER.warn("Could not open client properties file '" + initialProperties + "'.", e);
}
catch (IOException e)
{
LOGGER.warn("Could not open client properties file '" + initialPropertiesLocation + "'.", e);
}
Set<String> propertyNames = new HashSet<>(props.stringPropertyNames());
propertyNames.removeAll(System.getProperties().stringPropertyNames());
for (String propName : propertyNames)
{
System.setProperty(propName, props.getProperty(propName));
}
_loaded = true;
}
}
private ClientProperties()
{
//No instances
}
}