Логика в реализациях контейнера слушателя выглядит следующим образом:
if (e.getCause() instanceof ShutdownSignalException
&& e.getCause().getMessage().contains("in exclusive use")) {
getExclusiveConsumerExceptionLogger().log(logger,
"Exclusive consumer failure", e.getCause());
publishConsumerFailedEvent("Consumer raised exception, attempting restart", false, e);
}
Итак, мы действительно генерируем событие ListenerContainerConsumerFailedEvent
, и вы можете отследить сообщение о причине, как мы это делаем в рамках, но наС другой стороны, вы можете просто ввести свой собственный ConditionalExceptionLogger
:
/**
* Set a {@link ConditionalExceptionLogger} for logging exclusive consumer failures. The
* default is to log such failures at WARN level.
* @param exclusiveConsumerExceptionLogger the conditional exception logger.
* @since 1.5
*/
public void setExclusiveConsumerExceptionLogger(ConditionalExceptionLogger exclusiveConsumerExceptionLogger) {
и поймать такую исключительную ситуацию там.
Также вы можете использовать RabbitUtils.isExclusiveUseChannelClose(cause)
в своем коде:
/**
* Return true if the {@link ShutdownSignalException} reason is AMQP.Channel.Close
* and the operation that failed was basicConsumer and the failure text contains
* "exclusive".
* @param sig the exception.
* @return true if the declaration failed because of an exclusive queue.
*/
public static boolean isExclusiveUseChannelClose(ShutdownSignalException sig) {