Gibt es eine Möglichkeit zum Abfangen von Aufrufen von Bean-Methoden, die mit @RabbitListener kommentiert wurden, ohne AspectJ zu verwenden.Spring Rabbit: Intercept-Methodenaufrufe mit @RabbitListener ohne AspectJ-Verwendung kommentiert
Der Code ist so etwas wie dieses
@OtherAnnotation
@RabbitListener
public void do(Message message)
Ich brauche alle Anrufe @RabbitListener Methode abfangen, wenn die Methode @OtherAnnotation Annotation hat.
UPDATE:
Ich konnte es Lösung mit Gary Russell zu arbeiten.
public class CustomRabbitListenerAnnotationBeanPostProcessor extends RabbitListenerAnnotationBeanPostProcessor {
@Override
protected void processAmqpListener(RabbitListener rabbitListener, final Method method, Object bean, String beanName) {
if (method.isAnnotationPresent(OtherAnnotation.class)) {
ProxyFactory proxyFactory = new ProxyFactory(bean);
proxyFactory.addAdvisor(new StaticMethodMatcherPointcutAdvisor(new OtherAnnotationInterceptor()) {
@Override
public boolean matches(Method advisorMethod, Class<?> targetClass) {
return advisorMethod.equals(method);
}
});
Object proxiedBean = proxyFactory.getProxy();
super.processAmqpListener(rabbitListener, method, proxiedBean, beanName);
} else {
super.processAmqpListener(rabbitListener, method, bean, beanName);
}
}
}
Die Bohne Definition ist wie:
@Bean(name = RabbitListenerConfigUtils.RABBIT_LISTENER_ANNOTATION_PROCESSOR_BEAN_NAME)
public CustomRabbitListenerAnnotationBeanPostProcessor customRabbitListenerAnnotationBeanPostProcessor() {
return new CustomRabbitListenerAnnotationBeanPostProcessor();
}
Es ist ein bisschen hässlich, aber es funktioniert. Wenn jemand eine bessere Lösung hat, teilen Sie es bitte mit.
kann es nicht zur Advice-Kette hinzufügen, da der Pointcut für die Advice-Chain auf der Methode 'public abstract void org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer $ ContainerDelegate.invokeListener' und nicht auf der mit '@ RabitListener' gekennzeichneten Methode liegt – lolotron
Ja, natürlich, tut mir leid - dieser Hinweis wird ausgeführt, bevor die Nachricht konvertiert wird. –
Ich aktualisierte meine Frage mit der Lösung mit Ihrer ersten Annäherung.Es ist ein bisschen hässlich, aber es funktioniert. Danke vielmals! – lolotron