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

Aspect around methods annotated with @RabbitHandler

我想要的是围绕所有用@RabbitHandler 注释的方法设置一个方面,这样 AssertionErrors 就不会终止处理程序线程。

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

动机:除了这些 AssertionErrors 之外,我还想使用其他错误处理,它运行良好。

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

@Aspect
public class RabbitAssertionErrorHandlerAspect {

  @Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitHandler)")
  public Object intercept(ProceedingJoinPoint pjp) throws Throwable {
    try {
      return pjp.proceed();
    } catch (AssertionError e) {
      throw new RuntimeException(e);
    }
  }
}

一切都很好,很优雅,但没有被调用。我认为这与最初发现这些方法的方式有关。

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

class 上的 @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 方式。

它适用于 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 所说,自定义错误处理程序也可以工作。