我一直在尝试在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);
答案 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路由文件中使用特定于环境的值,如主机名,端口号等,并且只有一个版本适用于所有环境。