У меня есть приложение, которое использует Apache Camel для отправки сообщений на конечные точки SEDA для асинхронной обработки и хотело бы перехватывать вызовы этих методов для инструментария.
Пример кода:
@Component
public class CamelMessageService {
private static final Logger log = LoggerFactory.getLogger(CamelMessageService.class);
public static final String QUEUE = "seda:message";
@Resource
private ProducerTemplate producerTemplate;
public void send() {
producerTemplate.sendBody(QUEUE, "Hello World");
}
@Consume(uri = QUEUE)
public void receive(@Body String payload) {
log.info("Received message {}", payload);
}
}
Есть ли способ перехватить все методы, отмеченные @Consume
перед вызовом.Я посмотрел на подход, основанный на AOP, но, похоже, он упал из-за существующего Spring / Camel-прокси этих классов.
Я также пытался использовать различные маршруты перехвата верблюдов и добавлять пользовательские InterceptStrategy, но кажется, что в приведенном выше примере не создается маршрут верблюдов, поэтому он не перехватывается.
РЕДАКТИРОВАТЬ : При дальнейшем исследовании кажется, что эти конечные точки могут быть перехвачены с использованием верблюда, но только если в контексте верблюда определен хотя бы один другой маршрут?
@Component
class MyRouteBuilder extends RouteBuilder {
private static final Logger log = LoggerFactory.getLogger(MyRouteBuilder.class);
public void configure() {
interceptSendToEndpoint(CamelMessageService.QUEUE)
.process(exchange -> log.info("intercepted exchange {}", exchange));
from("timer:hello?period={{timer.period}}").routeId("hello").routeGroup("hello-group")
.transform().simple("yo")
.filter(simple("${body} contains 'foo'"))
.to("log:foo")
.end()
.to("stream:out");
}
}
Если я запускаю это приложение с помощью Route Builder выше, тогда мой перехватчик срабатывает, если, однако, я закомментирую маршрут hello
, это не так?
Любая помощь будет принята с благодарностью.