Я пытался сделать заголовок как можно более явным и простым.
По сути, мне нужно перехватить использование аннотаций @Input и @Output в облачном потоке.Это необходимо для автоматического добавления определенного ChannelInterceptor в каждый MessageChannel.(Поведение в методе preSend будет немного отличаться, независимо от того, было ли сообщение создано или использовано).
Например, если я объявлю этот совет
@Around("@annotation(org.springframework.cloud.stream.annotation.Input)")
public Object interceptInput(ProceedingJoinPoint joinPoint) throws Throwable {
LOG.debug("Intercepted @Input from method : {}", joinPoint.getSignature());
Object returnValue = null;
try {
returnValue = joinPoint.proceed();
ChannelInterceptorManager.addInputInterceptor((AbstractMessageChannel)returnValue);
} catch (Exception e) {
LOG.warn("@Input error", e);
}
return returnValue;
}
, и я объявлю этот пример класса
@EnableBinding(Sink.class)
@Component
public class MyClass {
@StreamListener(Sink.INPUT)
public void handle(Object message) {
// preSend has been called before this method
}
}
Это отлично работало с Spring Boot 2.0.1, но не с Spring Boot 2.0.2, и я изо всех сил пытаюсь понять, почему.
Я не пробовал другое Cloudаннотации потока, но базовый Aop работает нормально.
Имейте в виду, что это предназначено для использования в JAR, поэтому я заранее не знаю классов или названий каналов, которые будут использоваться, янужно, чтобы это было автоматически и прозрачно для разработчика.
Спасибо!
Редактировать: Если кто-то, читающий это, не знаком с Cloud stream, интерфейс Sink объявляет метод, аннотированный @Input, так что включение привязки к нему сделает свое дело.