[英]Start reading Kafka topic from specific Offset in Apache Camel
我阅读了Camel Kafka的所有文档,我读到的唯一方法是来自git和指定的路由构建器
public void configure() throws Exception {
from("kafka:" + TOPIC
+ "?groupId=A"
+ "&autoOffsetReset=earliest" // Ask to start from the beginning if we have unknown offset
+ "&consumersCount=2" // We have 2 partitions, we want 1 consumer per partition
+ "&offsetRepository=#offset") // Keep the offset in our repository
.to("mock:result");
}
但是对于客户的订单,我需要使用Spring,所以我的kafka端点就是这样
<!--DEFINE KAFKA'S TOPCIS AS ENDPOINT-->
<endpoint id="tagBlink" uri="kafka:10.0.0.165:9092">
<property key="topic" value="tagBlink"/>
<property key="brokers" value="10.0.0.165:9092"/>
<property key="offsetRepository" value="100"/>
</endpoint>
但得到一个例外
无法为属性找到合适的setter:offsetRepository,因为没有相同类型的setter方法:java.lang.String也不能进行类型转换:没有类型转换器可用于从类型:java.lang.String转换为所需类型:org.apache.camel.spi.StateRepository,值为100
这是我的当前配置吗? 如何从特定偏移恢复? ?
在此之后,我设法使用了这个。 我为此创建了Spring Bean,并检查了FileStateRepository
的文档,我需要一个File,所以我创建了一个File Bean并添加为constructor-arg。 之后我添加了一个init-method="doStart"
。 此方法加载文件(如果存在),如果不存在,则会创建该文件。
<endpoint id="event" uri="kafka:localhost:9092">
<property key="topic" value="eventTopic4"/>
<property key="brokers" value="localhost:9092"/>
<property key="autoOffsetReset" value="earliest"/>
<property key="offsetRepository" value="#myRepo2"/>
</endpoint>
<bean id="myFileOfMyRepo" class="java.io.File">
<constructor-arg type="java.lang.String" value="C:\repoDat\repo.dat"/>
</bean>
<bean id="myRepo2" class="org.apache.camel.impl.FileStateRepository " factory-method="fileStateRepository" init-method="doStart">
<constructor-arg ref="myFileOfMyRepo"/>
</bean>
在此之后,我看到了Git中Camel的KafkaConsumer代码。
offsetRepository.getState(serializeOffsetKey(topicPartition));
if (offsetState != null && !offsetState.isEmpty()) {
// The state contains the last read offset so you need to seek from the next one
long offset = deserializeOffsetValue(offsetState) + 1;
log.debug("Resuming partition {} from offset {} from state", topicPartition.partition(), offset);
consumer.seek(topicPartition, offset);
}
有了这个,我设法从最后一个偏移读取。 我希望Camel Documentation为Kafka添加这些额外的步骤。
重要的一个词是“repository”而不是“offset”:它不是一个整数值,而是一个bean的引用,指定WHERE是否保留了偏移量。
(非弹簧)实施例
// Create the repository in which the Kafka offsets will be persisted
FileStateRepository repository = FileStateRepository.fileStateRepository(new File("/path/to/repo.dat"));
// Bind this repository into the Camel registry
JndiRegistry registry = new JndiRegistry();
registry.bind("offsetRepo", repository);
// Configure the camel context
DefaultCamelContext camelContext = new DefaultCamelContext(registry);
camelContext.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("kafka:" + TOPIC + "?brokers=localhost:{{kafkaPort}}" +
"&groupId=A" + //
"&autoOffsetReset=earliest" + // Ask to start from the beginning if we have unknown offset
"&offsetRepository=#offsetRepo") // Keep the offsets in the previously configured repository
.to("mock:result");
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.