【问题标题】:Why does this Apache Camel intercept not work?为什么这个 Apache Camel 拦截不起作用?
【发布时间】:2023-04-09 09:41:01
【问题描述】:

我有一个主路由构建器:

public class MainRouteBuilder extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        from("activemq:a.out").to("activemq:b.in");

        from("activemq:b.in").bean(MainMessageConsumer.class);
    }
}

我有第二个“拦截”路由构建器:

public class InterceptRouteBuilder extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        interceptSendToEndpoint("activemq:a.out").to("activemq:c.in").skipSendToOriginalEndpoint();

        from("activemq:c.in").bean(InterceptMessageConsumer.class);
    }
}

两者都注册到 CamelContext(首先注册 MainRouteBuilder,其次是 InterceptRouteBuilder)。但是,当我通过以下方式向“activemq:a.out”发送消息时:

public class App {

    @Produce(uri="activemq:a.out")
    private Producer producer;

    public void run() {
        producer.request("hello");
    }

}

消息仍然到达 MainMessageConsumer 而不是被拦截。我做错了什么?

【问题讨论】:

    标签: java apache-camel intercept


    【解决方案1】:

    拦截器仅适用于同一路由构建器类中的所有路由。如果你想让它同时工作,那么创建一个基类,并将拦截器放在那里,让其他路由扩展你的基类,并在配置方法中调用它的超级(例如OO继承)

    【讨论】:

    • 这是真的吗,或者在大多数情况下,除非它们在同一个路由构建器中,否则它不会起作用?我问是因为一个朋友刚刚向我展示了一个示例,他们在 xml 配置中定义了一堆路由,他正在使用 java routebuilder 中定义的路由进行拦截。
    • camel 文档还说“interceptSendToEndpoint 是动态的,因此如果构造了 Camel 在启动时不知道的动态 URI,它也会触发。”
    • 查看上面发布的答案
    【解决方案2】:

    似乎是,如果您使用 @Produce 注释创建生产者,则不会被拦截。而如果我说:

    @Bean
    public ProducerTemplate producerTemplate() {
        return camelContext().createProducerTemplate();
    }
    

    在我的应用程序配置中,使用它来代替它会被拦截。不确定这是否是预期的行为?

    【讨论】:

    • @Produce 在路由之前被初始化,并且你已经定义了它应该使用的端点,在初始化时不会被拦截。您创建的生产者模板没有设置端点 uri,因此在第一次请求时会在运行时查找端点,并且该端点现在已被拦截
    • 我已经记录了一张票来改进这一点,所以我们在启动注入 POJO 的生产者/消费者之前初始化路由和其他资源,然后拦截器应该工作 - issues.apache.org/jira/browse/CAMEL-8491
    猜你喜欢
    • 2011-01-03
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    相关资源
    最近更新 更多