我正在尝试Camel-Kafka整合
我有两个队列:
queue1
和 queue2
。
有三条路线:
queue1
中列出两条消息(只应一次)。queue1
中读取列表,将其拆分,并将各个邮件放入 queue2
< / LI>
queue2
中读取消息并打印出来。代码如下:
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()));
}
});
}
}
它没有按预期工作,并且观察到的问题很少:
queue1
queue1
中读取消息,将其拆分,但不会将其放入 queue2
queue2
中放置任何内容,因此此路线不会收到任何讯息。任何人都可以帮我弄清楚这里有什么问题吗?
答案 0 :(得分:0)
我看到了几件事:
注意: kafka://
为消费者提供zookeeper网址,例如:kafka://?topic = queue1&amp; zookeeperConnect =&amp; consumerStreams = 1&amp; groupId = testing&amp; autoOffsetReset = maximum
请注意,在上一点中,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()));
}
});
}
}