Сопоставление RabbitListenerExceptionHandler с помощью Micronaut Global ExceptionHandler

Я пытаюсь обработать исключение, созданное прослушивателем Rabbit, и сообщить об ошибке конечной точке Rest.

Слушатель кролика

@Queue(ProductTopicConstants.GET_PRODUCT)
    public ProductViewModel find(String id) {
        try {
            LOG.info(String.format("Listener --> Getting product for specified id = %s", id));
            ProductSearchCriteria criteria = new ProductSearchCriteria();
            criteria.setId(id);
            Bson query = QueryBuilder.QueryBuilder(criteria, Bson.class).get(0);
            ProductViewModel productViewModel = Single.fromPublisher(
                    repository.getCollection(ProductConstrants.PRODUCT_COLLECTION_NAME, Product.class)
                            .find(query)).map(successValue -> {
                return new ProductViewModel(
                        successValue.getId().toString(),
                        successValue.getName(),
                        successValue.getDescription(),
                        successValue.getPrice()
                );
            }).blockingGet();
            return productViewModel;
        } catch (Exception ex) {
            throw ex;
        }
    }

От слушателя я вызвал исключение, и это дескриптор в RabbitListenerExceptionHandler, как показано ниже.

@Singleton
@Primary
@Replaces(DefaultRabbitListenerExceptionHandler.class)
public class RabbitListenerExceptionHandler implements io.micronaut.rabbitmq.exception.RabbitListenerExceptionHandler {
    private static final Logger LOG = LoggerFactory.getLogger(RabbitListenerExceptionHandler.class);
    @Override
    public void handle(RabbitListenerException exception) {
        if (LOG.isErrorEnabled()) {
            Optional<RabbitConsumerState> messageState = exception.getMessageState();
            if (messageState.isPresent()) {
                //LOG.error("Error processing a message for RabbitMQ consumer [" + exception.getListener() + "]", exception);
                throw new GlobalException();
            } else {
                LOG.error("RabbitMQ consumer [" + exception.getListener() + "] produced an error", exception);
            }
        }
    }
}

Теперь у меня есть глобальный обработчик исключений, который обрабатывает HTTP-запросы и ответы.

public class GlobalException extends RuntimeException{
}

@Produces
@Singleton
@Requires(classes = {GlobalException.class, ExceptionHandler.class})
public class GlobalExceptionHandler implements ExceptionHandler<GlobalException, HttpResponse> {

    @Override
    public HttpResponse handle(HttpRequest request, GlobalException exception) {
        return HttpResponse.ok(0);
    }
}

Когда у меня throw new GlobalException(); из RabbitListenerExceptionHandler, исключение не наблюдается в GlobalExceptionHandler

Я получаю исключение как

fete.bird.common.extension.GlobalException: null
    at fete.bird.common.extension.RabbitListenerExceptionHandler.handle(RabbitListenerExceptionHandler.java:25)
    at fete.bird.common.extension.RabbitListenerExceptionHandler.handle(RabbitListenerExceptionHandler.java:14)
    at io.micronaut.rabbitmq.intercept.RabbitMQConsumerAdvice.handleException(RabbitMQConsumerAdvice.java:343)
    at io.micronaut.rabbitmq.intercept.RabbitMQConsumerAdvice.access$600(RabbitMQConsumerAdvice.java:67)
    at io.micronaut.rabbitmq.intercept.RabbitMQConsumerAdvice$1.doHandleDelivery(RabbitMQConsumerAdvice.java:255)
    at io.micronaut.rabbitmq.intercept.RabbitMQConsumerAdvice$1.handleDelivery(RabbitMQConsumerAdvice.java:284)
    at com.rabbitmq.client.impl.ConsumerDispatcher$5.run(ConsumerDispatcher.java:149)
    at com.rabbitmq.client.impl.ConsumerWorkService$WorkPoolRunnable.run(ConsumerWorkService.java:104)
    at io.micronaut.scheduling.instrument.InvocationInstrumenterWrappedRunnable.run(InvocationInstrumenterWrappedRunnable.java:47)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
    at java.base/java.lang.Thread.run(Thread.java:832)
08:41:35.266 [RxComputationThreadPool-3] ERROR i.m.h.s.netty.RoutingInBoundHandler - Unexpected error occurred: The source did not signal an event for 10000000000 nanoseconds and has been terminated.
java.util.concurrent.TimeoutException: The source did not signal an event for 10000000000 nanoseconds and has been terminated.
    at io.reactivex.internal.operators.flowable.FlowableTimeoutTimed$TimeoutSubscriber.onTimeout(FlowableTimeoutTimed.java:139)
    at io.reactivex.internal.operators.flowable.FlowableTimeoutTimed$TimeoutTask.run(FlowableTimeoutTimed.java:170)
    at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
    at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
    at java.base/java.lang.Thread.run(Thread.java:832)

person San Jaisy    schedule 12.12.2020    source источник


Ответы (1)


Обработчики исключений, используемые для HTTP, не имеют никакого отношения к тем, которые используются для обработки исключений обмена сообщениями, и они не предназначены для вызова в результате исключений, генерируемых слушателями или обработчиками исключений слушателя.

person James Kleeh    schedule 12.12.2020
comment
Спасибо, приятель, это их способ обработки исключений обмена сообщениями и возврата HTTP-ответа. - person San Jaisy; 12.12.2020
comment
Как мы обрабатываем RabbitListenerException на стороне клиента? Клиент должен отображать что-то при ошибке из RabbitListenerException ?? Как мы бросаем HTTP-код с сообщением от RabbitListenerException - person San Jaisy; 12.12.2020