围绕使用 @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 所说,自定义错误处理程序也可以工作。
我想要的是围绕所有用@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 所说,自定义错误处理程序也可以工作。