围绕使用@RabbitHandler注释的方法的方面

时间:2018-01-18 14:58:44

标签: spring aspectj spring-amqp spring-rabbitmq

我想要的是围绕用@RabbitHandler注释的所有方法的一个方面,以便AssertionErrors不会杀死处理程序线程。

我只想将它们包装在RuntimeExceptions中并重新抛出。

动机:除了这些AssertionErrors之外,还有其他我想要使用的错误处理。

我可以在每个方法中为AssertionErrors添加一个try-catch,但是有太多的地方,而我正在考虑使用方面。

  [
   ["CHN", ["1000", "2000"], ["A", "B"]], 
   ["FRA", ["3000", "4000"], ["C", "D"]]
  ]

所有优雅而优雅,但它不会被调用。我认为这与首先发现这些方法的方式有关。

任何人看到的合理解决方法?

2 个答案:

答案 0 :(得分:1)

具有@RabbitListener的类的@RabbitHandler可以配置为:

/**
 * Set an {@link org.springframework.amqp.rabbit.listener.RabbitListenerErrorHandler}
 * to invoke if the listener method throws an exception.
 * @return the error handler.
 * @since 2.0
 */
String errorHandler() default "";

因此,请考虑改为使用自定义RabbitListenerErrorHandler方式。

答案 1 :(得分:0)

适用于Spring AOP ......

@SpringBootApplication
public class So48324210Application {

    public static void main(String[] args) {
        SpringApplication.run(So48324210Application.class, args);
    }

    @Bean
    public MethodInterceptor interceptor() {
        return i -> {
            try {
                System.out.println("here");
                return i.proceed();
            }
            catch (AssertionError e) {
                throw new RuntimeException(e);
            }
        };
    }

    @Bean
    public static BeanNameAutoProxyCreator proxyCreator() {
        BeanNameAutoProxyCreator pc = new BeanNameAutoProxyCreator();
        pc.setBeanNames("foo");
        pc.setInterceptorNames("interceptor");
        return pc;
    }

    @Bean
    public Foo foo() {
        return new Foo();
    }

    public static class Foo {

        @RabbitListener(queues = "one")
        public void listen(Object in) {
            System.out.println(in);
        }

    }

}

或者,正如Artem所说,自定义错误处理程序也会起作用。