在Apache骆驼的.to()方法内使用交换消息

时间:2019-04-03 12:34:28

标签: apache-kafka apache-camel

我是骆驼的新手,并希望根据事前预先制定的逻辑动态更改我的路线

camelContext.addRoutes(new RouteBuilder() {
        public void configure() {
            PropertiesComponent pc = getContext().getComponent("properties", PropertiesComponent.class);
            pc.setLocation("classpath:application.properties");

            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(new Processor() {
                        @Override
                        public void process(Exchange exchange) throws Exception {
                            System.out.println(" message: " + exchange.getIn().getBody());
                            Bytes body = exchange.getIn().getBody(Bytes.class);
                            HashMap data = (HashMap)SerializationUtils.deserialize(body.get());
                            // do some work on data;
                            Map messageBusDetails = new HashMap();
                            messageBusDetails.put("topicName", "someTopic");
                            messageBusDetails.put("producerOption", "bla");
                            exchange.getOut().setHeader("kafka", messageBusDetails);
                            exchange.getOut().setBody(SerializationUtils.serialize(data));
                        }
                    }).choice()
                        .when(header("kafka"))
                            .to("kafka:"+ **getHeader("kafka").get("topicName")** )
                .log("${body}");
        }
    });

getHeader(“ kafka”)。get(“ topicName”)

这是我要实现的目标。

但是我不知道如何在.to()内部访问标头值(这是一个映射-导致kafka生产者可能具有更多配置)

我了解我可能完全错误地使用了它...但这就是我到目前为止一直了解的内容...

主要目标是将多个消息总线作为.from() 以及.to()中的多个消息总线选项,这些选项将通过外部源(例如配置文件)来决定,这样同一路由将适用于许多逻辑方案 我认为choice()方法是最好的答案 谢谢!

1 个答案:

答案 0 :(得分:0)

代替 to(),您可以使用 toD(),即“动态到” See this了解详情

有关用于引入各种标头等的语法,请参见Simple expression page