
com.sun.messaging.jmq.jmsserver.config.BrokerConfig Maven / Gradle / Ivy
/*
* Copyright (c) 2000, 2017 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2021, 2024 Contributors to the Eclipse Foundation
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/
package com.sun.messaging.jmq.jmsserver.config;
import java.util.*;
import java.io.*;
import com.sun.messaging.jmq.util.log.Logger;
import com.sun.messaging.jmq.jmsserver.util.*;
import com.sun.messaging.jmq.jmsserver.resources.BrokerResources;
import com.sun.messaging.jmq.jmsserver.comm.CommGlobals;
/**
* This is a singleton class which contains the configuration information for the broker
*
*
* Configuration information can be obtained from several different sources:
*
* - cluster (or multi-broker) configuration
* - default (as shipped) configuration
* - installation configuration (default properties for any broker which runs on that installation regardless of the
* host or port)
* - instance specific properties (properties for a specific running instance of the broker)
*
*
* The default and installation properties will ALWAYS be retrieved from property files which are located in the
* installation. Cluster and instance properties will, by default , be retrieve from files but may also be retrieve from
* another method (e.g. jndi).
*
*
* This class is a subclass of UpdateProperties which is a basic class which handles maintaining a list of changed
* properties and calling any registered listeners which a properties is changed.
*
*
* The code to handle loading cluster and instance specific properties is handled by a seperate class which implements
* ConfigStore. This allows different mechanisms to be plugged in to load those properties. The class used is determined
* by the property value for "imq.config.class".
*
*
* Property Syntax
*
* All iMQ properties will be of the form:
*
{@literal imq.[.instance].property=value[,value1] }
Where:
*
*
* - area is the general area the property controls e.g. protocol
* - instance is used to define where the property is used (for something like thread pool size which may be
* used in several areas). This should heirarchically define where the property is used
* - property is the string name of the configuration property
* - value is the value of the property (which may be an , seperated list of entries)
*
*
*
e.g.
* imq.protocol.list=tcp,http imq.protocol.tcp.list=normal,admin imq.protocol.http.list=normal
* imq.protocol.tcp.normal.threadpool.min=5 imq.protocol.tcp.normal.threadpool.max=10 imq.protocol.tcp.normal.port=2682
* imq.protocol.tcp.admin.threadpool.min=1 imq.protocol.tcp.admin.threadpool.max=2 imq.protocol.tcp.admin.port=555
* imq.protocol.http.normal.threadpool.min=15 imq.protocol.http.normal.threadpool.max=20
* imq.protocol.http.normal.port=8080
*
*
*
* Classes which use this configuration object need to be careful to ONLY use this at object creation or when an update
* has occurred (because it has a high overhead)
*
*
* @see java.util.Properties
* @see com.sun.messaging.jmq.jmsserver.config.ConfigListener
* @see com.sun.messaging.jmq.jmsserver.config.PropertyUpdateException
* @see com.sun.messaging.jmq.jmsserver.config.WatchedProperty
* @see "http://jpgserv.eng/JMQ20/engineering/details/broker/b_config.txt"
*/
/*
* XXX - Linda - 7/18/00 REVISIT TO DO: * add code to handle boolean flag setting * look at adding support for having a
* "template" properties (optional) * look at wild card support (optional)
*/
/*
* ######################################################################3 PROPERTY DESCRIPTIONS
* ######################################################################3
*
* PLEASE ADD ANY NEW PROPERTIES TO THIS LIST IN FUTURE RELEASES
*
* Properties are broker into two categories: Public/Private - properties mentioned in the defaults.properties file
* Secret properties - properties which are only found here
*
* All normal properties should be listed here (if possible) to provide a single point for engineers to look for all
* properties (whether public/private or secret)
*
*
* NOTE: if no properties are found (this is the only property file)
*
* * the list of active Services will be -> jms and admin * the persistent store used will be file * error/info will be
* logged to the console & ERROR/WARNING/INFO will be logged to the file
*/
/*
* PROPERTY INFORMATION
*
* // PUBLIC PROPERTIES // ------------------------------- //
*
* // Connection Services Settings
*
*
* // General Connection Services
*
* // List of active services, started at startup imq.service.activelist=jms,admin,httpjms
*
* imq.service.activelist=jms,admin // only set minimal properties
*
* // Connection Service Specific Settings
*
*
* // Some properties settings below are described in other sections of this file.
*
* // Information about thread pool settings: // min is the minimum number of threads in the system, the number MUST be
* even. // max is the maximum of threads in the system, the number MUST be even. // shared is the property to switch
* between the new weighted thread pool code // and the old thread pool code (which may not be available after beta). //
* Setting this property to true, turns on the weighted thread pool behavior. // On either setting, the system will act
* identically IF the number of // current connections < max threads
*
* // jms connection service imq.jms.protocoltype=tcp imq.jms.servicetype=NORMAL imq.jms.tcp.port=0
* imq.jms.tcp.hostname= imq.jms.tcp.backlog=100 imq.jms.tcp.blocking=true imq.jms.tcp.useChannels=false
* imq.jms.min_threads=10 imq.jms.max_threads=1000 imq.jms.threadpool_model=dedicated
*
* // jmsdirect connection service imq.jmsdirect.servicetype=NORMAL imq.jmsdirect.handler_name=jmsdirect
*
* // MQ direct connection service imq.mqdirect.servicetype=NORMAL imq.mqdirect.min_threads=10
* imq.mqdirect.max_threads=1000 imq.mqdirect.threadpool_model=dedicated
*
* // MQ direct connection service (2) imq.mqdirect2.servicetype=NORMAL
*
* // ssljms connection service // NOTE: ssljms is not active in the fallback case imq.ssljms.protocoltype=tls
* imq.ssljms.servicetype=NORMAL imq.ssljms.tls.port=0 imq.ssljms.tls.hostname= imq.ssljms.tls.backlog=100
* imq.ssljms.tcp.blocking=true imq.ssljms.tcp.useChannels=false imq.ssljms.min_threads=10 imq.ssljms.max_threads=500
* imq.ssljms.threadpool_model=dedicated
*
* // configuration for the keystore used by the ssl service imq.keystore.file.dirpath=${imq.etchome}
* imq.keystore.file.name=keystore imq.keystore.password= imq.passfile.enabled=false imq.passfile.dirpath=${imq.etchome}
* imq.passfile.name=keypassfile
*
* // admin connection service imq.admin.protocoltype=tcp imq.admin.servicetype=ADMIN imq.admin.tcp.port=0
* imq.admin.tcp.backlog=5 imq.admin.tcp.blocking=true imq.admin.tcp.useChannels=false imq.admin.min_threads=4
* imq.admin.max_threads=10 imq.admin.threadpool_model=dedicated
*
* // ssladmin connection service // NOTE: ssladmin is not active in the fallback case imq.ssladmin.protocoltype=tls
* imq.ssladmin.servicetype=ADMIN imq.ssladmin.tls.port=0 imq.ssladmin.tls.hostname= imq.ssladmin.tls.backlog=5
* imq.ssladmin.tcp.blocking=true imq.ssladmin.tcp.useChannels=false imq.ssladmin.min_threads=4
* imq.ssladmin.max_threads=10 imq.ssladmin.threadpool_model=dedicated
*
* // httpjms connection service
*
* // NOTE: httpjms is not active in the fallback case
*
* imq.httpjms.protocoltype=http imq.httpjms.servicetype=NORMAL imq.httpjms.http.servletHost=localhost
* imq.httpjms.http.servletPort=7675 imq.httpjms.http.pullPeriod=-1 imq.httpjms.http.connectionTimeout=300
* imq.httpjms.min_threads=10 imq.httpjms.max_threads=500 imq.httpjms.threadpool_model=dedicated
*
* // httpsjms connection service (ssl communication with servlet)
*
* imq.httpsjms.protocoltype=https imq.httpsjms.servicetype=NORMAL imq.httpsjms.https.servletHost=localhost
* imq.httpsjms.https.servletPort=7674 imq.httpsjms.https.pullPeriod=-1 imq.httpjms.http.connectionTimeout=300
* imq.httpsjms.min_threads=10 imq.httpsjms.max_threads=500
*
* // Supported Protocols
*
*
* // Buffer Size // Set the per connection input and output buffer sizes in bytes. // For the output buffer this
* basically affects per packet buffering, so // having a value larger than your largest packet size may not improve //
* performance much. // For the input buffer this can affect buffering accross packets as // well, depending on the
* situation. // Set to 0 to turn off buffering.
*
* // Only tcp is used in the true fallback case
*
* imq.protocol.tcp.inbufsz=2048 imq.protocol.tcp.outbufsz=2048 imq.protocol.tls.inbufsz=2048
* imq.protocol.tls.outbufsz=2048 imq.protocol.http.inbufsz=2048 imq.protocol.http.outbufsz=2048
* imq.protocol.https.inbufsz=2048 imq.protocol.https.outbufsz=2048
*
* // No Delay Flags // this turns off the Nagle's algorithm for socket (turns on TCPNoDelay) // Nagles algorithm speeds
* up performance on low band-width systems // but lowers performance on most systems.
*
* // In most configuration, no delay should be true // (Nagle's algorithm should be off)
*
* // This flag is only applicable on protocols running over tcp // (this includes the tcp, and tls )
* imq.protocol.tcp.nodelay=true imq.protocol.tls.nodelay=true imq.protocol.http.nodelay=true
* imq.protocol.https.nodelay=true
*
* // JMX Connector Settings imq.jmx.usePlatformMBeanServer=true imq.jmx.rmiregistry.start=false
* imq.jmx.rmiregistry.use=false imq.jmx.connector.list=jmxrmi,ssljmxrmi imq.jmx.connector.activelist=jmxrmi
* imq.jmx.connector.ssljmxrmi.useSSL=true
*
* // Portmapper Settings
*
*
* // Configuration for portmapper imq.portmapper.port=7676 imq.portmapper.bind=true imq.portmapper.backlog=50
* imq.portmapper.sotimeout=500 // Linger on close in seconds, -1 will not set linger. imq.portmapper.solinger=5
*
*
* // Message Router Settings
*
*
* // Memory reclamation period
*
*
* // The message expiration timeout value determines how often (in // seconds) the reaper thread will look at the
* current expiration // value for JMS messages imq.message.expiration.interval=60
*
* // Message limits: broker
*
*
* // When these limits are reached, new messages received by broker are rejected // until the system is below these
* limits
*
* // Count limit (a value of -1 indicates no limit) imq.system.max_count=-1
*
* // Size limit (a value of -1 indicates no limit) // To indicate a value other than bytes, an argument [m, k, b] can
* be added // 1m-> 1meg // 1k -> 1 Kbytes // 1b -> 1 byte imq.system.max_size=-1
*
* // Individual message limits
*
*
* // This sets a limit on the maximum size of ANY message body (in Kbytes)
*
* // Size limit (a value of -1 indicates no limit) // To indicate a value other than bytes, an argument [m, k, b] can
* be added // 1m-> 1meg // 1k -> 1 Kbytes // 1b -> 1 byte imq.message.max_size=-1
*
*
*
* // Persistence Settings
*
*
* // Type of data store
*
*
* // Both file-based and JDBC-based persistence is currently supported. File-based // is the default. (Set the value to
* jdbc for JDBC-based persistence. imq.persist.store=file
*
* // File-based store
*
*
* // The percentage of files in the pool that are kept in a clean state // while the broker is running. Any files left
* in a dirty state must be // cleaned up at shutdown. A high value keeps the file pool in a clean // state which allows
* the broker to shutdown quickly but slows down the // performance of the file pool somewhat. A low value improves the
* speed // of the filepool, but may result in the broker taking longer to shutdown. // Default: 60 percent
* imq.persist.file.message.filepool.cleanratio=60
*
* // Control whether the message store is 'cleaned up' when the broker exits. // If the store is to be "cleaned" then
* the broker will truncate all // message files to the appropriate size at exit. For files that contain // message data
* this will be the size of the message data. For files that // contain deleted messages this would be 0. // This does
* not control whether the VR message file is compacted. imq.persist.file.message.cleanup=true
*
* // Initial size of VR message file for destinations. imq.persist.file.message.vrfile.initial_size=1m
*
* // block size of the VR message file imq.persist.file.message.vrfile.block_size=256
*
* // Maximum size of a message that will be stored in the VR message // file. Messages that are bigger than this size
* will be stored in its // own files imq.persist.file.message.max_record_size=1m
*
* // Maximum number of files in the file pool per destination used by the // file based message store. The larger the
* pool the faster the broker // can process large numbers of persistent messages at the expense of disk // space. // If
* the capacity of the file pool is exceeded, the broker will create // and delete files as needed to process persistent
* messages. // Default: 100 files imq.persist.file.destination.message.filepool.limit=100
*
*
* // JDBC-based store
*
*
* // Vendor specific JDBC driver. imq.persist.jdbc.driver=
*
* // Vendor specific database url to get a database connection. imq.persist.jdbc.opendburl=
*
* // An identifier to make database table names unique per broker. // If specified, this identifier will be appended to
* database tables // names to make them unique in the case where more than one broker // is persisting data in the same
* database // The specified value should contain alphanumeric characters only. // The length of the identifier should
* not exceed the maximum length // of a table name allowed in the database minus 12. // (12 is the length of table name
* reserved for iMQ's internal use.) imq.persist.jdbc.brokerid=
*
* // Vendor specific url to create a database. // This is an optional property. Should be specified if the database
* will // need to be created using imqdbmgr. imq.persist.jdbc.createdburl=
*
* // Vendor specific database url to shutdown the connection. // This is an optional property. Should be specified if
* the database needs // to be shutdown explicitly. If specified, // java.sql.DriverManager.getConnection() will be
* called with the specified // url at broker shutdown. imq.persist.jdbc.closedburl=
*
* // User name used to open database connection. // This is an optional property. The value can also be specified by
* command // line opton for imqbroker and imqdbmgr. imq.persist.jdbc.user=
*
* // Specify whether the broker should prompt the user for a password for // database access. // This is an optional
* property. It should be set to true if the database // requires a password and the password is not provided by other
* means imq.persist.jdbc.needpassword=[true|false]
*
* // properties defining the database schema imq.persist.jdbc.table.IMQSV35=
* imq.persist.jdbc.table.IMQCCREC35= imq.persist.jdbc.table.IMQDEST35= imq.persist.jdbc.table.IMQINT35=
* imq.persist.jdbc.table.IMQMSG35= imq.persist.jdbc.table.IMQPROPS35= imq.persist.jdbc.table.IMQILIST35=
* imq.persist.jdbc.table.IMQTXN35= imq.persist.jdbc.table.IMQTACK35=
*
* // Security Settings
*
*
* // Authentication Type
*
*
* // You can specify two types of authentication: basic and digest.
*
* // basic imq.authentication.basic.user_repository=file
*
* // digest (value of this property should not be changed from file) imq.authentication.digest.user_repository=file
*
* // You can specify authentication for all connection services or // on a service-by-service basis. Individual service
* settings override // system settings. imq.authentication.type=digest
*
* // Authentication Timeout
*
*
* // timeout in seconds in waiting for client hello and response to // authentication request on a connection
* imq.authentication.client.response.timeout=180
*
* // User Repository
*
*
* // You can define access to two types of user repositories: file-based and LDAP.
*
* // File-based (file) user repository: imq.user_repository.file.dirpath=${imq.etchome}
* imq.user_repository.file.filename=passwd
*
* // LDAP user repository (only supported for basic authentication type) // The following properties are an example
* setup (please configure)
*
*
* imq.user_repository.ldap.server=host:port imq.user_repository.ldap.principal= imq.user_repository.ldap.password=
* imq.user_repository.ldap.base=ou=people, o=foobar.com imq.user_repository.ldap.uidattr=uid
* imq.user_repository.ldap.usrformat= imq.user_repository.ldap.usrfilter= imq.user_repository.ldap.grpsearch=false
* imq.user_repository.ldap.grpbase=ou=groups, o=foobar.com imq.user_repository.ldap.gidattr=cn
* imq.user_repository.ldap.memattr=uniquemember imq.user_repository.ldap.grpfilter=
* imq.user_repository.ldap.ssl.enabled=false
* imq.user_repository.ldap.ssl.socketfactory=com.sun.messaging.jmq.jmsserver.auth.ldap.TrustSSLSocketFactory
*
* // (search in seconds) imq.user_repository.ldap.timeout=180
*
* // Access Control
*
*
* // Enable authorization (access control) // You can enable access control for all connection services or // on a
* service-by-service basis. Individual service settings override // system settings. imq.accesscontrol.enabled=true
* imq.accesscontrol.type=file
*
* // You can currently specify only file-based access control.
*
* // File-based (file) access control imq.accesscontrol.file.dirpath=${imq.etchome}
* imq.accesscontrol.file.filename=accesscontrol.properties
*
* // audit service configuration imq.audit.enabled=false
*
* // Logger Settings
*
*
* // Log Level
*
*
* // Only messages >= this level will get passed on to output channels (LogHandlers). // The categories used in normal
* operation of the broker from highest // level to lowest are: ERROR, WARNING, INFO. You may specify NONE to // turn
* off logging. .level=INFO
*
* // Output Channels (LogHandlers)
*
*
* // All Output Channels (LogHandlers) write out messages based on specific // categories. Valid categories are ALL to
* select all messages, NONE // to select no message or a comma (",") separated list of // ERROR, WARNING, INFO.
*
* // Specify supported and needed LogHandlers // Supported Handles are java.util.logging.FileHandler,
* java.util.logging.ConsoleHandler,
*
* // Old imq.log.handlers=file,console,destination,syslog,jmx handlers=java.util.logging.FileHandler,
* java.util.logging.ConsoleHandler, com.sun.messaging.jmq.jmsserver.service.DestinationLogHandler,
* com.sun.messaging.jmq.util.log.SysLogHandler, com.sun.messaging.jmq.jmsserver.management.agent.JMXLogHandler //
* FileLogHandler settings. // The FileLogHandler logs messages to a set of rolling files. // The rollover criteria can
* be the file size (bytes) and/or // the file age (seconds). 0 means don't rollover based on that criteria.File age is
* currently not supported. // java.util.logging.FileHandler.level specifies the default level for the Handler (defaults
* to Level.ALL). // java.util.logging.FileHandler.filter specifies the name of a Filter class to use (defaults to no
* Filter). // java.util.logging.FileHandler.formatter specifies the name of a Formatter class to use (defaults to
* java.util.logging.XMLFormatter) // java.util.logging.FileHandler.encoding the name of the character set encoding to
* use (defaults to the default platform encoding). // java.util.logging.FileHandler.limit specifies an approximate
* maximum amount to write (in bytes) to any one file. If this is zero, then there is no limit. (Defaults to no limit).
* // java.util.logging.FileHandler.count specifies how many output files to cycle through (defaults to 1). //
* java.util.logging.FileHandler.pattern specifies a pattern for generating the output file name. See below for details.
* (Defaults to "%h/java%u.log"). // java.util.logging.FileHandler.append specifies whether the FileHandler should
* append onto any existing files (defaults to false). java.util.logging.FileHandler.level=ALL
* java.util.logging.FileHandler.formatter=com.sun.messaging.jmq.util.log.UniformLogFormatter
* java.util.logging.FileHandler.limit=268435456
* java.util.logging.FileHandler.pattern=${imq.instanceshome}${/}${imq.instancename}${/}log${/}server.log
*
* // Console settings. // The console handler logs messages to an OutputStream. This can either be // System.err (ERR)
* or System.out (OUT). java.util.logging.ConsoleHandler.formatter=com.sun.messaging.jmq.util.log.UniformLogFormatter
* java.util.logging.ConsoleHandler.level=WARNING
*
* // Syslog settings. // The syslog handler logs messages to syslog on UNIX. imq.log.syslog.facility=LOG_DAEMON
* imq.log.syslog.logpid=true imq.log.syslog.logconsole=false imq.log.syslog.identity=imqbrokerd_${imq.instancename}
* imq.log.syslog.output=ERROR
*
* // Destination log handler settings. // The destination handler logs messages to a topic (mq.log.broker)
* imq.log.destination.output=ERROR|WARNING imq.log.destination.timetolive=300 imq.log.destination.persist=false
*
* // JMX log handler settings // The jmx log handler exposes log messages as JMX notifications imq.log.jmx.output=ALL
*
* // Metrics settings
*
*
* // These settings enable metric counting in the broker and set the // time interval (in seconds) // at which the
* broker will generate a metrics report. 0 means no report. imq.metrics.enabled=true imq.metrics.interval=0
*
* // Properties for configuring the behaviout of metrics obtained // via the JMS monitoring API
* imq.metrics.topic.enabled=true imq.metrics.topic.interval=60 imq.metrics.topic.persist=false
* imq.metrics.topic.timetolive=300
*
*
*
* // Destination Management Settings
*
*
* // autocreate for topics should always be true imq.autocreate.topic=true
*
* // autocreate for queues should default to false after EA imq.autocreate.queue=true
*
* //max active/failover counts for autocreated queues imq.autocreate.queue.maxNumActiveConsumers=-1
* imq.autocreate.queue.maxNumBackupConsumers=0
*
* // default queue delivery policy (for auto-create queues) // Choices are: // single - standard single queue receiver
* queues // failover - failover // round-robin imq.queue.deliverypolicy=single
*
* // defines the number of messages queued at a time to a receiver // on a round robin queue
* imq.queue.rr.messageblock=5
*
*
* // Miscellaneous Settings
*
*
* // Exit code Broker uses when it is exiting due to a restart imq.restart.code=255
*
*
* // SECRET PROPERTIES (WILL BE REMOVED BY FCS)
*
*
* // list of supported protocols imq.protocol.list=tcp,tls,http,https
*
* // List of available system services (may be needed by admin)
* imq.service.list=jms,admin,ssljms,httpjms,httpsjms,ssladmin,mqdirect,mqdirect2
*
* // authentication classes/properties imq.authentication.basic.properties=class,user_repository
* imq.authentication.basic.class=com.sun.messaging.jmq.jmsserver.auth.JMQBasicAuthenticationHandler
* imq.authentication.digest.properties=class,user_repository
* imq.authentication.digest.class=com.sun.messaging.jmq.jmsserver.auth.JMQDigestAuthenticationHandler
*
* // user_repository classes/properties
* imq.user_repository.file.properties=class,filename,userPrincipalClass,groupPrincipalClass,dirpath
* imq.user_repository.file.class=com.sun.messaging.jmq.jmsserver.auth.file.JMQFileUserRepository
* imq.user_repository.ldap.properties=class,server,principal,password,base,uidattr,usrformat,usrfilter,grpsearch,
* grpbase,gidattr,memattr,grpfilter,timeout,ssl.enabled,ssl.socketfactory,userPrincipalClass, groupPrincipalClass
* imq.user_repository.ldap.class=com.sun.messaging.jmq.jmsserver.auth.ldap.LdapUserRepository
*
* // accesscontrol classes/properties imq.accesscontrol.file.properties=class,filename,dirpath
* imq.accesscontrol.file.class=com.sun.messaging.jmq.jmsserver.auth.acl.JMQFileAccessControlModel
*
* imq.accesscontrol.jaas.properties=class,permissionFactory,policyProvider
* imq.accesscontrol.jaas.class=com.sun.messaging.jmq.jmsserver.auth.acl.JAASAccessControlModel
*
* // logging classes imq.log.file.class=com.sun.messaging.jmq.util.log.FileLogHandler
* imq.log.console.class=com.sun.messaging.jmq.util.log.StreamLogHandler
* imq.log.syslog.class=com.sun.messaging.jmq.util.log.SysLogHandler
* imq.log.destination.class=com.sun.messaging.jmq.jmsserver.service.DestinationLogHandler
* imq.log.jmx.class=com.sun.messaging.jmq.jmsserver.management.agent.JMXLogHandler
*
* // Class/properties of supported protocols
*
* imq.protocol.tcp.propertylist=port,backlog,useChannels,blocking
* imq.protocol.tcp.class=com.sun.messaging.jmq.jmsserver.net.tcp.TcpProtocol
*
* imq.protocol.tls.propertylist=port,backlog,keystore,,useChannels,blocking
* imq.protocol.tls.class=com.sun.messaging.jmq.jmsserver.net.tls.TLSProtocol
*
* imq.protocol.http.propertylist=servletHost,servletPort,pullPeriod,connectionTimeout,useChannels,blocking
* imq.protocol.http.class=com.sun.messaging.jmq.jmsserver.net.http.HTTPProtocol
*
* // not exposed yet; we'll always trust the servlet host for now jms.httpsjms.https.isHostTrusted=true
* imq.protocol.https.propertylist=servletHost,servletPort,pullPeriod,connectionTimeout,sHostTrusted
* imq.protocol.https.class=com.sun.messaging.jmq.jmsserver.net.https.HttpsProtocol
*
* // Class for creating standard services
* imq.service_handler.dedicated.class=com.sun.messaging.jmq.jmsserver.service.imq.dedicated.DedicatedServiceFactory
* imq.service_handler.shared.class=com.sun.messaging.jmq.jmsserver.service.imq.assigned.AssignedServiceFactory
* imq.service_handler.group.class=com.sun.messaging.jmq.jmsserver.service.imq.group.GroupServiceFactory
* imq.service_handler.direct.class=com.sun.messaging.jmq.jmsserver.service.imq.IMQDirectServiceFactory
* imq.service_handler.mqdirect.class=com.sun.messaging.jmq.jmsserver.service.imq.IMQEmbeddedServiceFactory
* imq.service_handler.mqdirect2.class=com.sun.messaging.jmq.jmsserver.service.imq.IMQDualThreadServiceFactory
*
* // Debug properties
*
* // Format is: imq.debug.=true|false // Note: To see debug messages the log level
* must be set to // DEBUG, DEBUGMED or DEBUGHIGH imq.debug.com.sun.messaging.jmq.jmsserver.multibroker.RouteTable=false
* imq.debug.com.sun.messaging.jmq.jmsserver.persist.api.Store=false
*
* // packet tracking code (turns on additional information on packets through // the system)
*
* imq.dump.packet.debug=false imq.dump.packet.debugall=false
*
* // Reference Tracking:
*
* // track information on all packet references and dump the information when // the packet is destroyed (very
* memory/time intensive) imq.debug.packet.pktdebug_all
*
* // track information on all packet references and dump the information when // an exception is received (very
* memory/time intensive) imq.debug.packet.pktdebug
*
* // PERSISTENCE
*
* // control whether to sync all persistent operations, including those that // truncate a file or tag a file 'FREE'
* imq.persist.file.sync.all=false
*
* // the class instantiated for a specific type of store // imq.persist..class
*
*
* // SERVICES
*
* // A service controls the connections between clients and how // those clients are processed (threading model)
*
* // In the 2.0 release, only one type of service (standard) which // has a protocol and two threadpools (input and
* output) is supported.
*
* // However, the infrastructure is designed to allow other models to // be plugged into the system.
*
* // The service has several pieces: // Service -> the actual service class, handles accepting "connections" // from a
* client and creating Connection objects // Connection-> an abstract class which represents a JMS connection //
* ServiceHandler -> a class which controls monitoring, creating // and updating properties on a service //
* ServiceManager -> the class that creates services
*
* // the creating and access of a service is controled through properties
*
* // the class instanciated for a specific service handler
*
* // imq.service_handler..class
*
* // the handler used for a specific service
*
* // imq..service_handler
*
* // the list of all available services in the system (may be used // by admin in the future
*
* imq.service.list=jms,admin,httpjms,ssljms,httpsjms,ssladmin
*
* // the list of currently "active" services imq.service.activelist=jms,admin
*
* // type of service (NORMAL or ADMIN) // imq..servicetype
*
* // imq.service.jms.servicetype=NORMAL // imq.service.ssljms.servicetype=NORMAL // imq.service.admin.servicetype=ADMIN
* // imq.service.httpjms.servicetype=NORMAL // imq.service.httpsjms.servicetype=NORMAL //
* imq.service.ssladmin.servicetype=ADMIN
*
* // The following properties can be configured for a standard service
*
* // imq..threadpool.is_shared // imq..threadpool.shared_percent //
* imq..threadpool.priority // imq...
*
* // imq.protocol..propertylist // imq.protocol..class // imq..protocoltype
* // imq..min_threads // imq..max_threads // imq...nodelay //
* imq...inbufsz
*
*
* // MEMORY management properties
*
* imq.memory.levels=green,yellow,orange,red imq.memory.gcdelta=1024 imq.memory.hysteresis=1024
* imq.memory.overhead=10240 imq.green.threshold=0 imq.green.count=50000 imq.green.gccount=0 imq.green.gcitr=0
* imq.green.classname=com.sun.messaging.jmq.jmsserver.memory.levels.Green imq.yellow.seconds=5 imq.yellow.threshold=60
* imq.yellow.classname=com.sun.messaging.jmq.jmsserver.memory.levels.Yellow imq.yellow.count=50 imq.yellow.gccount=1
* imq.yellow.gcitr=1000 imq.yellow.seconds=2 imq.orange.threshold=70
* imq.orange.classname=com.sun.messaging.jmq.jmsserver.memory.levels.Orange imq.orange.count=1 imq.orange.gccount=5
* imq.orange.gcitr=100 imq.orange.seconds=1 imq.red.threshold=80
* imq.red.classname=com.sun.messaging.jmq.jmsserver.memory.levels.Red imq.red.count=0 imq.red.gccount=10
* imq.red.gcitr=5 imq.red.seconds=10
*
*/
public class BrokerConfig extends UpdateProperties {
private static final long serialVersionUID = 8067470983633403256L;
private static final String IMQ = CommGlobals.IMQ;
// Version information for property files.
// imq.config.version is set in the default.properties file
// imq.instanceconfig.version is set in the instance config.properties
// when it is first created.
public static final String CONFIG_VERSION_PROP = IMQ + ".config.version";
public static final String INSTANCECONFIG_VERSION_PROP = IMQ + ".instanceconfig.version";
public static final String CONFIG_VERSION = "300";
/**
* this is the set of Fallback properties (properties to use if none of the property files can be used). Fallback
* properties are now always loaded (since secret properties may be set here)
*/
private static final String JMQ_FallbackProperties = IMQ + ".service.activelist=jms,admin\n" // only set minimal properties
+ IMQ + ".jms.protocoltype=tcp\n" + IMQ + ".jms.servicetype=NORMAL\n" + IMQ + ".jms.tcp.port=0\n" + IMQ + ".jms.tcp.backlog=100\n" + IMQ
+ ".jms.tcp.blocking=true\n" + IMQ + ".jms.tcp.useChannels=false\n" + IMQ + ".jms.min_threads=10\n" + IMQ + ".jms.max_threads=1000\n" + IMQ
+ ".jms.threadpool_model=dedicated\n" + IMQ + ".jmsdirect.servicetype=NORMAL\n" + IMQ + ".jmsdirect.handler_name=direct\n" + IMQ
+ ".mqdirect.servicetype=NORMAL\n" + IMQ + ".mqdirect.threadpool_model=dedicated\n" + IMQ + ".mqdirect.min_threads=10\n" + IMQ
+ ".mqdirect.max_threads=1000\n" + IMQ + ".mqdirect.handler_name=mqdirect\n" + IMQ + ".mqdirect2.servicetype=NORMAL\n" + IMQ
+ ".mqdirect2.handler_name=mqdirect2\n" + IMQ + ".wsjms.servicetype=NORMAL\n" + IMQ + ".wsjms.handler_name=websocket\n" + IMQ
+ ".wsjms.min_threads=10\n" + IMQ + ".wsjms.max_threads=1000\n" + IMQ + ".wsjms.protocoltype=ws\n" + IMQ + ".wsjms.ws.port=7670\n" + IMQ
+ ".wsjms.services=mqjms,mqstomp,mqjsonstomp\n" + IMQ + ".wssjms.servicetype=NORMAL\n" + IMQ + ".wssjms.handler_name=websocket\n" + IMQ
+ ".wssjms.min_threads=10\n" + IMQ + ".wssjms.max_threads=1000\n" + IMQ + ".wssjms.protocoltype=wss\n" + IMQ + ".wssjms.wss.port=7671\n" + IMQ
+ ".wssjms.services=mqjms,mqstomp,mqjsonstomp\n" + IMQ + ".ssljms.protocoltype=tls\n" + IMQ + ".ssljms.servicetype=NORMAL\n" + IMQ
+ ".ssljms.tls.port=0\n" + IMQ + ".ssljms.tls.backlog=100\n" + IMQ + ".ssljms.tcp.blocking=true\n" + IMQ + ".ssljms.tcp.useChannels=false\n" + IMQ
+ ".ssljms.min_threads=10\n" + IMQ + ".ssljms.max_threads=500\n" + IMQ + ".ssljms.threadpool_model=dedicated\n" + IMQ
+ ".keystore.file.dirpath=${imq.etchome}\n" + IMQ + ".keystore.file.name=keystore\n" + IMQ + ".keystore.password=\n" + IMQ
+ ".passfile.enabled=false\n" + IMQ + ".passfile.dirpath=${imq.etchome}\n" + IMQ + ".passfile.name=keypassfile\n" + IMQ
+ ".admin.protocoltype=tcp\n" + IMQ + ".admin.servicetype=ADMIN\n" + IMQ + ".admin.tcp.port=0\n" + IMQ + ".admin.tcp.backlog=5\n" + IMQ
+ ".admin.tcp.blocking=true\n" + IMQ + ".admin.tcp.useChannels=false\n" + IMQ + ".admin.min_threads=4\n" + IMQ + ".admin.max_threads=10\n" + IMQ
+ ".admin.threadpool_model=dedicated\n" + IMQ + ".httpjms.protocoltype=http\n" + IMQ + ".httpjms.servicetype=NORMAL\n" + IMQ
+ ".httpjms.http.servletHost=localhost\n" + IMQ + ".httpjms.http.servletPort=7675\n" + IMQ + ".httpjms.http.pullPeriod=-1\n" + IMQ
+ ".httpjms.http.connectionTimeout=300\n" + IMQ + ".httpjms.tcp.blocking=true\n" + IMQ + ".httpjms.tcp.useChannels=false\n" + IMQ
+ ".httpjms.threadpool_model=dedicated\n" + IMQ + ".httpjms.min_threads=10\n" + IMQ + ".httpjms.max_threads=500\n" + IMQ
+ ".httpsjms.protocoltype=https\n" + IMQ + ".httpsjms.servicetype=NORMAL\n" + IMQ + ".httpsjms.https.servletHost=localhost\n" + IMQ
+ ".httpsjms.https.servletPort=7674\n" + IMQ + ".httpsjms.https.pullPeriod=-1\n" + IMQ + ".httpjms.http.connectionTimeout=300\n" + IMQ
+ ".httpsjms.https.isHostTrusted=true\n" + IMQ + ".httpsjms.min_threads=10\n" + IMQ + ".httpsjms.max_threads=500\n" + IMQ
+ ".httpsjms.threadpool_model=dedicated\n" + IMQ + ".ssladmin.protocoltype=tls\n" + IMQ + ".ssladmin.servicetype=ADMIN\n" + IMQ
+ ".ssladmin.tls.port=0\n" + IMQ + ".ssladmin.tls.backlog=5\n" + IMQ + ".ssladmin.tcp.blocking=true\n" + IMQ + ".ssladmin.tcp.useChannels=false\n"
+ IMQ + ".ssladmin.min_threads=4\n" + IMQ + ".ssladmin.max_threads=10\n" + IMQ + ".ssladmin.threadpool_model=dedicated\n" + IMQ
+ ".protocol.tcp.inbufsz=2048\n" + IMQ + ".protocol.tcp.outbufsz=2048\n" + IMQ + ".protocol.tls.inbufsz=2048\n" + IMQ
+ ".protocol.tls.outbufsz=2048\n" + IMQ + ".protocol.http.inbufsz=2048\n" + IMQ + ".protocol.http.outbufsz=2048\n" + IMQ
+ ".protocol.https.inbufsz=2048\n" + IMQ + ".protocol.https.outbufsz=2048\n" + IMQ + ".protocol.tcp.nodelay=true\n" + IMQ
+ ".protocol.tls.nodelay=true\n" + IMQ + ".protocol.http.nodelay=true\n" + IMQ + ".protocol.https.nodelay=true\n"
+ IMQ + ".jmx.usePlatformMBeanServer=true\n" + IMQ + ".jmx.rmiregistry.start=false\n" + IMQ + ".jmx.rmiregistry.use=false\n" + IMQ
+ ".jmx.connector.list=jmxrmi,ssljmxrmi\n" + IMQ + ".jmx.connector.activelist=jmxrmi\n" + IMQ + ".jmx.connector.ssljmxrmi.useSSL=true\n"
+ IMQ + ".portmapper.port=7676\n" + IMQ + ".portmapper.bind=true\n" + IMQ + ".portmapper.backlog=50\n" + IMQ + ".portmapper.sotimeout=500\n" + IMQ
+ ".portmapper.solinger=5\n" + IMQ + ".message.expiration.interval=60\n" + IMQ + ".system.max_count=-1\n" + IMQ + ".system.max_size=-1\n" + IMQ
+ ".message.max_size=-1\n" + IMQ + ".persist.store=file\n" + IMQ + ".persist.file.message.vrfile.threshold_factor=0\n" + IMQ
+ ".persist.file.message.vrfile.threshold=0\n" + IMQ + ".persist.file.message.vrfile.growth_factor=50\n" + IMQ
+ ".persist.file.message.vrfile.initial_size=1m\n" + IMQ + ".persist.file.message.vrfile.block_size=256\n" + IMQ
+ ".persist.file.message.max_record_size=1m\n" + IMQ + ".persist.file.message.filepool.cleanratio=60\n" + IMQ
+ ".persist.file.destination.message.filepool.limit=100\n" + IMQ + ".persist.file.message.cleanup=false\n" + IMQ
+ ".persist.file.destination.file.size=1m\n" + IMQ + ".authentication.basic.user_repository=file\n" + IMQ
+ ".authentication.digest.user_repository=file\n" + IMQ + ".authentication.type=digest\n" + IMQ + ".authentication.client.response.timeout=180\n"
+ IMQ + ".user_repository.file.filename=passwd\n" + IMQ + ".user_repository.file.dirpath=${imq.instanceshome}${/}${imq.instancename}${/}etc\n" + IMQ
+ ".user_repository.ldap.grpsearch=false\n" + IMQ + ".user_repository.ldap.ssl_enabled=false\n" + IMQ
+ ".user_repository.ldap.ssl.socketfactory=com.sun.messaging.jmq.jmsserver.auth.ldap.TrustSSLSocketFactory\n" + IMQ
+ ".user_repository.ldap.timeout=180\n" + IMQ + ".accesscontrol.enabled=true\n" + IMQ + ".accesscontrol.type=file\n" + IMQ
+ ".accesscontrol.file.dirpath=${imq.instanceshome}${/}${imq.instancename}${/}etc\n" + IMQ
+ ".accesscontrol.file.filename=accesscontrol.properties\n"
// Logging fallback properties are delared under Logger_FallbackProperties
// + ".level=INFO\n"
// + "handlers=java.util.logging.FileHandler, java.util.logging.ConsoleHandler, com.sun.messaging.jmq.jmsserver.management.agent.JMXLogHandler\n"
// + "java.util.logging.FileHandler.level=ALL\n"
// + "java.util.logging.FileHandler.formatter=com.sun.messaging.jmq.util.log.UniformLogFormatter\n"
// + "java.util.logging.FileHandler.limit=268435456\n"
// + "java.util.logging.FileHandler.pattern=${imq.instanceshome}${/}${imq.instancename}${/}log${/}log.txt\n"
// + "java.util.logging.ConsoleHandler.formatter=com.sun.messaging.jmq.util.log.UniformLogFormatter\n"
// + "java.util.logging.ConsoleHandler.level=INFO\n"
// + "imq.log.jmx.output=ALL\n"
+ IMQ + ".metrics.enabled=true\n" + IMQ + ".metrics.interval=0\n" + IMQ + ".metrics.topic.enabled=true\n" + IMQ + ".metrics.topic.interval=60\n"
+ IMQ + ".metrics.topic.persist=false\n" + IMQ + ".metrics.topic.timetolive=300\n" + IMQ + ".autocreate.topic=true\n" + IMQ
+ ".autocreate.queue=true\n" + IMQ + ".autocreate.queue.maxNumActiveConsumers=-1\n" + IMQ + ".autocreate.queue.maxNumBackupConsumers=0\n" + IMQ
+ ".queue.deliverypolicy=single\n" + IMQ + ".queue.rr.messageblock=5\n" + IMQ + ".restart.code=255\n" + IMQ + ".protocol.list=tcp\n" + IMQ
+ ".service.list=jms,admin,ssljms,httpjms,httpsjms,ssladmin,wsjms,wssjms\n" + IMQ + ".authentication.basic.properties=class,user_repository\n" + IMQ
+ ".authentication.basic.class=com.sun.messaging.jmq.jmsserver.auth.JMQBasicAuthenticationHandler\n" + IMQ
+ ".authentication.digest.properties=class,user_repository\n" + IMQ
+ ".authentication.digest.class=com.sun.messaging.jmq.jmsserver.auth.JMQDigestAuthenticationHandler\n" + IMQ
+ ".user_repository.file.properties=class,filename,userPrincipalClass,groupPrincipalClass,dirpath\n" + IMQ
+ ".user_repository.file.class=com.sun.messaging.jmq.jmsserver.auth.file.JMQFileUserRepository\n" + IMQ
+ ".user_repository.file.userPrincipalClass=com.sun.messaging.jmq.auth.jaas.MQUser\n" + IMQ
+ ".user_repository.file.groupPrincipalClass=com.sun.messaging.jmq.auth.jaas.MQGroup\n" + IMQ
+ ".user_repository.ldap.properties=class,server,principal,password,base,uidattr,usrformat,usrfilter,grpsearch,grpbase,gidattr,memattr,grpfilter,timeout,ssl.enabled,ssl.socketfactory,userPrincipalClass,groupPrincipalClass\n"
+ IMQ + ".user_repository.ldap.class=com.sun.messaging.jmq.jmsserver.auth.ldap.LdapUserRepository\n" + IMQ
+ ".user_repository.ldap.userPrincipalClass=com.sun.messaging.jmq.auth.jaas.MQUser\n" + IMQ
+ ".user_repository.ldap.groupPrincipalClass=com.sun.messaging.jmq.auth.jaas.MQGroup\n" + IMQ
+ ".user_repository.jaas.properties=class,name,userPrincipalClass,groupPrincipalClass,subjectHelperClass,subjectHelperClass.props\n" + IMQ
+ ".user_repository.jaas.class=com.sun.messaging.jmq.jmsserver.auth.jaas.UserRepositoryImpl\n" + IMQ
+ ".accesscontrol.file.properties=class,filename,dirpath,url\n" + IMQ
+ ".accesscontrol.file.class=com.sun.messaging.jmq.jmsserver.auth.acl.JMQFileAccessControlModel\n" + IMQ
+ ".accesscontrol.jaas.properties=class,permissionFactory,permissionFactoryProvide,policyProvider\n" + IMQ
+ ".accesscontrol.jaas.class=com.sun.messaging.jmq.jmsserver.auth.acl.JAASAccessControlModel\n" + IMQ
+ ".log.file.class=com.sun.messaging.jmq.util.log.FileLogHandler\n" + IMQ + ".log.console.class=com.sun.messaging.jmq.util.log.StreamLogHandler\n"
+ IMQ + ".log.syslog.class=com.sun.messaging.jmq.util.log.SysLogHandler\n" + IMQ
+ ".log.destination.class=com.sun.messaging.jmq.jmsserver.service.DestinationLogHandler\n" + IMQ + ".log.destination.topic=mq.log.broker\n" + IMQ
+ ".log.jmx.class=com.sun.messaging.jmq.jmsserver.management.agent.JMXLogHandler\n" + IMQ
+ ".protocol.tcp.propertylist=port,backlog,useChannels,blocking,hostname\n" + IMQ
+ ".protocol.tcp.class=com.sun.messaging.jmq.jmsserver.net.tcp.TcpProtocol\n" + IMQ
+ ".protocol.tls.propertylist=port,backlog,keystore,useChannels,blocking,hostname\n" + IMQ
+ ".protocol.tls.class=com.sun.messaging.jmq.jmsserver.net.tls.TLSProtocol\n" + IMQ
+ ".protocol.http.propertylist=servletHost,servletPort,pullPeriod,connectionTimeout,useChannels,blocking\n" + IMQ
+ ".protocol.http.class=com.sun.messaging.jmq.jmsserver.net.http.HTTPProtocol\n" + IMQ
+ ".protocol.https.propertylist=servletHost,servletPort,pullPeriod,connectionTimeout,isHostTrusted\n" + IMQ
+ ".protocol.https.class=com.sun.messaging.jmq.jmsserver.net.https.HttpsProtocol\n" + IMQ + ".protocol.ws.propertylist=port,hostname,backlog\n"
+ IMQ + ".protocol.wss.propertylist=port,hostname,backlog,requireClientAuth\n" + IMQ
+ ".service_handler.mqdirect.class=com.sun.messaging.jmq.jmsserver.service.imq.IMQEmbeddedServiceFactory\n" + IMQ
+ ".service_handler.mqdirect2.class=com.sun.messaging.jmq.jmsserver.service.imq.IMQDualThreadServiceFactory\n" + IMQ
+ ".service_handler.dedicated.class=com.sun.messaging.jmq.jmsserver.service.imq.dedicated.DedicatedServiceFactory\n" + IMQ
+ ".service_handler.shared_old.class=com.sun.messaging.jmq.jmsserver.service.imq.group.GroupServiceFactory\n" + IMQ
+ ".service_handler.group_old.class=com.sun.messaging.jmq.jmsserver.service.imq.group.GroupServiceFactory\n" + IMQ
+ ".service_handler.direct.class=com.sun.messaging.jmq.jmsserver.service.imq.IMQDirectServiceFactory\n" + IMQ
+ ".service_handler.shared.class=com.sun.messaging.jmq.jmsserver.service.imq.grizzly.GrizzlyIPServiceFactory\n" + IMQ
+ ".service_handler.websocket.class=com.sun.messaging.jmq.jmsserver.service.imq.websocket.WebSocketIPServiceFactory\n" + IMQ
+ ".selectors.limit=16\n" + IMQ + ".cluster.port=0\n" + IMQ + ".cluster.masterbroker.enforce=true\n" + IMQ + ".cluster.locktimeout=60\n" + IMQ
+ ".cluster.sharecc.persist=jdbc\n" + IMQ + ".cluster.sharecc.persistCreate=true\n" + IMQ + ".memory.levels=green,yellow,orange,red\n" + IMQ
+ ".memory.hysteresis=1024\n" + IMQ + ".memory.overhead=10240\n" + IMQ + ".memory.gcdelta=1024\n" + IMQ + ".green.threshold=0\n" + IMQ
+ ".green.count=50000\n" + IMQ + ".green.gccount=0\n" + IMQ + ".green.gcitr=0\n" + IMQ
+ ".green.classname=com.sun.messaging.jmq.jmsserver.memory.levels.Green\n" + IMQ + ".yellow.threshold=60\n" + IMQ
+ ".yellow.classname=com.sun.messaging.jmq.jmsserver.memory.levels.Yellow\n" + IMQ + ".yellow.count=50\n" + IMQ + ".yellow.gccount=1\n" + IMQ
+ ".yellow.gcitr=1000\n" + IMQ + ".yellow.seconds=2\n" + IMQ + ".orange.threshold=80\n" + IMQ
+ ".orange.classname=com.sun.messaging.jmq.jmsserver.memory.levels.Orange\n" + IMQ + ".orange.count=1\n" + IMQ + ".orange.gccount=5\n" + IMQ
+ ".orange.gcitr=100\n" + IMQ + ".orange.seconds=1\n" + IMQ + ".red.threshold=90\n" + IMQ
+ ".red.classname=com.sun.messaging.jmq.jmsserver.memory.levels.Red\n" + IMQ + ".red.count=0\n" + IMQ + ".red.gccount=10\n" + IMQ + ".red.gcitr=5\n"
+ IMQ + ".red.seconds=10\n" + IMQ + ".cluster.manager.class=" + "com.sun.messaging.jmq.jmsserver.cluster.manager.ClusterManagerImpl\n" + IMQ
+ ".hacluster.jdbc.manager.class=" + "com.sun.messaging.jmq.jmsserver.cluster.manager.ha.HAClusterManagerImpl\n" + IMQ
+ ".hacluster.bdbsfs.manager.class=" + "com.sun.messaging.jmq.jmsserver.cluster.manager.ha.SFSHAClusterManagerImpl\n" + IMQ
+ ".cluster.migratable.bdb.manager.class=" + "com.sun.messaging.jmq.jmsserver.cluster.manager.ha.RepHAClusterManagerImpl\n" + IMQ
+ ".cluster.heartbeat.class=" + "com.sun.messaging.jmq.jmsserver.multibroker.heartbeat.HeartbeatImpl\n";
// ------------------------------------------------------------------------
// -- Temporary FALLBACK properties until we are fully inside nuclues all the time --
// ------------------------------------------------------------------------
public static final String Logger_FallbackProperties =
"handlers=java.util.logging.FileHandler, java.util.logging.ConsoleHandler, com.sun.messaging.jmq.jmsserver.management.agent.JMXLogHandler\n"
+ ".level=INFO\n" + "java.util.logging.FileHandler.level=ALL\n"
+ "java.util.logging.FileHandler.formatter=com.sun.messaging.jmq.util.log.UniformLogFormatter\n"
+ "java.util.logging.FileHandler.limit=268435456\n"
+ "java.util.logging.FileHandler.pattern=${imq.instanceshome}${/}${imq.instancename}${/}log${/}log.txt\n"
+ "java.util.logging.FileHandler.append=true\n"
// Currently not working but it is intended to be used once working
+ "com.sun.enterprise.server.logging.GFFileHandler.file=${imq.instanceshome}${/}${imq.instancename}${/}log${/}log.txt\n)"
+ "com.sun.enterprise.server.logging.GFFileHandler.formatter=com.sun.messaging.jmq.util.log.UniformLogFormatter\n"
+ "com.sun.enterprise.server.logging.GFFileHandler.rotationLimitInBytes=268435456\n"
+ "com.sun.enterprise.server.logging.GFFileHandler.rotationTimelimitInMinutes=10080\n"
+ "com.sun.enterprise.server.logging.GFFileHandler.level = ALL\n"
+ "java.util.logging.ConsoleHandler.formatter=com.sun.messaging.jmq.util.log.UniformLogFormatter\n"
+ "java.util.logging.ConsoleHandler.level=INFO\n" + "imq.log.jmx.output=ALL\n" + "sun.os. patch.level=unknown\n" // Workaround
;
// ------------------------------------------------------------------------
// -- static final config information --
// ------------------------------------------------------------------------
/**
* full path to the non-editable iMQ configuration location.
*/
private static final String JMQ_prop_loc = CommGlobals.getJMQ_LIB_HOME() + File.separator + CommGlobals.JMQ_BROKER_PROP_LOC;
/**
* full path to the default properties file. This is a non-editable property file which contains the default settings
* for all properties
*/
private static final String default_loc = JMQ_prop_loc + "default.properties";
/**
* full path to the install properties file. This is a non-editable property file which contains any property setting
* set during install which affect any version of iMQ running w/ this install image.
*/
private static final String install_loc = JMQ_prop_loc + "install.properties";
/**
* optional property which defines the Configuration store class
*/
private static final String ConfigStoreProperty = IMQ + ".config.class";
/**
* the default class for handling Configuration Storage
*/
private static final String Default_Config_Store = "com.sun.messaging.jmq.jmsserver.config.FileConfigStore";
// ------------------------------------------------------------------------
// -- instance variables --
// ------------------------------------------------------------------------
Properties params = null;
transient ConfigStore localconfig = null;
transient Logger logger = null;
/**
* create a properties file with the passed in instance location
*
* XXX - LKS 6/29/00 - Need to handle exceptions with errors .. XXX - LKS 6/29/00 - log messages
*
* @param configname the name used by the broker, passed in at startup
*/
public BrokerConfig(String configname, Properties params, boolean resetProp, Properties saveProps) throws BrokerException {
if (params == null) {
params = new Properties(); // create empty object, its easier
}
this.params = params;
logger = CommGlobals.getLogger();
logger.log(Logger.DEBUG, BrokerResources.I_JMQ_HOME, CommGlobals.getJMQ_HOME());
try {
this.load(new ByteArrayInputStream(JMQ_FallbackProperties.getBytes()));
} catch (IOException ex1) {
throw new BrokerException(CommGlobals.getBrokerResources().getString(BrokerResources.X_INTERNAL_EXCEPTION, "unable to load fallback properties"),
ex1);
}
try {
this.load(new ByteArrayInputStream(Logger_FallbackProperties.getBytes()));
} catch (IOException ex1) {
throw new BrokerException(
CommGlobals.getBrokerResources().getString(BrokerResources.X_INTERNAL_EXCEPTION, "unable to load logger fallback properties"), ex1);
}
try {
loadDefaultProperties(default_loc);
} catch (IOException ex) {
logger.log(Logger.WARNING, BrokerResources.W_BAD_PROPERTY_FILE, "default", default_loc, ex);
logger.log(Logger.ERROR, BrokerResources.E_FALLBACK_PROPS);
// OK if we got this error .. nothing else to do, we'll just have
// to use the fallback properties
return;
}
try {
loadDefaultProperties(install_loc);
} catch (Exception ex) {
logger.log(Logger.WARNING, BrokerResources.W_BAD_PROPERTY_FILE, "install", install_loc, ex);
}
// NOW ... determine the class for the configuration storage
String configprop = super.getProperty(ConfigStoreProperty, Default_Config_Store);
try {
localconfig = (ConfigStore) Class.forName(configprop).getDeclaredConstructor().newInstance();
} catch (Exception ex) {
logger.logStack(Logger.ERROR, BrokerResources.E_BAD_CONFIG_STORE, configprop, ex);
}
if (localconfig != null) {
if (resetProp) {
localconfig.clearProps(configname);
}
Properties storedprops = localconfig.loadStoredProps(this, configname);
Properties clusterprops = localconfig.loadClusterProps(this, params, storedprops);
// overlay cluster props
if (clusterprops != null) {
putAll(clusterprops);
}
// overlay stored props
setStoredProperties(storedprops);
}
/*
* Fix 4939648 Load system properties for properties. This to to handle the case where somebody used "-Dfoo=bar" with
* the java command to set an MQ property. It also lets the system properties be dumped when we dump broker state.
*/
this.putAll(System.getProperties());
/* Put properties from command line */
putAll(params);
if (saveProps != null) {
setStoredProperties(saveProps);
}
checkProperties();
}
/**
* checks the properties for bogus values ... currently only looks for trailing whitespace, however we may want to
* expand it in the future to remove ctrl characters, etc
*/
protected void checkProperties() {
Enumeration keys = propertyNames();
while (keys.hasMoreElements()) {
String name = (String) keys.nextElement();
if (name == null) {
continue;
}
String value = getProperty(name);
if (value == null || value.length() <= 0) {
continue;
}
char c = value.charAt(value.length() - 1);
if (Character.isSpaceChar(c)) {
Exception e = null;
value = value.trim();
try {
updateProperty(name, value);
} catch (Exception ex) {
e = ex;
put(name, value);
}
if (e == null) {
logger.log(Logger.WARNING, BrokerResources.W_BAD_PROPERTY, name, value);
} else {
logger.log(Logger.WARNING, BrokerResources.W_BAD_PROPERTY, name, value, e);
}
}
}
}
/**
* Writes out the updated instance property file when a property is changed. For BrokerConfig, we want to override the
* standard UpdateProperties mechanism to use localconfig to provide the flexibility to add additional formats for
* storing properties in the future (e.g. JNDI)
*
* XXX - LKS 7/5/00 - How should IOExceptiones be handled ??
*/
@Override
protected void saveUpdatedProperties(Properties props) throws IOException {
if (localconfig == null) {
logger.log(Logger.WARNING, BrokerResources.W_CONFIG_STORE_WRITE);
return;
}
localconfig.storeProperties(storedprops);
}
public void reloadProps(String instancename, String[] propnames) throws BrokerException {
reloadProps(instancename, propnames, true);
}
/**
* Reload given set of properties from the configuration store.
*/
public void reloadProps(String instancename, String[] propnames, boolean overideparams) throws BrokerException {
if (localconfig == null) {
return;
}
// Remove old values.
ArrayList newpropnames = new ArrayList();
for (int i = 0; i < propnames.length; i++) {
if (overideparams) {
remove(propnames[i]);
} else if (params.get(propnames[i]) == null) {
remove(propnames[i]);
newpropnames.add(propnames[i]);
}
}
if (!overideparams) {
propnames = (String[]) newpropnames.toArray(new String[newpropnames.size()]);
}
// Reload broker properties.
Properties sprops = localconfig.reloadProps(instancename, propnames);
if (sprops == null) {
sprops = new Properties();
}
Properties clusterprops = localconfig.loadClusterProps(this, new Properties(), sprops);
Properties cprops = new Properties();
if (clusterprops != null) {
String value = null;
for (int i = 0; i < propnames.length; i++) {
value = clusterprops.getProperty(propnames[i]);
if (value != null) {
cprops.setProperty(propnames[i], value);
}
}
}
// ok, override sprops over cprops
cprops.putAll(sprops);
// update the broker - sending out notifications
try {
updateProperties(cprops, false);
} catch (Exception ex) {
putAll(cprops);
}
}
}