Скрыть исключение времени выполнения в слушателе RabbitMQ

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

как я могу скрыть это конкретное исключение от входа в консоль / файл

Я использую весеннюю загрузку и регистраторы по умолчанию!

public static class UndispatchException extends 
       AmqpRejectAndDontRequeueException{

    public UndispatchException() {
        super("Dispatch still looking for a driver");
    }

}

здесь список

@RabbitListener(queues = TEST_QUEUE)
public void handle(Dispatch in) {
    if (in.isRequeue()){
        log.debug("will reject the message");
        throw new UndispatchException();
    }
    log.debug("won't reject the message");

}

вот журнал, я хочу его спрятать! какой мандеторий потребуется повторно запросить сообщение в некоторых случаях!

2018-05-15 18:41:11.494  WARN 2709 --- [cTaskExecutor-1] s.a.r.l.ConditionalRejectingErrorHandler : Execution of Rabbit message listener failed.

org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener method 'public void com.amqp.handleException.demo.DemoApplication.handle(com.amqp.handleException.demo.DemoApplication$Dispatch)' threw exception
    at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:140) ~[spring-rabbit-1.7.7.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:106) ~[spring-rabbit-1.7.7.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:856) ~[spring-rabbit-1.7.7.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:779) ~[spring-rabbit-1.7.7.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$001(SimpleMessageListenerContainer.java:105) [spring-rabbit-1.7.7.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$1.invokeListener(SimpleMessageListenerContainer.java:208) ~[spring-rabbit-1.7.7.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.invokeListener(SimpleMessageListenerContainer.java:1349) [spring-rabbit-1.7.7.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:760) ~[spring-rabbit-1.7.7.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:1292) [spring-rabbit-1.7.7.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:1262) [spring-rabbit-1.7.7.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1800(SimpleMessageListenerContainer.java:105) [spring-rabbit-1.7.7.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1518) [spring-rabbit-1.7.7.RELEASE.jar:na]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_111]
Caused by: com.amqp.handleException.demo.DemoApplication$UndispatchException: Dispatch still looking for a driver
    at com.amqp.handleException.demo.DemoApplication.handle(DemoApplication.java:47) ~[classes/:na]
    at sun.reflect.GeneratedMethodAccessor38.invoke(Unknown Source) ~[na:na]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_111]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_111]
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:180) ~[spring-messaging-4.3.15.RELEASE.jar:4.3.15.RELEASE]
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:112) ~[spring-messaging-4.3.15.RELEASE.jar:4.3.15.RELEASE]
    at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:49) ~[spring-rabbit-1.7.7.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:126) ~[spring-rabbit-1.7.7.RELEASE.jar:na]
    ... 12 common frames omitted

просто не регистрировать это? но, во-первых, это выглядит очень плохо

Eugene 15.05.2018 14:38

У вас есть исключение, которое "не выглядит нормально", и ваше решение это скрывает? Вы думали о ... ну, как с этим справиться?

Ben 15.05.2018 14:38

@ Евгений Я не веду журнал! когда вы генерируете определенное исключение, чтобы повторно поставить сообщение в очередь, оно обычно регистрируется jvm / logger

user1115139 15.05.2018 16:15

@Ben, пожалуйста, внимательно прочтите вопрос "исключение в консоли, которое на первый взгляд выглядит не очень хорошо"!

user1115139 15.05.2018 16:15

Помимо неправильного английского (возможно, поэтому я не понимаю, что вы имеете в виду) вы говорите: у вас есть исключение, которое отображается на консоли. Поэтому я говорю: почему бы не исправить исключение вместо того, чтобы пытаться скрыть вывод?

Ben 15.05.2018 16:16

Вы пытаетесь лечить симптомы, а не проблему.

Ben 15.05.2018 16:17

@Ben, ты прав, я должен сказать "показано" относительно комментариев! Мне нужно, чтобы сообщение было отправлено повторно! аналогично, когда вы хотите откатить транзакцию! для отката транзакции необходимо создать исключение во время выполнения!

user1115139 15.05.2018 16:20

Вам нужно показать фактическое сообщение журнала, которое вы хотите подавить.

Gary Russell 15.05.2018 17:46

@GaryRussell Я обновлю вопрос, чтобы иметь пример и сообщение об исключении, которое нужно подавить!

user1115139 15.05.2018 17:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
9
1 037
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В конфигурации ведения журнала установите уровень журнала для

org.springframework.amqp.rabbit.listener.ConditionalRejectingErrorHandler

на ОШИБКУ (это сообщение регистрируется на уровне ПРЕДУПРЕЖДЕНИЯ).

С помощью Spring Boot вы можете просто добавить ...

logging.level.org.springframework.amqp.rabbit.listener.ConditionalRejectingErrorHandler=ERROR

... в ваш файл application.properties (или .yml).

РЕДАКТИРОВАТЬ

Если вы хотите сделать что-то другое (например, зарегистрировать определенные исключения), вы можете сделать копию ConditionalRejectingErrorHandler и внести изменения в метод handleError(). Файл код здесь.

Затем вы должны сконфигурировать контейнер слушателя (или фабрику контейнеров слушателя) с вашим пользовательским обработчиком ошибок.

вы ответили на вопрос, и я пометил как отвеченный, но есть еще один неявный вопрос, если мы хотим напечатать что-то вместо всей трассировки стека!

user1115139 15.05.2018 18:08

Вам нужно будет заменить обработчик ошибок по умолчанию - см. Отредактированный мой ответ.

Gary Russell 15.05.2018 18:13

классно! Я могу просто расширить ConditionalRejectingErrorHandler и создать свою собственную логику!

user1115139 15.05.2018 18:16

К сожалению, у него есть несколько частных методов, поэтому расширить его не так-то просто; Я это исправляю. github.com/spring-projects/spring-amqp/pull/750

Gary Russell 15.05.2018 18:27

пока я могу скопировать сам класс и изменить ту часть, которая нам нужна, спасибо!

user1115139 15.05.2018 18:30

Вы можете расширить его, но вам нужно будет скопировать метод causeChainContainsARADRE(), чтобы вы могли вызывать его из handleError(). Он будет защищен в следующей версии. github.com/spring-projects/spring-amqp/pull/750

Gary Russell 15.05.2018 18:31

Спасибо! @ Гэри, есть еще одна вещь, о которой тебе нужно позаботиться и в следующей версии. ошибка обработки почему типом throwable является ListenerExecutionFailedException, оно должно быть таким же, как исключение, которое я выбрасываю в Listener. Представьте, что у меня есть больше случаев для обработки в ConditionalRejectingErrorHandler!

user1115139 15.05.2018 18:37

Нет; пользовательские исключения всегда обертываются таким образом; используйте getCause().

Gary Russell 15.05.2018 18:40

вы сэкономили много времени! Еще раз спасибо

user1115139 15.05.2018 18:46

еще вопрос к вам @Gary stackoverflow.com/questions/51115222/…

user1115139 30.06.2018 15:12

Другие вопросы по теме