我有一个现有的应用程序,该应用程序正在使用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
路由不是,则会触发我的拦截器?
任何帮助将不胜感激。