Создание динамического маршрута, который отправляет динамический .to () в Apache Camel - PullRequest
0 голосов
/ 04 апреля 2019

Я хотел бы создать приложение, в котором маршрут будет определен во время выполнения в обоих концах, как от (), так и до (), и обработка между ними останется прежней

Мой пример: я быМне нравится иметь файл конфигурации в моем приложении, и там я сообщу источник и назначение, в то время как промежуточное задание остается неизменным.

Я всегда буду выполнять задание как процесс () во всех моих решениях

Сложная задача - сделать оба конца динамическими ...

Я читал о Списке получателей, 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;
                }
            })
...