Я использовал исключение, чтобы отклонить сообщение в некоторых случаях, которые произошли намеренно, но показали исключение в консоли, что на первый взгляд выглядит не очень хорошо.
как я могу скрыть это конкретное исключение от входа в консоль / файл
Я использую весеннюю загрузку и регистраторы по умолчанию!
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
У вас есть исключение, которое "не выглядит нормально", и ваше решение это скрывает? Вы думали о ... ну, как с этим справиться?
@ Евгений Я не веду журнал! когда вы генерируете определенное исключение, чтобы повторно поставить сообщение в очередь, оно обычно регистрируется jvm / logger
@Ben, пожалуйста, внимательно прочтите вопрос "исключение в консоли, которое на первый взгляд выглядит не очень хорошо"!
Помимо неправильного английского (возможно, поэтому я не понимаю, что вы имеете в виду) вы говорите: у вас есть исключение, которое отображается на консоли. Поэтому я говорю: почему бы не исправить исключение вместо того, чтобы пытаться скрыть вывод?
Вы пытаетесь лечить симптомы, а не проблему.
@Ben, ты прав, я должен сказать "показано" относительно комментариев! Мне нужно, чтобы сообщение было отправлено повторно! аналогично, когда вы хотите откатить транзакцию! для отката транзакции необходимо создать исключение во время выполнения!
Вам нужно показать фактическое сообщение журнала, которое вы хотите подавить.
@GaryRussell Я обновлю вопрос, чтобы иметь пример и сообщение об исключении, которое нужно подавить!




В конфигурации ведения журнала установите уровень журнала для
org.springframework.amqp.rabbit.listener.ConditionalRejectingErrorHandler
на ОШИБКУ (это сообщение регистрируется на уровне ПРЕДУПРЕЖДЕНИЯ).
С помощью Spring Boot вы можете просто добавить ...
logging.level.org.springframework.amqp.rabbit.listener.ConditionalRejectingErrorHandler=ERROR
... в ваш файл application.properties (или .yml).
РЕДАКТИРОВАТЬ
Если вы хотите сделать что-то другое (например, зарегистрировать определенные исключения), вы можете сделать копию ConditionalRejectingErrorHandler и внести изменения в метод handleError(). Файл код здесь.
Затем вы должны сконфигурировать контейнер слушателя (или фабрику контейнеров слушателя) с вашим пользовательским обработчиком ошибок.
вы ответили на вопрос, и я пометил как отвеченный, но есть еще один неявный вопрос, если мы хотим напечатать что-то вместо всей трассировки стека!
Вам нужно будет заменить обработчик ошибок по умолчанию - см. Отредактированный мой ответ.
классно! Я могу просто расширить ConditionalRejectingErrorHandler и создать свою собственную логику!
К сожалению, у него есть несколько частных методов, поэтому расширить его не так-то просто; Я это исправляю. github.com/spring-projects/spring-amqp/pull/750
пока я могу скопировать сам класс и изменить ту часть, которая нам нужна, спасибо!
Вы можете расширить его, но вам нужно будет скопировать метод causeChainContainsARADRE(), чтобы вы могли вызывать его из handleError(). Он будет защищен в следующей версии. github.com/spring-projects/spring-amqp/pull/750
Спасибо! @ Гэри, есть еще одна вещь, о которой тебе нужно позаботиться и в следующей версии. ошибка обработки почему типом throwable является ListenerExecutionFailedException, оно должно быть таким же, как исключение, которое я выбрасываю в Listener. Представьте, что у меня есть больше случаев для обработки в ConditionalRejectingErrorHandler!
Нет; пользовательские исключения всегда обертываются таким образом; используйте getCause().
вы сэкономили много времени! Еще раз спасибо
еще вопрос к вам @Gary stackoverflow.com/questions/51115222/…
просто не регистрировать это? но, во-первых, это выглядит очень плохо