【问题标题】:hide runtime exception in RabbitMQ listener在 RabbitMQ 监听器中隐藏运行时异常
【发布时间】:2018-05-15 12:35:56
【问题描述】:

在某些情况下,我使用了一些异常来拒绝消息,但在某些情况下是故意发生的,但在控制台中显示的异常乍一看似乎不太好。

如何在控制台/文件上隐藏该特定异常

我正在使用 spring-boot 和默认记录器!

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 我没有记录!当您抛出某个异常以正常重新排队消息时,它将由 jvm/logger 记录
  • @Ben 请仔细阅读问题,“控制台中的异常乍一看似乎不太好”!
  • 除了不是正确的英语(这可能是我不明白你的意思的原因)你说的是:你有一个异常显示在控制台上。所以我说:为什么不修复异常而不是尝试隐藏输出?

标签: java spring spring-boot rabbitmq logback


【解决方案1】:

在您的日志记录配置中,为

设置日志级别
org.springframework.amqp.rabbit.listener.ConditionalRejectingErrorHandler

到 ERROR(该消息记录在 WARN 级别)。

使用 Spring Boot,您可以简单地添加...

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

...到您的 application.properties(或 .yml)文件。

编辑

如果您希望做一些不同的事情(例如记录某些异常),您可以复制ConditionalRejectingErrorHandler 并在handleError() 方法中进行更改。 code is here

然后,您将使用自定义错误处理程序配置侦听器容器(或侦听器容器工厂)。

【讨论】:

  • 你回答了这个问题,我标记为已回答,但还有另一个隐含的问题,如果我们想打印一些东西而不是整个堆栈跟踪!
  • 您需要替换默认错误处理程序 - 请参阅我的答案的编辑。
  • 太棒了!我可以简单地扩展 ConditionalRejectingErrorHandler 并制作自己的逻辑!
  • 不幸的是,它有一些私有方法,所以不太容易扩展;我正在解决这个问题。 github.com/spring-projects/spring-amqp/pull/750
  • 否;用户异常总是这样包装;使用getCause()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
相关资源
最近更新 更多