无法使用Apache Camel消耗Kafka消息

时间:2017-02-28 20:43:38

标签: java apache-camel apache-kafka integration

我正在尝试整合Kafka + Camel而无法弄清楚 - 如何使用消息。

我正在尝试使用Apache Camel为Apache Kafka中的主题创建一个使用者。 我使用的是Apache Camel 2.18.2和Kafka 2.10以及JDK 1.8。

以下是为名为SyncInOut的主题生成消息的程序。

final String toKafka= "kafka:localhost:9092?topic=SyncInOut&groupId=group1";
final String fromKafka = "kafka:localhost:9092?topic=SyncInOut&groupId=group1&autoOffsetReset=earliest&consumersCount=1";

final String TEST_PAYLOAD = "Sync Payload InOut!";

CamelContext camelContext = new DefaultCamelContext();
ProducerTemplate template = camelContext.createProducerTemplate();
    Exchange exchange = template.send(toKafka, ExchangePattern.InOut, new Processor() {
        public void process(Exchange exchange) throws Exception {
            exchange.getIn().setBody(TEST_PAYLOAD);
        }
    });

在执行上面的代码时,我能够使用ProducerTemplate生成消息,并且消息已成功推送到SyncInOut。但我无法消费这条消息。在这里,我正在添加一条新路线并试图消费。

        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(fromKafka)
                 .process(new Processor() {
                     @Override
                     public void process(Exchange exchange)
                             throws Exception {
                         String messageKey = "";
                         if (exchange.getIn() != null) {
                             Message message = exchange.getIn();
                             Integer partitionId = (Integer) message
                                     .getHeader(KafkaConstants.PARTITION);
                             String topicName = (String) message
                                     .getHeader(KafkaConstants.TOPIC);
                             if (message.getHeader(KafkaConstants.KEY) != null)
                                 messageKey = (String) message
                                         .getHeader(KafkaConstants.KEY);
                             Object data = message.getBody();


                             System.out.println("topicName :: "
                                     + topicName + " partitionId :: "
                                     + partitionId + " messageKey :: "
                                     + messageKey + " message :: "
                                     + data + "\n");
                         }
                     }
                 }).to("log:input");
             }
         });
         camelContext.start();

上述消费者路线无法按预期工作。理想情况下,消耗的消息应该打印出来,但似乎没有任何事情发生。它似乎没有被触发那种方式。所以,我尝试使用ConsumerTemplate消费消息,如下所示,但这也没有用。

Exchange exchangeConsumer = consumerTemplate.receive(fromKafka);
    System.out.println("Body is : "+exchangeConsumer.getOut().getBody().toString());

上述行永远不会完成。我无法弄清楚如何使用Apache Camel从Kafka主题消费消息。我从官方文档中找不到多少帮助。任何其他帮助将不胜感激。

0 个答案:

没有答案