首页 > 解决方案 > 拦截骆驼@Consume

问题描述

我有一个现有应用程序,它使用 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 代理,这似乎失败了。

我也尝试过使用各种 Camel Intercept 路线并添加自定义 InterceptStrategy 但似乎上面的示例没有创建 Camel 路线,因此没有被拦截。

编辑:在进一步调查中,似乎可以使用骆驼拦截这些端点,但前提是骆驼上下文中至少定义了 1 条其他路线?

@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它不是的路由,我的拦截器就会被触发?

任何帮助将不胜感激。

标签: spring-bootapache-camelaopspring-aop

解决方案


推荐阅读