我想创建一个应用程序,该路由将在两端的运行时决定,from()和to()两者之间的处理保持不变
我的例子: 我希望在我的应用程序中有一个配置文件,然后在其中告诉源和目标,而中间作业保持不变。
在所有解决方案中,我将始终以process()的身份完成工作
棘手的部分是使两端都变得动态...
我已经阅读了收件人列表,toD(),choice()。when()
我似乎无法完成这项工作。
我的目标是要有一个RouteFactory来相应地设置camelContext(假设我的选项是kafka或rabbitMq)
一旦我获得了我的kafka / rabbitMQ路由,现在我的processor()将在消息中设置一个标头,该标头将告诉我我的to()是否需要转到kafka / RabbitMq
我只能解决这一问题的一端,要么我的from()是动态的,要么我的to()是动态的...
但是我似乎无法使它们都充满活力
我这样创建了一家工厂:
public RouteBuilder RouteFactory(String type, Processor processor)
{
switch (type)
{
case "kafka":
return new RouteBuilder() {
@Override
public void configure() throws Exception {
// setup kafka component with the brokers
KafkaComponent kafka = new KafkaComponent();
kafka.setBrokers("{{kafka.host}}:{{kafka.port}}");
getContext().addComponent("kafka", kafka);
log.info("About to start route: Kafka Server -> Log ");
from("kafka:{{consumer.topic}}?brokers={{kafka.host}}:{{kafka.port}}"
+ "&maxPollRecords={{consumer.maxPollRecords}}"
+ "&consumersCount={{consumer.consumersCount}}"
+ "&seekTo={{consumer.seekTo}}"
+ "&groupId={{consumer.group}}"
+ "&valueDeserializer=" + BytesDeserializer.class.getName())
.routeId("FromKafka")
.process(processor)
.choice()
.when(header("kafka"))
.recipientList(simple("kafka:${header.kafka[topicName]}"))
.end()
.when(header("rabbit"))
.recipientList(simple("rabbit:${header.rabbit[queueName]}"))
.end();
}
};
case "rabbit":
return new RouteBuilder() {
@Override
public void configure() throws Exception {
// set rabbit component
from("rabbit")
.routeId("rabbit")
.process(processor)
.choice()
.when(header("kafka"))
.recipientList(simple("kafka:${header.kafka[topicName]}"))
.end()
.when(header("rabbit"))
.recipientList(simple("rabbit:${header.rabbit[queueName]}"))
.end();
}
};
}
return null;
}
如您所见,两条路线的末尾相同,我添加的消息总线越多,复制粘贴就越需要....
我似乎找不到一种使to()动态化的方法(也许是另一家工厂?但是to()方法不接受路线)
如果我可以在所有工厂路线中对()执行相同的泛型 然后在一个地方管理我拥有的所有to()选项,那将是完美的 我试图用“ direct:outputManager”做到这一点 但是“ outputManager”必须以from()开头,而我只需要解析to()
P-S- 我是骆驼的新手,所以我接受我可能会完全离开,并且有一种更简单的解决方案,很高兴听到 PS 2 我只检查了kafka路线,我只是用psodo将它编码成了一个兔子,以适应这个问题,所以我知道它不会在兔子部分起作用
编辑:正如Paizo在评论中建议的那样,我探索了Endpoint方向,它看起来很有希望 我唯一想念的是实际上能够访问端点中的消息,以便决定退回哪个生产者
代码:
.to(new DefaultEndpoint() {
@Override
public Producer createProducer() throws Exception {
// get message header and decide which producer to return
Producer producer;
//case kafka
producer = new KafkaProducer(new KafkaEndpoint("kafka:blaTopic",new KafkaComponent(getContext())));
//case rabbit - psodo code
producer = new RabbitProducer();
return producer;
}
@Override
public Consumer createConsumer(Processor processor) throws Exception {
throw new UnsupportedOperationException("You cannot receive messages from this endpoint");
}
@Override
public boolean isSingleton() {
return false;
}
})