Я хотел бы создать приложение, в котором маршрут будет определен во время выполнения в обоих концах, как от (), так и до (), и обработка между ними останется прежней
Мой пример: я быМне нравится иметь файл конфигурации в моем приложении, и там я сообщу источник и назначение, в то время как промежуточное задание остается неизменным.
Я всегда буду выполнять задание как процесс () во всех моих решениях
Сложная задача - сделать оба конца динамическими ...
Я читал о Списке получателей, toD (), choice (). When ()
Не могу сделатьэта работа.
Моя цель - создать своего рода RouteFactory, который соответствующим образом установит camelContext (скажем, мои варианты: kafka или rabbitMq)
Как только я получу свой маршрут kafka / rabbitMQ,теперь мой процессор () установит заголовок в сообщении, который скажет мне, если my to () должен перейти к kafka / RabbitMq
мне удалось сделать только один конец этой проблемы, либо my 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;
}
Как видите, оба маршрута имеют одинаковое окончание, чем больше шин сообщений я добавляю, тем большескопировать вставить надо сделать ....
Не могу найти способ сделать динамический make to () (может быть, другой завод?но метод to () не принимает маршруты)
Если бы я мог сделать один и тот же общий для to () на всех моих заводских маршрутах, а затем в одном месте управлять всеми опциями to (), которые у меня есть, этобыть идеальным, я пытался сделать это с «direct: outputManager», но затем «outputManager» должен начинаться с from (), и мне нужно только разрешить to ()
PS - я новичок в Верблюд, поэтому я принимаючто я мог бы быть полностью выключен и есть намного более простое решение, я буду рад услышать это PS 2- Я только проверил маршрут kafka и кролика, я просто psodo закодировал его, чтобы соответствовать этому вопросу, так что я знаю, что он не будет работать начасть кролика
РЕДАКТИРОВАТЬ: Как предложил Пайзо в комментариях, я исследовал направление конечной точки, оно выглядит многообещающим. Единственное, чего мне не хватает, так это возможности получить доступ к сообщению в конечной точке, чтобы решить, какого производителя вернуть
код:
.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;
}
})