Перехватывающий верблюд @Consume - PullRequest
0 голосов
/ 22 мая 2019

У меня есть приложение, которое использует 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, это не так?

Любая помощь будет принята с благодарностью.

...