Я пишу Аспекты для методов, которые возвращают обещания. Рассмотрим следующий метод:
public Mono<Stream> publishToKafka(Stream s) {
//publishToKafka is asynchronous
return Mono.just(s).flatMap(worker::publishToKafka);
}
Я хочу кэшировать, если публикация sh прошла успешно или нет. Поскольку это междисциплинарная проблема, Aspect выглядит как лучший дизайн. Вот мой Аспект для этого.
@Around("@annotation....")
public Object cache() {
//get the data to cache from the annotation
Object result = pjp.proceed();
cache.cache("key","data");
return result;
}
Теперь, поскольку publishToKafka
является асинхронным, целевой метод возвращается, как только происходит переключение потока и вызывается cache.cache()
. Это не то, что я хочу. Я хочу, чтобы результат кэшировался, если событие было успешно опубликовано в Kafka. Следующий совет работает.
@Around("@annotation....")
public <T extends Stream<T>> Mono<T> cache() {
//get the data to cache from the annotation
return ((Mono<T>)pjp.proceed()).doOnNext(a -> cache.cache(key, data));
}
Я хочу понять, что здесь происходит. Это происходит во время сборки трубопровода? Или во время выполнения (pjp.proceed()
возвращает обещание), к которому мой совет добавляет оператор doOnNext
?
Мне нужно понять время сборки и выполнения в контексте этого примера.