Class AutorecoveringConnection
java.lang.Object
com.rabbitmq.client.impl.recovery.AutorecoveringConnection
- All Implemented Interfaces:
Connection, NetworkConnection, Recoverable, RecoverableConnection, ShutdownNotifier, Closeable, AutoCloseable
public class AutorecoveringConnection
extends Object
implements RecoverableConnection, NetworkConnection
Connection implementation that performs automatic recovery when
connection shutdown is not initiated by the application (e.g. due to
an I/O exception).
Topology (exchanges, queues, bindings, and consumers) can be (and by default is) recovered
as well, in this order:
- Exchanges
- Queues
- Bindings (both queue and exchange-to-exchange)
- Consumers
- Since:
- 3.3.0
- See Also:
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final List<BlockedListener> private final RecoveryAwareAMQConnectionFactoryprivate final Map<Integer, AutorecoveringChannel> private final Predicate<ShutdownSignalException> private final List<ConsumerRecoveryListener> private final Map<String, RecordedConsumer> static final Predicate<ShutdownSignalException> private RecoveryAwareAMQConnectionprivate static final org.slf4j.Loggerprivate booleanprivate final ConnectionParamsprivate final List<QueueRecoveryListener> private final List<RecordedBinding> private final Map<String, RecordedExchange> private final Map<String, RecordedQueue> private final RecoveredQueueNameSupplierprivate final List<RecoveryListener> private final Objectprivate final RetryHandlerprivate final List<ShutdownListener> private final TopologyRecoveryFilter -
Constructor Summary
ConstructorsConstructorDescriptionAutorecoveringConnection(ConnectionParams params, FrameHandlerFactory f, AddressResolver addressResolver) AutorecoveringConnection(ConnectionParams params, FrameHandlerFactory f, AddressResolver addressResolver, MetricsCollector metricsCollector, ObservationCollector observationCollector) AutorecoveringConnection(ConnectionParams params, FrameHandlerFactory f, List<Address> addrs) -
Method Summary
Modifier and TypeMethodDescriptionvoidabort()Abort this connection and all its channels with theAMQP.REPLY_SUCCESSclose code and message 'OK'.voidabort(int timeout) Abort this connection and all its channels with theAMQP.REPLY_SUCCESSclose code and message 'OK'.voidAbort this connection and all its channels.voidAbort this connection and all its channels.private voidaddBlockedListener(BlockedCallback blockedCallback, UnblockedCallback unblockedCallback) Add a lambda-basedBlockedListener.voidaddBlockedListener(BlockedListener listener) Add aBlockedListener.voidNot part of the public API.voidNot part of the public API.voidaddRecoveryListener(RecoveryListener listener) Adds the recovery listenervoidaddShutdownListener(ShutdownListener listener) Add shutdown listener.private voidvoidRemove allBlockedListeners.voidclose()Close this connection and all its channels with theAMQP.REPLY_SUCCESSclose code and message 'OK'.voidclose(int timeout) Close this connection and all its channels with theAMQP.REPLY_SUCCESSclose code and message 'OK'.voidClose this connection and all its channels.voidClose this connection and all its channels.Create a new channel, using an internally allocated channel number.createChannel(int channelNumber) Create a new channel, using the specified channel number if possible.(package private) RecordedConsumerdeleteRecordedConsumer(String consumerTag) (package private) voiddeleteRecordedExchange(String exchange) (package private) booleandeleteRecordedExchangeBinding(AutorecoveringChannel ch, String destination, String source, String routingKey, Map<String, Object> arguments) (package private) voiddeleteRecordedQueue(String queue) (package private) booleandeleteRecordedQueueBinding(AutorecoveringChannel ch, String queue, String exchange, String routingKey, Map<String, Object> arguments) voidexcludeQueueFromRecovery(String queue, boolean ifUnused) Exclude the queue from the list of queues to recover after connection failure.Retrieve the host.intGet the negotiated maximum channel number.Get a copy of the map of client properties sent to the serverReturns client-provided connection name, if any.Get the shutdown reason objectNot supposed to be used outside of automated tests.Get the exception handler.intGet the negotiated maximum frame size.intGet the negotiated heartbeat interval.getId()Public API - Returns a unique ID for this connection.Retrieve the local host.intRetrieve the local port number.intgetPort()Retrieve the port number.(package private) RecoveredQueueNameSupplierRetrieve the server properties.private <E extends RecordedEntity>
List<Callable<Object>> groupEntitiesByChannel(Collection<E> entities) (package private) booleanhasMoreConsumersOnQueue(Collection<RecordedConsumer> consumers, String queue) (package private) booleanhasMoreDestinationsBoundToExchange(List<RecordedBinding> bindings, String exchange) voidinit()Private API.private voidinternalRecoverConsumer(String tag, RecordedConsumer consumer, boolean retry) private voidinternalRecoverQueue(String oldName, RecordedQueue q, boolean retry) booleanisOpen()Determine whether the component is currently open.private static TopologyRecoveryFilter(package private) voidmaybeDeleteRecordedAutoDeleteExchange(String exchange) (package private) voidvoidProtected API - notify the listeners attached to the componentprivate voidprivate voidprivate voidprivate voidpropagateQueueNameChangeToBindings(String oldName, String newName) private voidpropagateQueueNameChangeToConsumers(String oldName, String newName) (package private) voidrecordConsumer(String result, RecordedConsumer consumer) (package private) voidrecordExchange(String exchange, RecordedExchange x) (package private) voidrecordExchangeBinding(AutorecoveringChannel ch, String destination, String source, String routingKey, Map<String, Object> arguments) (package private) void(package private) voidrecordQueue(String queue, RecordedQueue meta) (package private) voidrecordQueueBinding(AutorecoveringChannel ch, String queue, String exchange, String routingKey, Map<String, Object> arguments) voidrecoverBinding(RecordedBinding b, boolean retry) private voidvoidrecoverChannel(AutorecoveringChannel channel) voidRecover a closed channel and all topology (i.e.private voidprivate RecoveryAwareAMQConnection(package private) voidrecoverConsumer(String tag, RecordedConsumer consumer) Recover the consumer.voidrecoverConsumer(String tag, RecordedConsumer consumer, boolean retry) Recover the consumer.private voidrecoverEntitiesAsynchronously(ExecutorService executor, Collection<? extends RecordedEntity> recordedEntities) voidrecoverExchange(RecordedExchange x, boolean retry) (package private) voidrecoverQueue(String oldName, RecordedQueue q) Recover the queue.voidrecoverQueue(String oldName, RecordedQueue q, boolean retry) Recover the queue.private voidprivate voidrecoverTopology(ExecutorService executor) (package private) voidregisterChannel(AutorecoveringChannel channel) (package private) Set<RecordedBinding> booleanremoveBlockedListener(BlockedListener listener) Remove aBlockedListener.voidvoidvoidremoveRecoveryListener(RecoveryListener listener) Removes the recovery listenervoidremoveShutdownListener(ShutdownListener listener) Remove shutdown listener for the component.voidPublic API - Sets a unique ID for this connection.private voidprotected booleantoString()(package private) voidunregisterChannel(AutorecoveringChannel channel) private ChannelwrapChannel(RecoveryAwareChannelN delegateChannel) Creates a recovering channel from a regular channel and registers it.private <T> RetryResultwrapRetryIfNecessary(RecordedEntity entity, Callable<T> recoveryAction) Methods inherited from class Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods inherited from interface Connection
openChannel, openChannel
-
Field Details
-
DEFAULT_CONNECTION_RECOVERY_TRIGGERING_CONDITION
public static final Predicate<ShutdownSignalException> DEFAULT_CONNECTION_RECOVERY_TRIGGERING_CONDITION -
LOGGER
private static final org.slf4j.Logger LOGGER -
cf
-
channels
-
params
-
delegate
-
shutdownHooks
-
recoveryListeners
-
blockedListeners
-
recordedQueues
-
recordedBindings
-
recordedExchanges
-
consumers
-
consumerRecoveryListeners
-
queueRecoveryListeners
-
topologyRecoveryFilter
-
manuallyClosed
private volatile boolean manuallyClosed -
recoveryLock
-
connectionRecoveryTriggeringCondition
-
retryHandler
-
recoveredQueueNameSupplier
-
-
Constructor Details
-
AutorecoveringConnection
public AutorecoveringConnection(ConnectionParams params, FrameHandlerFactory f, List<Address> addrs) -
AutorecoveringConnection
public AutorecoveringConnection(ConnectionParams params, FrameHandlerFactory f, AddressResolver addressResolver) -
AutorecoveringConnection
public AutorecoveringConnection(ConnectionParams params, FrameHandlerFactory f, AddressResolver addressResolver, MetricsCollector metricsCollector, ObservationCollector observationCollector)
-
-
Method Details
-
setupErrorOnWriteListenerForPotentialRecovery
private void setupErrorOnWriteListenerForPotentialRecovery() -
letAllPassFilter
-
init
Private API.- Throws:
IOExceptionTimeoutException- See Also:
-
createChannel
Description copied from interface:ConnectionCreate a new channel, using an internally allocated channel number. If automatic connection recovery is enabled, the channel returned by this method will beRecoverable.Use
Connection.openChannel()if you want to use anOptionalto deal with a value.- Specified by:
createChannelin interfaceConnection- Returns:
- a new channel descriptor, or null if none is available
- Throws:
IOException- if an I/O problem is encountered- See Also:
-
createChannel
Description copied from interface:ConnectionCreate a new channel, using the specified channel number if possible.Use
Connection.openChannel(int)if you want to use anOptionalto deal with a value.- Specified by:
createChannelin interfaceConnection- Parameters:
channelNumber- the channel number to allocate- Returns:
- a new channel descriptor, or null if this channel number is already in use
- Throws:
IOException- if an I/O problem is encountered- See Also:
-
wrapChannel
Creates a recovering channel from a regular channel and registers it. If the regular channel cannot be created (e.g. too many channels are open already), returns null.- Parameters:
delegateChannel- Channel to wrap.- Returns:
- Recovering channel.
-
registerChannel
-
unregisterChannel
-
getServerProperties
Description copied from interface:ConnectionRetrieve the server properties.- Specified by:
getServerPropertiesin interfaceConnection- Returns:
- a map of the server properties. This typically includes the product name and version of the server.
- See Also:
-
getClientProperties
Description copied from interface:ConnectionGet a copy of the map of client properties sent to the server- Specified by:
getClientPropertiesin interfaceConnection- Returns:
- a copy of the map of client properties
- See Also:
-
getClientProvidedName
Description copied from interface:ConnectionReturns client-provided connection name, if any. Note that the value returned does not uniquely identify a connection and cannot be used as a connection identifier in HTTP API requests.- Specified by:
getClientProvidedNamein interfaceConnection- Returns:
- client-provided connection name, if any
- See Also:
-
getFrameMax
public int getFrameMax()Description copied from interface:ConnectionGet the negotiated maximum frame size.- Specified by:
getFrameMaxin interfaceConnection- Returns:
- the maximum frame size, in octets; zero if unlimited
- See Also:
-
getHeartbeat
public int getHeartbeat()Description copied from interface:ConnectionGet the negotiated heartbeat interval.- Specified by:
getHeartbeatin interfaceConnection- Returns:
- the heartbeat interval, in seconds; zero if none
- See Also:
-
getChannelMax
public int getChannelMax()Description copied from interface:ConnectionGet the negotiated maximum channel number. Usable channel numbers range from 1 to this number, inclusive.- Specified by:
getChannelMaxin interfaceConnection- Returns:
- the maximum channel number permitted for this connection.
- See Also:
-
isOpen
public boolean isOpen()Description copied from interface:ShutdownNotifierDetermine whether the component is currently open. Will return false if we are currently closing. Checking this method should be only for information, because of the race conditions - state can change after the call. Instead just execute and try to catch ShutdownSignalException and IOException- Specified by:
isOpenin interfaceShutdownNotifier- Returns:
- true when component is open, false otherwise
- See Also:
-
close
Description copied from interface:ConnectionClose this connection and all its channels with theAMQP.REPLY_SUCCESSclose code and message 'OK'. Waits for all the close operations to complete.- Specified by:
closein interfaceAutoCloseable- Specified by:
closein interfaceCloseable- Specified by:
closein interfaceConnection- Throws:
IOException- if an I/O problem is encountered- See Also:
-
close
Description copied from interface:ConnectionClose this connection and all its channels with theAMQP.REPLY_SUCCESSclose code and message 'OK'. This method behaves in a similar way asConnection.close(), with the only difference that it waits with a provided timeout for all the close operations to complete. When timeout is reached the socket is forced to close.- Specified by:
closein interfaceConnection- Parameters:
timeout- timeout (in milliseconds) for completing all the close-related operations, use -1 for infinity- Throws:
IOException- if an I/O problem is encountered- See Also:
-
close
Description copied from interface:ConnectionClose this connection and all its channels. Waits with the given timeout for all the close operations to complete. When timeout is reached the socket is forced to close.- Specified by:
closein interfaceConnection- Parameters:
closeCode- the close code (See under "Reply Codes" in the AMQP specification)closeMessage- a message indicating the reason for closing the connectiontimeout- timeout (in milliseconds) for completing all the close-related operations, use -1 for infinity- Throws:
IOException- if an I/O problem is encountered- See Also:
-
abort
public void abort()Description copied from interface:ConnectionAbort this connection and all its channels with theAMQP.REPLY_SUCCESSclose code and message 'OK'. Forces the connection to close. Any encountered exceptions in the close operations are silently discarded.- Specified by:
abortin interfaceConnection- See Also:
-
abort
Description copied from interface:ConnectionAbort this connection and all its channels. Forces the connection to close and waits with the given timeout for all the close operations to complete. When timeout is reached the socket is forced to close. Any encountered exceptions in the close operations are silently discarded.- Specified by:
abortin interfaceConnection- Parameters:
closeCode- the close code (See under "Reply Codes" in the AMQP specification)closeMessage- a message indicating the reason for closing the connectiontimeout- timeout (in milliseconds) for completing all the close-related operations, use -1 for infinity- See Also:
-
abort
Description copied from interface:ConnectionAbort this connection and all its channels. Forces the connection to close and waits for all the close operations to complete. Any encountered exceptions in the close operations are silently discarded.- Specified by:
abortin interfaceConnection- Parameters:
closeCode- the close code (See under "Reply Codes" in the AMQP specification)closeMessage- a message indicating the reason for closing the connection- See Also:
-
abort
public void abort(int timeout) Description copied from interface:ConnectionAbort this connection and all its channels with theAMQP.REPLY_SUCCESSclose code and message 'OK'. This method behaves in a similar way asConnection.abort(), with the only difference that it waits with a provided timeout for all the close operations to complete. When timeout is reached the socket is forced to close.- Specified by:
abortin interfaceConnection- Parameters:
timeout- timeout (in milliseconds) for completing all the close-related operations, use -1 for infinity- See Also:
-
getDelegate
Not supposed to be used outside of automated tests. -
getCloseReason
Description copied from interface:ShutdownNotifierGet the shutdown reason object- Specified by:
getCloseReasonin interfaceShutdownNotifier- Returns:
- ShutdownSignalException if component is closed, null otherwise
- See Also:
-
addBlockedListener
Description copied from interface:ConnectionAdd aBlockedListener.- Specified by:
addBlockedListenerin interfaceConnection- Parameters:
listener- the listener to add- See Also:
-
addBlockedListener
public BlockedListener addBlockedListener(BlockedCallback blockedCallback, UnblockedCallback unblockedCallback) Description copied from interface:ConnectionAdd a lambda-basedBlockedListener.- Specified by:
addBlockedListenerin interfaceConnection- Parameters:
blockedCallback- the callback when the connection is blockedunblockedCallback- the callback when the connection is unblocked- Returns:
- the listener that wraps the callback
- See Also:
-
removeBlockedListener
Description copied from interface:ConnectionRemove aBlockedListener.- Specified by:
removeBlockedListenerin interfaceConnection- Parameters:
listener- the listener to remove- Returns:
trueif the listener was found and removed,falseotherwise- See Also:
-
clearBlockedListeners
public void clearBlockedListeners()Description copied from interface:ConnectionRemove allBlockedListeners.- Specified by:
clearBlockedListenersin interfaceConnection- See Also:
-
close
Description copied from interface:ConnectionClose this connection and all its channels. Waits for all the close operations to complete.- Specified by:
closein interfaceConnection- Parameters:
closeCode- the close code (See under "Reply Codes" in the AMQP specification)closeMessage- a message indicating the reason for closing the connection- Throws:
IOException- if an I/O problem is encountered- See Also:
-
addShutdownListener
Description copied from interface:ShutdownNotifierAdd shutdown listener. If the component is already closed, handler is fired immediately- Specified by:
addShutdownListenerin interfaceShutdownNotifier- Parameters:
listener-ShutdownListenerto the component- See Also:
-
removeShutdownListener
Description copied from interface:ShutdownNotifierRemove shutdown listener for the component.- Specified by:
removeShutdownListenerin interfaceShutdownNotifier- Parameters:
listener-ShutdownListenerto be removed- See Also:
-
notifyListeners
public void notifyListeners()Description copied from interface:ShutdownNotifierProtected API - notify the listeners attached to the component- Specified by:
notifyListenersin interfaceShutdownNotifier- See Also:
-
addRecoveryListener
Adds the recovery listener- Specified by:
addRecoveryListenerin interfaceRecoverable- Parameters:
listener-RecoveryListenerto execute after this connection recovers from network failure
-
removeRecoveryListener
Removes the recovery listener- Specified by:
removeRecoveryListenerin interfaceRecoverable- Parameters:
listener-RecoveryListenerto remove
-
getExceptionHandler
Description copied from interface:ConnectionGet the exception handler.- Specified by:
getExceptionHandlerin interfaceConnection- See Also:
-
getPort
public int getPort()Description copied from interface:ConnectionRetrieve the port number.- Specified by:
getPortin interfaceConnection- Specified by:
getPortin interfaceNetworkConnection- Returns:
- the port number of the peer we're connected to.
- See Also:
-
getAddress
Description copied from interface:ConnectionRetrieve the host.- Specified by:
getAddressin interfaceConnection- Specified by:
getAddressin interfaceNetworkConnection- Returns:
- the hostname of the peer we're connected to.
- See Also:
-
getLocalAddress
Description copied from interface:NetworkConnectionRetrieve the local host.- Specified by:
getLocalAddressin interfaceNetworkConnection- Returns:
- client socket address
-
getLocalPort
public int getLocalPort()Description copied from interface:NetworkConnectionRetrieve the local port number.- Specified by:
getLocalPortin interfaceNetworkConnection- Returns:
- client socket port
-
addAutomaticRecoveryListener
-
shouldTriggerConnectionRecovery
-
addQueueRecoveryListener
Not part of the public API. Mean to be used by JVM RabbitMQ clients that build on top of the Java client and need to be notified when server-named queue name changes after recovery.- Parameters:
listener- listener that observes queue name changes after recovery
-
removeQueueRecoveryListener
- Parameters:
listener- listener to be removed- See Also:
-
addConsumerRecoveryListener
Not part of the public API. Mean to be used by JVM RabbitMQ clients that build on top of the Java client and need to be notified when consumer tag changes after recovery.- Parameters:
listener- listener that observes consumer tag changes after recovery
-
removeConsumerRecoveryListener
- Parameters:
listener- listener to be removed- See Also:
-
getRecoveredQueueNameSupplier
RecoveredQueueNameSupplier getRecoveredQueueNameSupplier() -
beginAutomaticRecovery
- Throws:
InterruptedException
-
recoverShutdownListeners
-
recoverBlockedListeners
-
recoverConnection
- Throws:
InterruptedException
-
recoverChannels
-
recoverChannel
- Throws:
IOException
-
notifyRecoveryListenersComplete
private void notifyRecoveryListenersComplete() -
notifyRecoveryListenersStarted
private void notifyRecoveryListenersStarted() -
notifyTopologyRecoveryListenersStarted
private void notifyTopologyRecoveryListenersStarted() -
recoverChannelAndTopology
Recover a closed channel and all topology (i.e. RecordedEntities) associated to it. Any errors will be sent to thegetExceptionHandler().- Parameters:
channel- channel to recover- Throws:
IllegalArgumentException- if this channel is not owned by this connection
-
recoverTopology
-
recoverExchange
-
recoverQueue
Recover the queue. Any exceptions during recovery will be delivered to the connection'sExceptionHandler.- Parameters:
oldName- queue nameq- recorded queueretry- whether to retry the recovery if an error occurs and a RetryHandler was configured on the connection
-
recoverQueue
Recover the queue. Errors are not retried and not delivered to the connection'sExceptionHandler- Parameters:
oldName- queue nameq- recorded queue- Throws:
Exception- if an error occurs recovering the queue
-
internalRecoverQueue
- Throws:
Exception
-
recoverBinding
-
recoverConsumer
Recover the consumer. Any exceptions during recovery will be delivered to the connection'sExceptionHandler.- Parameters:
tag- consumer tagconsumer- recorded consumerretry- whether to retry the recovery if an error occurs and a RetryHandler was configured on the connection
-
recoverConsumer
Recover the consumer. Errors are not retried and not delivered to the connection'sExceptionHandler- Parameters:
tag- consumer tagconsumer- recorded consumer- Throws:
Exception- if an error occurs recovering the consumer
-
internalRecoverConsumer
private void internalRecoverConsumer(String tag, RecordedConsumer consumer, boolean retry) throws Exception - Throws:
Exception
-
wrapRetryIfNecessary
private <T> RetryResult wrapRetryIfNecessary(RecordedEntity entity, Callable<T> recoveryAction) throws Exception - Throws:
Exception
-
propagateQueueNameChangeToBindings
-
propagateQueueNameChangeToConsumers
-
recoverEntitiesAsynchronously
private void recoverEntitiesAsynchronously(ExecutorService executor, Collection<? extends RecordedEntity> recordedEntities) throws InterruptedException - Throws:
InterruptedException
-
groupEntitiesByChannel
private <E extends RecordedEntity> List<Callable<Object>> groupEntitiesByChannel(Collection<E> entities) -
recordQueueBinding
-
deleteRecordedQueueBinding
-
recordExchangeBinding
-
deleteRecordedExchangeBinding
-
recordQueue
-
recordQueue
-
deleteRecordedQueue
-
excludeQueueFromRecovery
Exclude the queue from the list of queues to recover after connection failure. Intended to be used in usecases where you want to remove the queue from this connection's recovery list but don't want to delete the queue from the server.- Parameters:
queue- queue name to exclude from recorded recovery queuesifUnused- if true, the RecordedQueue will only be excluded if no local consumers are using it.
-
recordExchange
-
deleteRecordedExchange
-
recordConsumer
-
deleteRecordedConsumer
-
maybeDeleteRecordedAutoDeleteQueue
-
maybeDeleteRecordedAutoDeleteExchange
-
hasMoreDestinationsBoundToExchange
-
hasMoreConsumersOnQueue
-
removeBindingsWithDestination
-
getRecordedQueues
-
getRecordedExchanges
-
getRecordedBindings
-
getRecordedConsumers
-
toString
-
getId
Public API - Returns a unique ID for this connection. This ID must be unique, otherwise some services like the metrics collector won't work properly. This ID doesn't have to be provided by the client, services that require it will be assigned automatically if not set.- Specified by:
getIdin interfaceConnection- Returns:
- unique ID for this connection.
-
setId
Public API - Sets a unique ID for this connection. This ID must be unique, otherwise some services like the metrics collector won't work properly. This ID doesn't have to be provided by the client, services that require it will be assigned automatically if not set.- Specified by:
setIdin interfaceConnection
-