| /* 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 |
| } |
| } |