Class CachingConnectionFactory
- All Implemented Interfaces:
- ConnectionFactory,- ExceptionListener,- QueueConnectionFactory,- TopicConnectionFactory,- DisposableBean,- InitializingBean,- Lifecycle
SingleConnectionFactory subclass that adds Session caching as well as
 MessageProducer and MessageConsumer caching. This ConnectionFactory
 also switches the "reconnectOnException" property
 to "true" by default, allowing for automatic recovery of the underlying Connection.
 By default, only one single Session will be cached, with further requested
 Sessions being created and disposed on demand. Consider raising the
 "sessionCacheSize" value in case of a
 high-concurrency environment.
 
When using the JMS 1.0.2 API, this ConnectionFactory will switch
 into queue/topic mode according to the JMS API methods used at runtime:
 createQueueConnection and createTopicConnection will
 lead to queue/topic mode, respectively; generic createConnection
 calls will lead to a JMS 1.1 connection which is able to serve both modes.
 
As of Spring Framework 5, this class supports JMS 2.0 JMSContext
 calls and therefore requires the JMS 2.0 API to be present at runtime.
 It may nevertheless run against a JMS 1.1 driver (bound to the JMS 2.0 API)
 as long as no actual JMS 2.0 calls are triggered by the application's setup.
 
NOTE: This ConnectionFactory requires explicit closing of all Sessions obtained from its shared Connection. This is the usual recommendation for native JMS access code anyway. However, with this ConnectionFactory, its use is mandatory in order to actually allow for Session reuse.
Note also that MessageConsumers obtained from a cached Session won't get
 closed until the Session will eventually be removed from the pool. This may
 lead to semantic side effects in some cases. For a durable subscriber, the
 logical Session.close() call will also close the subscription.
 Re-registering a durable consumer for the same subscription on the same
 Session handle is not supported; close and reobtain a cached Session first.
 
Last but not least, MessageProducers and MessageConsumers for temporary queues and topics (TemporaryQueue/TemporaryTopic) will never be cached. Unfortunately, WebLogic JMS happens to implement the temporary queue/topic interfaces on its regular destination implementation, mis-indicating that none of its destinations can be cached. Please use a different connection pool/cache on WebLogic, or customize this class for WebLogic purposes.
- Since:
- 2.5.3
- Author:
- Juergen Hoeller
- See Also:
- 
Field SummaryFields inherited from class org.springframework.jms.connection.SingleConnectionFactorylogger
- 
Constructor SummaryConstructorsConstructorDescriptionCreate a new CachingConnectionFactory for bean-style usage.CachingConnectionFactory(ConnectionFactory targetConnectionFactory) Create a new CachingConnectionFactory for the given target ConnectionFactory.
- 
Method SummaryModifier and TypeMethodDescriptionintReturn a current session count, indicating the number of sessions currently cached by this connection factory.protected SessiongetCachedSessionProxy(Session target, Deque<Session> sessionList) Wrap the given Session with a proxy that delegates every method call to it but adapts close calls.protected SessiongetSession(Connection con, Integer mode) Checks for a cached Session for the given mode.intReturn the desired size for the JMS Session cache (per JMS Session type).booleanReturn whether to cache JMS MessageConsumers per JMS Session instance.booleanReturn whether to cache JMS MessageProducers per JMS Session instance.voidResets the Session cache as well.voidsetCacheConsumers(boolean cacheConsumers) Specify whether to cache JMS MessageConsumers per JMS Session instance (more specifically: one MessageConsumer per Destination, selector String and Session).voidsetCacheProducers(boolean cacheProducers) Specify whether to cache JMS MessageProducers per JMS Session instance (more specifically: one MessageProducer per Destination and Session).voidsetSessionCacheSize(int sessionCacheSize) Specify the desired size for the JMS Session cache (per JMS Session type).Methods inherited from class org.springframework.jms.connection.SingleConnectionFactoryafterPropertiesSet, closeConnection, createConnection, createConnection, createContext, createContext, createContext, createContext, createQueueConnection, createQueueConnection, createSession, createTopicConnection, createTopicConnection, destroy, doCreateConnection, getClientId, getConnection, getExceptionListener, getSharedConnectionProxy, getTargetConnectionFactory, initConnection, isReconnectOnException, isRunning, onException, prepareConnection, setClientId, setExceptionListener, setReconnectOnException, setTargetConnectionFactory, start, stop
- 
Constructor Details- 
CachingConnectionFactorypublic CachingConnectionFactory()Create a new CachingConnectionFactory for bean-style usage.
- 
CachingConnectionFactoryCreate a new CachingConnectionFactory for the given target ConnectionFactory.- Parameters:
- targetConnectionFactory- the target ConnectionFactory
 
 
- 
- 
Method Details- 
setSessionCacheSizepublic void setSessionCacheSize(int sessionCacheSize) Specify the desired size for the JMS Session cache (per JMS Session type).This cache size is the maximum limit for the number of cached Sessions per session acknowledgement type (auto, client, dups_ok, transacted). As a consequence, the actual number of cached Sessions may be up to four times as high as the specified value - in the unlikely case of mixing and matching different acknowledgement types. Default is 1: caching a single Session, (re-)creating further ones on demand. Specify a number like 10 if you'd like to raise the number of cached Sessions; that said, 1 may be sufficient for low-concurrency scenarios. - See Also:
 
- 
getSessionCacheSizepublic int getSessionCacheSize()Return the desired size for the JMS Session cache (per JMS Session type).
- 
setCacheProducerspublic void setCacheProducers(boolean cacheProducers) Specify whether to cache JMS MessageProducers per JMS Session instance (more specifically: one MessageProducer per Destination and Session).Default is "true". Switch this to "false" in order to always recreate MessageProducers on demand. 
- 
isCacheProducerspublic boolean isCacheProducers()Return whether to cache JMS MessageProducers per JMS Session instance.
- 
setCacheConsumerspublic void setCacheConsumers(boolean cacheConsumers) Specify whether to cache JMS MessageConsumers per JMS Session instance (more specifically: one MessageConsumer per Destination, selector String and Session). Note that durable subscribers will only be cached until logical closing of the Session handle.Default is "true". Switch this to "false" in order to always recreate MessageConsumers on demand. 
- 
isCacheConsumerspublic boolean isCacheConsumers()Return whether to cache JMS MessageConsumers per JMS Session instance.
- 
getCachedSessionCountpublic int getCachedSessionCount()Return a current session count, indicating the number of sessions currently cached by this connection factory.- Since:
- 5.3.7
 
- 
resetConnectionpublic void resetConnection()Resets the Session cache as well.- Overrides:
- resetConnectionin class- SingleConnectionFactory
- See Also:
 
- 
getSessionChecks for a cached Session for the given mode.- Overrides:
- getSessionin class- SingleConnectionFactory
- Parameters:
- con- the JMS Connection to operate on
- mode- the Session acknowledgement mode (- Session.TRANSACTEDor one of the common modes)
- Returns:
- the Session to use, or nullto indicate creation of a raw standard Session
- Throws:
- JMSException- if thrown by the JMS API
 
- 
getCachedSessionProxyWrap the given Session with a proxy that delegates every method call to it but adapts close calls. This is useful for allowing application code to handle a special framework Session just like an ordinary Session.- Parameters:
- target- the original Session to wrap
- sessionList- the List of cached Sessions that the given Session belongs to
- Returns:
- the wrapped Session
 
 
-