在java中创建Camel端点以在xml路由中使用

时间:2015-12-15 17:14:28

标签: java xml apache-camel

我一直在尝试在java中创建端点,并且在我的xml路由中引用了这些端点但是不成功。我可以在xml中执行此操作:

<endpoint id="kafkatopic" uri="kafka:..."/>

并在路由中引用端点:

<route id="eventflow">
    <from ref="kafkatopic" ...>

我想要做的是使用java替换xml端点声明。我尝试过类似的东西:

Endpoint kafkaep = camelCtx.getEndpoint(kafkaUri); 

但是我很难理解如何创建一个键“kafkatopic”来引用端点,以便xml路由能够找到它。我已经检查了EndpointRegistry但是不允许我为端点提供简单的名称。 任何帮助表示赞赏。感谢。

这是我的camelContext:

<camelContext xmlns="http://camel.apache.org/schema/blueprint"
    trace="true" id="context">

    <routeBuilder ref="myRouteBuilder" />
    <route id="eventflow">
        <from ref="kafkatopic" ...>

我的简化RouteBuilder.configure()如下所示。在这里,我试图将端点放在endpointRegistry中,希望它将由xml路由使用。在EndpointRegistry上没有很多文档,因此我在黑暗中拍摄。

    // endpoint i have formatted to be "someKey=uri"
    String endPoint = getConfigs("camel-endpoint");
    String [] eptoks = ep.split("=", 2);
    EndpointRegistry<String> endpointRegistry = camelContext.getEndpointRegistry();
    Endpoint endpoint = camelContext.getEndpoint(eptoks[1]);
    endpointRegistry.put(eptoks[0], endpoint);

4 个答案:

答案 0 :(得分:1)

您可以尝试在Spring中明确定义端点:

<bean id="kafkaComponent" class="org.apache.camel.component.kafka.KafkaComponent"/>
  <bean id="kafkaEndpoint" class="org.apache.camel.component.kafka.KafkaEndpoint">
    <constructor-arg value="kafka:..."/>
    <constructor-arg ref="kafkaComponent"/>
</bean>

或使用Spring工厂bean和方法: http://www.javabeat.net/create-spring-beans-using-factory-methods/

答案 1 :(得分:0)

实现这一目标的最简单方法是创建一个实现

的类
org.apache.camel.Processor 

接口并在spring xml文件中配置它,例如

<bean id="sp" class="com.mycompany.SimpleProcessor"/>

在您的路线中,您可以使用您在bean中提供的ID来引用它,例如

<to uri="sp" />

答案 2 :(得分:0)

我想说这会使读起来有点混乱,虽然也许你有充分的理由,但是当我查看路线时我想清楚地知道端点细节,除非它们在某处被引用。要在java类中查找端点可能会很麻烦。

我最近发现你可以在java中编写你的整个RouteBuilder逻辑,只需让蓝图xml像任何其他bean一样调用它?这就是你的路由在java中的原因以及xml中的启动机制。

答案 3 :(得分:0)

我知道现在已经很晚了,但这就是我做的工作。基本上我只是以编程方式创建了端点&#34; direct&#34;端点基于配置和引用我的camel路由xml文件中的那些直接端点。这样我就避免在我的xml路由文件中使用特定于环境的值,如主机名,端口号等,并且只有一个版本适用于所有环境。