Camel-Kafka整合问题

时间:2016-11-28 14:01:43

标签: apache-camel apache-kafka

我正在尝试Camel-Kafka整合 我有两个队列:
queue1 queue2

有三条路线:

  1. Route1 会在 queue1 中列出两条消息(只应一次)。
  2. Route2 queue1 中读取列表,将其拆分,并将各个邮件放入 queue2 < / LI>
  3. Route3 会从 queue2 中读取消息并打印出来。
  4. 代码如下:

    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.camel.CamelContext;
    import org.apache.camel.Exchange;
    import org.apache.camel.Processor;
    import org.apache.camel.builder.RouteBuilder;
    import org.apache.camel.impl.DefaultCamelContext;
    
    public class CamelListTest {
        public static void main(String[] args) throws Exception {
            CamelContext context = new DefaultCamelContext();
            context.addRoutes(new CamelListRoute());
            context.start();
            Thread.sleep(30000);
            context.stop();
        }
    }
    
    class CamelListRoute extends RouteBuilder {
        @Override
        public void configure() throws Exception {
    
    
            //Route1, expected to run once
            from("timer://timerName?repeatCount=1").process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception {
                    List<String> inOrderList = new ArrayList<String>();
                    inOrderList.add("1");
                    inOrderList.add("2");
                    exchange.getIn().setBody(inOrderList, ArrayList.class);
                }
            })
            .to("kafka:<ip>:9092?topic=queue1");
    
    
            //Route2
            from("kafka:<ip>:9092?topic=queue1&groupId=testing&autoOffsetReset=latest&consumersCount=1")
            .split()
            .body().process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception {
                    System.out.println("2nd Route : " + (exchange.getIn().getBody().toString()));
                }
            })
            .to("kafka:<ip>:9092?topic=queue2");
    
    
            //Route3
            from("kafka:<ip>:9092?topic=queue2&groupId=testing&autoOffsetReset=latest&consumersCount=1")
            .process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception {
                    System.out.println("3rd Route : " + (exchange.getIn().getBody().toString()));
                }
            });
        }
    }
    

    它没有按预期工作,并且观察到的问题很少:

    1. 第一条路线预计只会运行一次( repeatCount = 1 ),会持续运行,一次又一次地将相同的信息放入 queue1
    2. 第二条路线会从 queue1 中读取消息,将其拆分,但不会将其放入 queue2
    3. 由于第二条路线未在 queue2 中放置任何内容,因此此路线不会收到任何讯息。
    4. 任何人都可以帮我弄清楚这里有什么问题吗?

3 个答案:

答案 0 :(得分:0)

我看到了几件事:

  1. 我希望你像这样给Kafka Url:“kafka:// localhost:9092?topic = queue1”
  2. 注意: kafka://

    1. 为消费者提供zookeeper网址,例如:kafka://?topic = queue1&amp; zookeeperConnect =&amp; consumerStreams = 1&amp; groupId = testing&amp; autoOffsetReset = maximum

    2. 请注意,在上一点中,autoOffsetReset值将是最大最小,而不是最新

答案 1 :(得分:0)

我认为你应该交换信息。

处理器中的

执行以下操作:

exchng.getOut()。setHeader(“type”,“queue”); exchng.getOut()。setBody(exchng.getIn()。getBody());

然后可以在第二条路线中添加选项,不需要第三条路线。

答案 2 :(得分:0)

我认为第一个问题是连续运行并一次又一次地在queue1中放入相同的消息,因为您对路由2和3中的kafka消费者使用相同的使用者groupId,groupId=testing

修改kafka消费者使用不同的groupIds,这将确保消息不会一次又一次地被消费。

//Route2
from("kafka:<ip>:9092?topic=queue1&groupId=testing-queue1&autoOffsetReset=latest&consumersCount=1")

//Route3
from("kafka:<ip>:9092?topic=queue2&groupId=testing-queue2&autoOffsetReset=latest&consumersCount=1")

生成到queue2并从中进行打印的其他问题,我认为可能是由于版本不兼容。我使用了camel-kafka版本2.20.1(在引擎盖下使用kafka-clients 0.11.0.1)和2.21.0(在引擎盖下使用kafka-clients 1.0.0)并更改了路由以反映这样的更改这似乎消耗 - 生产 - 消费很好。

class CamelListRoute extends RouteBuilder {
    @Override
    public void configure() throws Exception {


        //Route1, expected to run once
        from("timer://timerName?repeatCount=1").process(new Processor() {
            @Override
            public void process(Exchange exchange) throws Exception {
                List<String> inOrderList = new ArrayList<String>();
                inOrderList.add("1");
                inOrderList.add("2");
                exchange.getIn().setBody(inOrderList, ArrayList.class);
            }
        })
        .to("kafka:queue1?brokers=<ip>:9092");


        //Route2
        from("kafka:queue1?brokers=<ip>:9092&groupId=testing-queue1&autoOffsetReset=latest&consumersCount=1")
        .split()
        .body().process(new Processor() {
            @Override
            public void process(Exchange exchange) throws Exception {
                System.out.println("2nd Route : " + (exchange.getIn().getBody().toString()));
            }
        })
        .to("kafka:queue2?brokers=<ip>:9092");


        //Route3
        from("kafka:queue2?brokers=<ip>:9092&groupId=testing-queue2&autoOffsetReset=latest&consumersCount=1")
        .process(new Processor() {
            @Override
            public void process(Exchange exchange) throws Exception {
                System.out.println("3rd Route : " + (exchange.getIn().getBody().toString()));
            }
        });
    }
}