Class CachingConnectionFactory

java.lang.Object
org.springframework.amqp.rabbit.connection.AbstractConnectionFactory
org.springframework.amqp.rabbit.connection.CachingConnectionFactory
All Implemented Interfaces:
com.rabbitmq.client.ShutdownListener, EventListener, ConnectionFactory, Aware, BeanNameAware, DisposableBean, InitializingBean, ApplicationContextAware, ApplicationEventPublisherAware, ApplicationListener<ContextClosedEvent>, Lifecycle, Phased, SmartLifecycle

@ManagedResource public class CachingConnectionFactory extends AbstractConnectionFactory implements InitializingBean, com.rabbitmq.client.ShutdownListener, SmartLifecycle
A ConnectionFactory implementation that (when the cache mode is CachingConnectionFactory.CacheMode.CHANNEL (default) returns the same Connection from all createConnection() calls, and ignores calls to Connection.close() and caches Channel.

By default, only one Channel will be cached, with further requested Channels being created and disposed on demand. Consider raising the "channelCacheSize" value in case of a high-concurrency environment.

When the cache mode is CachingConnectionFactory.CacheMode.CONNECTION, a new (or cached) connection is used for each createConnection(); connections are cached according to the "connectionCacheSize" value. Both connections and channels are cached in this mode.

CachingConnectionFactory.CacheMode.CONNECTION is not compatible with a Rabbit Admin that auto-declares queues etc.

NOTE: This ConnectionFactory requires explicit closing of all Channels obtained from its Connection(s). This is the usual recommendation for native Rabbit access code anyway. However, with this ConnectionFactory, its use is mandatory in order to actually allow for Channel reuse. Channel.close() returns the channel to the cache, if there is room, or physically closes the channel otherwise.

Author:
Mark Pollack, Mark Fisher, Dave Syer, Gary Russell, Artem Bilan, Steve Powell, Will Droste, Leonardo Ferreira
  • Constructor Details

    • CachingConnectionFactory

      public CachingConnectionFactory()
      Create a new CachingConnectionFactory initializing the hostname to be the value returned from InetAddress.getLocalHost(), or "localhost" if getLocalHost() throws an exception.
    • CachingConnectionFactory

      public CachingConnectionFactory(@Nullable String hostname)
      Create a new CachingConnectionFactory given a host name.
      Parameters:
      hostname - the host name to connect to
    • CachingConnectionFactory

      public CachingConnectionFactory(int port)
      Create a new CachingConnectionFactory given a port on the hostname returned from InetAddress.getLocalHost(), or "localhost" if getLocalHost() throws an exception.
      Parameters:
      port - the port number
    • CachingConnectionFactory

      public CachingConnectionFactory(@Nullable String hostNameArg, int port)
      Create a new CachingConnectionFactory given a host name and port.
      Parameters:
      hostNameArg - the host name to connect to
      port - the port number
    • CachingConnectionFactory

      public CachingConnectionFactory(URI uri)
      Create a new CachingConnectionFactory given a URI.
      Parameters:
      uri - the amqp uri configuring the connection
      Since:
      1.5
    • CachingConnectionFactory

      public CachingConnectionFactory(com.rabbitmq.client.ConnectionFactory rabbitConnectionFactory)
      Create a new CachingConnectionFactory for the given target ConnectionFactory.
      Parameters:
      rabbitConnectionFactory - the target ConnectionFactory
  • Method Details

    • setPublisherConnectionFactory

      public void setPublisherConnectionFactory(@Nullable AbstractConnectionFactory publisherConnectionFactory)
      Description copied from class: AbstractConnectionFactory
      Set a custom publisher connection factory; the type does not need to be the same as this factory.
      Overrides:
      setPublisherConnectionFactory in class AbstractConnectionFactory
      Parameters:
      publisherConnectionFactory - the factory.
    • setChannelCacheSize

      public void setChannelCacheSize(int sessionCacheSize)
      The number of channels to maintain in the cache. By default, channels are allocated on demand (unbounded) and this represents the maximum cache size. To limit the available channels, see setChannelCheckoutTimeout(long).
      Parameters:
      sessionCacheSize - the channel cache size.
      See Also:
    • getChannelCacheSize

      public int getChannelCacheSize()
    • getCacheMode

      public CachingConnectionFactory.CacheMode getCacheMode()
    • setCacheMode

      public void setCacheMode(CachingConnectionFactory.CacheMode cacheMode)
    • getConnectionCacheSize

      public int getConnectionCacheSize()
    • setConnectionCacheSize

      public void setConnectionCacheSize(int connectionCacheSize)
    • setConnectionLimit

      public void setConnectionLimit(int connectionLimit)
      Set the connection limit when using cache mode CONNECTION. When the limit is reached and there are no idle connections, the channelCheckoutTimeLimit is used to wait for a connection to become idle.
      Parameters:
      connectionLimit - the limit.
      Since:
      1.5.5
    • isPublisherConfirms

      public boolean isPublisherConfirms()
      Description copied from interface: ConnectionFactory
      Return true if publisher confirms are enabled.
      Specified by:
      isPublisherConfirms in interface ConnectionFactory
      Returns:
      publisherConfirms.
    • isPublisherReturns

      public boolean isPublisherReturns()
      Description copied from interface: ConnectionFactory
      Return true if publisher returns are enabled.
      Specified by:
      isPublisherReturns in interface ConnectionFactory
      Returns:
      publisherReturns.
    • setPublisherReturns

      public void setPublisherReturns(boolean publisherReturns)
    • isSimplePublisherConfirms

      public boolean isSimplePublisherConfirms()
      Description copied from interface: ConnectionFactory
      Return true if simple publisher confirms are enabled.
      Specified by:
      isSimplePublisherConfirms in interface ConnectionFactory
      Returns:
      simplePublisherConfirms
    • setPublisherConfirmType

      public void setPublisherConfirmType(CachingConnectionFactory.ConfirmType confirmType)
      Set the confirm type to use; default CachingConnectionFactory.ConfirmType.NONE.
      Parameters:
      confirmType - the confirm type.
      Since:
      2.2
    • setChannelCheckoutTimeout

      public void setChannelCheckoutTimeout(long channelCheckoutTimeout)
      Sets the channel checkout timeout. When greater than 0, enables channel limiting in that the channelCacheSize becomes the total number of available channels per connection rather than a simple cache size. Note that changing the channelCacheSize does not affect the limit on existing connection(s), invoke destroy() to cause a new connection to be created with the new limit.

      Since 1.5.5, also applies to getting a connection when the cache mode is CONNECTION.

      Parameters:
      channelCheckoutTimeout - the timeout in milliseconds; default 0 (channel limiting not enabled).
      Since:
      1.4.2
      See Also:
    • setPublisherChannelFactory

      public void setPublisherChannelFactory(PublisherCallbackChannelFactory publisherChannelFactory)
      Set the factory to use to create PublisherCallbackChannel instances.
      Parameters:
      publisherChannelFactory - the factory.
      Since:
      2.1.6
    • getPhase

      public int getPhase()
      Specified by:
      getPhase in interface Phased
      Specified by:
      getPhase in interface SmartLifecycle
    • afterPropertiesSet

      public void afterPropertiesSet()
      Specified by:
      afterPropertiesSet in interface InitializingBean
    • start

      public void start()
      Specified by:
      start in interface Lifecycle
    • stop

      public void stop()
      Specified by:
      stop in interface Lifecycle
    • isRunning

      public boolean isRunning()
      Specified by:
      isRunning in interface Lifecycle
    • setConnectionListeners

      public void setConnectionListeners(List<? extends ConnectionListener> listeners)
      Overrides:
      setConnectionListeners in class AbstractConnectionFactory
    • addConnectionListener

      public void addConnectionListener(ConnectionListener listener)
      Specified by:
      addConnectionListener in interface ConnectionFactory
      Overrides:
      addConnectionListener in class AbstractConnectionFactory
    • createConnection

      public final Connection createConnection() throws AmqpException
      Specified by:
      createConnection in interface ConnectionFactory
      Throws:
      AmqpException
    • destroy

      public final void destroy()
      Close the underlying shared connection. Use resetConnection() to close the connection while the application is still running.

      As this bean implements DisposableBean, a bean factory will automatically invoke this on destruction of its cached singletons.

      If called after the context is closed, the connection factory can no longer server up connections.

      Specified by:
      destroy in interface DisposableBean
      Overrides:
      destroy in class AbstractConnectionFactory
    • resetConnection

      public void resetConnection()
      Close the connection(s). This will impact any in-process operations. New connection(s) will be created on demand after this method returns. This might be used to force a reconnect to the primary broker after failing over to a secondary broker.
      Specified by:
      resetConnection in interface ConnectionFactory
    • reset

      protected void reset(Deque<ChannelProxy> channels, Deque<ChannelProxy> txChannels, Map<com.rabbitmq.client.Channel,ChannelProxy> channelsAwaitingAcks)
    • closeAndClear

      protected void closeAndClear(Collection<ChannelProxy> theChannels)
    • closeChannels

      protected void closeChannels(Collection<ChannelProxy> theChannels)
    • getCacheProperties

      @ManagedAttribute public Properties getCacheProperties()
    • getPublisherConnectionFactoryCacheProperties

      @ManagedAttribute public Properties getPublisherConnectionFactoryCacheProperties()
      Return the cache properties from the underlying publisher sub-factory.
      Returns:
      the properties.
      Since:
      2.0.2
    • getChannelsExecutor

      protected ExecutorService getChannelsExecutor()
      Determine the executor service used for target channels.
      Returns:
      specified executor service otherwise the default one is created and returned.
      Since:
      1.7.9
    • toString

      public String toString()
      Overrides:
      toString in class AbstractConnectionFactory