org.springframework.jms.connection

## Class CachingConnectionFactory

- java.lang.Object
- - org.springframework.jms.connection.SingleConnectionFactory
  - - org.springframework.jms.connection.CachingConnectionFactory

- All Implemented Interfaces:
    ConnectionFactory, ExceptionListener, QueueConnectionFactory, TopicConnectionFactory, DisposableBean, InitializingBean

      public class CachingConnectionFactory
      extends SingleConnectionFactory

  `SingleConnectionFactory` subclass that adds `Session` caching as well `MessageProducer` 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.

  NOTE: This ConnectionFactory decorator requires JMS 1.1 or higher. You may use it through the JMS 1.0.2 API; however, the target JMS driver needs to be compliant with JMS 1.1.

  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.

  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.

  Since:
    2.5.3
  Author:
    Juergen Hoeller

- - ### Field Summary

    - ### Fields inherited from class org.springframework.jms.connection.SingleConnectionFactory

      `logger`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `CachingConnectionFactory()` Create a new CachingConnectionFactory for bean-style usage.
    `CachingConnectionFactory(ConnectionFactory targetConnectionFactory)` Create a new CachingConnectionFactory for the given target ConnectionFactory.

  - ### Method Summary

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `protected Session` | `getCachedSessionProxy(Session target, LinkedList<Session> sessionList)` Wrap the given Session with a proxy that delegates every method call to it but adapts close calls.
    `protected Session` | `getSession(Connection con, Integer mode)` Checks for a cached Session for the given mode.
    `int` | `getSessionCacheSize()` Return the desired size for the JMS Session cache (per JMS Session type).
    `boolean` | `isCacheConsumers()` Return whether to cache JMS MessageConsumers per JMS Session instance.
    `boolean` | `isCacheProducers()` Return whether to cache JMS MessageProducers per JMS Session instance.
    `void` | `resetConnection()` Resets the Session cache as well.
    `void` | `setCacheConsumers(boolean cacheConsumers)` Specify whether to cache JMS MessageConsumers per JMS Session instance (more specifically: one MessageConsumer per Destination, selector String and Session).
    `void` | `setCacheProducers(boolean cacheProducers)` Specify whether to cache JMS MessageProducers per JMS Session instance (more specifically: one MessageProducer per Destination and Session).
    `void` | `setSessionCacheSize(int sessionCacheSize)` Specify the desired size for the JMS Session cache (per JMS Session type).

    - ### Methods inherited from class org.springframework.jms.connection.SingleConnectionFactory

      `afterPropertiesSet, closeConnection, createConnection, createConnection, createQueueConnection, createQueueConnection, createSession, createTopicConnection, createTopicConnection, destroy, doCreateConnection, getClientId, getExceptionListener, getSharedConnectionProxy, getTargetConnectionFactory, initConnection, isReconnectOnException, onException, prepareConnection, setClientId, setExceptionListener, setReconnectOnException, setTargetConnectionFactory`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Constructor Detail

    - #### CachingConnectionFactory

          public CachingConnectionFactory()

      Create a new CachingConnectionFactory for bean-style usage.
      See Also:
        `SingleConnectionFactory.setTargetConnectionFactory(javax.jms.ConnectionFactory)`

    - #### CachingConnectionFactory

          public CachingConnectionFactory(ConnectionFactory targetConnectionFactory)

      Create a new CachingConnectionFactory for the given target ConnectionFactory.
      Parameters:
        `targetConnectionFactory` - the target ConnectionFactory

  - ### Method Detail

    - #### setSessionCacheSize

          public 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:
        `setCacheProducers(boolean)`

    - #### getSessionCacheSize

          public int getSessionCacheSize()

      Return the desired size for the JMS Session cache (per JMS Session type).

    - #### setCacheProducers

          public 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.

    - #### isCacheProducers

          public boolean isCacheProducers()

      Return whether to cache JMS MessageProducers per JMS Session instance.

    - #### setCacheConsumers

          public 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.

    - #### isCacheConsumers

          public boolean isCacheConsumers()

      Return whether to cache JMS MessageConsumers per JMS Session instance.

    - #### resetConnection

          public void resetConnection()

      Resets the Session cache as well.
      Overrides:
        `resetConnection` in class `SingleConnectionFactory`

    - #### getSession

          protected Session getSession(Connection con,
                           Integer mode)
                                throws JMSException

      Checks for a cached Session for the given mode.
      Overrides:
        `getSession` in class `SingleConnectionFactory`
      Parameters:
        `con` - the JMS Connection to operate on
        `mode` - the Session acknowledgement mode (`Session.TRANSACTED` or one of the common modes)
      Returns:
        the Session to use, or `null` to indicate creation of a raw standard Session
      Throws:
        `JMSException` - if thrown by the JMS API

    - #### getCachedSessionProxy

          protected Session getCachedSessionProxy(Session target,
                                      LinkedList<Session> sessionList)

      Wrap 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