拦截骆驼@Consume

时间:2019-05-22 09:06:33

标签: spring-boot apache-camel aop spring-aop

我有一个现有的应用程序,该应用程序正在使用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拦截路线并添加自定义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路由不是,则会触发我的拦截器?

任何帮助将不胜感激。

0 个答案:

没有答案