Class AutorecoveringConnection

    • Method Detail

      • setupErrorOnWriteListenerForPotentialRecovery

        private void setupErrorOnWriteListenerForPotentialRecovery()
      • createChannel

        public Channel createChannel​(int channelNumber)
                              throws java.io.IOException
        Description copied from interface: Connection
        Create a new channel, using the specified channel number if possible.

        Use Connection.openChannel(int) if you want to use an Optional to deal with a value.

        Specified by:
        createChannel in interface Connection
        Parameters:
        channelNumber - the channel number to allocate
        Returns:
        a new channel descriptor, or null if this channel number is already in use
        Throws:
        java.io.IOException - if an I/O problem is encountered
        See Also:
        Connection.createChannel(int)
      • wrapChannel

        private Channel wrapChannel​(RecoveryAwareChannelN delegateChannel)
        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.
      • getServerProperties

        public java.util.Map<java.lang.String,​java.lang.Object> getServerProperties()
        Description copied from interface: Connection
        Retrieve the server properties.
        Specified by:
        getServerProperties in interface Connection
        Returns:
        a map of the server properties. This typically includes the product name and version of the server.
        See Also:
        Connection.getServerProperties()
      • getClientProperties

        public java.util.Map<java.lang.String,​java.lang.Object> getClientProperties()
        Description copied from interface: Connection
        Get a copy of the map of client properties sent to the server
        Specified by:
        getClientProperties in interface Connection
        Returns:
        a copy of the map of client properties
        See Also:
        Connection.getClientProperties()
      • getFrameMax

        public int getFrameMax()
        Description copied from interface: Connection
        Get the negotiated maximum frame size.
        Specified by:
        getFrameMax in interface Connection
        Returns:
        the maximum frame size, in octets; zero if unlimited
        See Also:
        Connection.getFrameMax()
      • getChannelMax

        public int getChannelMax()
        Description copied from interface: Connection
        Get the negotiated maximum channel number. Usable channel numbers range from 1 to this number, inclusive.
        Specified by:
        getChannelMax in interface Connection
        Returns:
        the maximum channel number permitted for this connection.
        See Also:
        Connection.getChannelMax()
      • isOpen

        public boolean isOpen()
        Description copied from interface: ShutdownNotifier
        Determine 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:
        isOpen in interface ShutdownNotifier
        Returns:
        true when component is open, false otherwise
        See Also:
        ShutdownNotifier.isOpen()
      • close

        public void close()
                   throws java.io.IOException
        Description copied from interface: Connection
        Close this connection and all its channels with the AMQP.REPLY_SUCCESS close code and message 'OK'. Waits for all the close operations to complete.
        Specified by:
        close in interface java.lang.AutoCloseable
        Specified by:
        close in interface java.io.Closeable
        Specified by:
        close in interface Connection
        Throws:
        java.io.IOException - if an I/O problem is encountered
        See Also:
        Connection.close()
      • close

        public void close​(int timeout)
                   throws java.io.IOException
        Description copied from interface: Connection
        Close this connection and all its channels with the AMQP.REPLY_SUCCESS close code and message 'OK'. This method behaves in a similar way as Connection.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:
        close in interface Connection
        Parameters:
        timeout - timeout (in milliseconds) for completing all the close-related operations, use -1 for infinity
        Throws:
        java.io.IOException - if an I/O problem is encountered
        See Also:
        Connection.close(int)
      • close

        public void close​(int closeCode,
                          java.lang.String closeMessage,
                          int timeout)
                   throws java.io.IOException
        Description copied from interface: Connection
        Close 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:
        close in interface Connection
        Parameters:
        closeCode - the close code (See under "Reply Codes" in the AMQP specification)
        closeMessage - a message indicating the reason for closing the connection
        timeout - timeout (in milliseconds) for completing all the close-related operations, use -1 for infinity
        Throws:
        java.io.IOException - if an I/O problem is encountered
        See Also:
        Connection.close(int, String, int)
      • abort

        public void abort()
        Description copied from interface: Connection
        Abort this connection and all its channels with the AMQP.REPLY_SUCCESS close code and message 'OK'. Forces the connection to close. Any encountered exceptions in the close operations are silently discarded.
        Specified by:
        abort in interface Connection
        See Also:
        Connection.abort()
      • abort

        public void abort​(int closeCode,
                          java.lang.String closeMessage,
                          int timeout)
        Description copied from interface: Connection
        Abort 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:
        abort in interface Connection
        Parameters:
        closeCode - the close code (See under "Reply Codes" in the AMQP specification)
        closeMessage - a message indicating the reason for closing the connection
        timeout - timeout (in milliseconds) for completing all the close-related operations, use -1 for infinity
        See Also:
        Connection.abort(int, String, int)
      • abort

        public void abort​(int closeCode,
                          java.lang.String closeMessage)
        Description copied from interface: Connection
        Abort 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:
        abort in interface Connection
        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:
        Connection.abort(int, String)
      • abort

        public void abort​(int timeout)
        Description copied from interface: Connection
        Abort this connection and all its channels with the AMQP.REPLY_SUCCESS close code and message 'OK'. This method behaves in a similar way as Connection.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:
        abort in interface Connection
        Parameters:
        timeout - timeout (in milliseconds) for completing all the close-related operations, use -1 for infinity
        See Also:
        Connection.abort(int)
      • getDelegate

        public AMQConnection getDelegate()
        Not supposed to be used outside of automated tests.
      • close

        public void close​(int closeCode,
                          java.lang.String closeMessage)
                   throws java.io.IOException
        Description copied from interface: Connection
        Close this connection and all its channels. Waits for all the close operations to complete.
        Specified by:
        close in interface Connection
        Parameters:
        closeCode - the close code (See under "Reply Codes" in the AMQP specification)
        closeMessage - a message indicating the reason for closing the connection
        Throws:
        java.io.IOException - if an I/O problem is encountered
        See Also:
        Connection.close(int, String)
      • shouldTriggerConnectionRecovery

        protected boolean shouldTriggerConnectionRecovery​(ShutdownSignalException cause)
      • addQueueRecoveryListener

        public void addQueueRecoveryListener​(QueueRecoveryListener listener)
        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
      • addConsumerRecoveryListener

        public void addConsumerRecoveryListener​(ConsumerRecoveryListener listener)
        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
      • beginAutomaticRecovery

        private void beginAutomaticRecovery()
                                     throws java.lang.InterruptedException
        Throws:
        java.lang.InterruptedException
      • recoverConnection

        private RecoveryAwareAMQConnection recoverConnection()
                                                      throws java.lang.InterruptedException
        Throws:
        java.lang.InterruptedException
      • recoverChannel

        public void recoverChannel​(AutorecoveringChannel channel)
                            throws java.io.IOException
        Throws:
        java.io.IOException
      • notifyRecoveryListenersComplete

        private void notifyRecoveryListenersComplete()
      • notifyRecoveryListenersStarted

        private void notifyRecoveryListenersStarted()
      • notifyTopologyRecoveryListenersStarted

        private void notifyTopologyRecoveryListenersStarted()
      • recoverChannelAndTopology

        public void recoverChannelAndTopology​(AutorecoveringChannel channel)
        Recover a closed channel and all topology (i.e. RecordedEntities) associated to it. Any errors will be sent to the getExceptionHandler().
        Parameters:
        channel - channel to recover
        Throws:
        java.lang.IllegalArgumentException - if this channel is not owned by this connection
      • recoverTopology

        private void recoverTopology​(java.util.concurrent.ExecutorService executor)
      • recoverExchange

        public void recoverExchange​(RecordedExchange x,
                                    boolean retry)
      • recoverQueue

        public void recoverQueue​(java.lang.String oldName,
                                 RecordedQueue q,
                                 boolean retry)
        Recover the queue. Any exceptions during recovery will be delivered to the connection's ExceptionHandler.
        Parameters:
        oldName - queue name
        q - recorded queue
        retry - whether to retry the recovery if an error occurs and a RetryHandler was configured on the connection
      • recoverQueue

        void recoverQueue​(java.lang.String oldName,
                          RecordedQueue q)
                   throws java.lang.Exception
        Recover the queue. Errors are not retried and not delivered to the connection's ExceptionHandler
        Parameters:
        oldName - queue name
        q - recorded queue
        Throws:
        java.lang.Exception - if an error occurs recovering the queue
      • internalRecoverQueue

        private void internalRecoverQueue​(java.lang.String oldName,
                                          RecordedQueue q,
                                          boolean retry)
                                   throws java.lang.Exception
        Throws:
        java.lang.Exception
      • recoverBinding

        public void recoverBinding​(RecordedBinding b,
                                   boolean retry)
      • recoverConsumer

        public void recoverConsumer​(java.lang.String tag,
                                    RecordedConsumer consumer,
                                    boolean retry)
        Recover the consumer. Any exceptions during recovery will be delivered to the connection's ExceptionHandler.
        Parameters:
        tag - consumer tag
        consumer - recorded consumer
        retry - whether to retry the recovery if an error occurs and a RetryHandler was configured on the connection
      • recoverConsumer

        void recoverConsumer​(java.lang.String tag,
                             RecordedConsumer consumer)
                      throws java.lang.Exception
        Recover the consumer. Errors are not retried and not delivered to the connection's ExceptionHandler
        Parameters:
        tag - consumer tag
        consumer - recorded consumer
        Throws:
        java.lang.Exception - if an error occurs recovering the consumer
      • internalRecoverConsumer

        private void internalRecoverConsumer​(java.lang.String tag,
                                             RecordedConsumer consumer,
                                             boolean retry)
                                      throws java.lang.Exception
        Throws:
        java.lang.Exception
      • wrapRetryIfNecessary

        private <T> RetryResult wrapRetryIfNecessary​(RecordedEntity entity,
                                                     java.util.concurrent.Callable<T> recoveryAction)
                                              throws java.lang.Exception
        Throws:
        java.lang.Exception
      • propagateQueueNameChangeToBindings

        private void propagateQueueNameChangeToBindings​(java.lang.String oldName,
                                                        java.lang.String newName)
      • propagateQueueNameChangeToConsumers

        private void propagateQueueNameChangeToConsumers​(java.lang.String oldName,
                                                         java.lang.String newName)
      • recoverEntitiesAsynchronously

        private void recoverEntitiesAsynchronously​(java.util.concurrent.ExecutorService executor,
                                                   java.util.Collection<? extends RecordedEntity> recordedEntities)
                                            throws java.lang.InterruptedException
        Throws:
        java.lang.InterruptedException
      • groupEntitiesByChannel

        private <E extends RecordedEntity> java.util.List<java.util.concurrent.Callable<java.lang.Object>> groupEntitiesByChannel​(java.util.Collection<E> entities)
      • recordQueueBinding

        void recordQueueBinding​(AutorecoveringChannel ch,
                                java.lang.String queue,
                                java.lang.String exchange,
                                java.lang.String routingKey,
                                java.util.Map<java.lang.String,​java.lang.Object> arguments)
      • deleteRecordedQueueBinding

        boolean deleteRecordedQueueBinding​(AutorecoveringChannel ch,
                                           java.lang.String queue,
                                           java.lang.String exchange,
                                           java.lang.String routingKey,
                                           java.util.Map<java.lang.String,​java.lang.Object> arguments)
      • recordExchangeBinding

        void recordExchangeBinding​(AutorecoveringChannel ch,
                                   java.lang.String destination,
                                   java.lang.String source,
                                   java.lang.String routingKey,
                                   java.util.Map<java.lang.String,​java.lang.Object> arguments)
      • deleteRecordedExchangeBinding

        boolean deleteRecordedExchangeBinding​(AutorecoveringChannel ch,
                                              java.lang.String destination,
                                              java.lang.String source,
                                              java.lang.String routingKey,
                                              java.util.Map<java.lang.String,​java.lang.Object> arguments)
      • recordQueue

        void recordQueue​(java.lang.String queue,
                         RecordedQueue meta)
      • deleteRecordedQueue

        void deleteRecordedQueue​(java.lang.String queue)
      • excludeQueueFromRecovery

        public void excludeQueueFromRecovery​(java.lang.String queue,
                                             boolean ifUnused)
        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 queues
        ifUnused - if true, the RecordedQueue will only be excluded if no local consumers are using it.
      • recordExchange

        void recordExchange​(java.lang.String exchange,
                            RecordedExchange x)
      • deleteRecordedExchange

        void deleteRecordedExchange​(java.lang.String exchange)
      • recordConsumer

        void recordConsumer​(java.lang.String result,
                            RecordedConsumer consumer)
      • deleteRecordedConsumer

        RecordedConsumer deleteRecordedConsumer​(java.lang.String consumerTag)
      • maybeDeleteRecordedAutoDeleteQueue

        void maybeDeleteRecordedAutoDeleteQueue​(java.lang.String queue)
      • maybeDeleteRecordedAutoDeleteExchange

        void maybeDeleteRecordedAutoDeleteExchange​(java.lang.String exchange)
      • hasMoreDestinationsBoundToExchange

        boolean hasMoreDestinationsBoundToExchange​(java.util.List<RecordedBinding> bindings,
                                                   java.lang.String exchange)
      • hasMoreConsumersOnQueue

        boolean hasMoreConsumersOnQueue​(java.util.Collection<RecordedConsumer> consumers,
                                        java.lang.String queue)
      • removeBindingsWithDestination

        java.util.Set<RecordedBinding> removeBindingsWithDestination​(java.lang.String s)
      • getRecordedQueues

        public java.util.Map<java.lang.String,​RecordedQueue> getRecordedQueues()
      • getRecordedExchanges

        public java.util.Map<java.lang.String,​RecordedExchange> getRecordedExchanges()
      • getRecordedBindings

        public java.util.List<RecordedBinding> getRecordedBindings()
      • getRecordedConsumers

        public java.util.Map<java.lang.String,​RecordedConsumer> getRecordedConsumers()
      • toString

        public java.lang.String toString()
        Overrides:
        toString in class java.lang.Object
      • getId

        public java.lang.String 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:
        getId in interface Connection
        Returns:
        unique ID for this connection.
      • setId

        public void setId​(java.lang.String id)
        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:
        setId in interface Connection