Spring 将 Kafka Kafka 批处理到数据库作业
Spring Batch Kafka Kafka to Database Job
我需要一个 spring 批处理的 ItemReader 来使用 Kafka 消息,其结果将被进一步处理和写入。
这是我实施的一项reader:
public abstract class KafkaItemReader<T> implements ItemReader<List<T>> {
public abstract KafkaConsumer<String, T> getKafkaConsumer();
public abstract String getTopic();
public abstract long getPollingTime();
@Override
public List<T> read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
Iterator<ConsumerRecord<String, T>> iterator = getKafkaConsumer()
.poll(Duration.ofMillis(getPollingTime()))
.records(getTopic())
.iterator();
List<T> records = new ArrayList<>();
while (iterator.hasNext()) {
records.add(iterator.next().value());
}
return records;
}
}
这些是 spring 批处理作业和步骤的以下 bean:
@Bean
public ItemWriter<List<DbEntity>> databaseWriter(DataSource dataSource) {
//some item writer that needs to be implmented
return null;
}
@Bean
public Step kafkaToDatabaseStep(KafkaItemReader kafkaItemReader, //implementation of KafkaItemReader
StepBuilderFactory stepBuilderFactory,
DataSource dataSource) {
return stepBuilderFactory
.get("kafkaToDatabaseStep")
.allowStartIfComplete(true)
.<List<KafkaRecord>, List<DbEntity>>chunk(100)
.reader(kafkaItemReader)
.processor(itemProcessor()) //List<KafkaRecord> to List<DbEntity> converter
.writer(databaseWriter(dataSource))
.build();
}
@Bean
public Job kafkaToDatabaseJob(
@Qualifier("kafkaToDatabaseStep") Step step) {
return jobBuilderFactory.get("kafkaToDatabaseJob")
.incrementer(new RunIdIncrementer())
.flow(step)
.end()
.build();
}
这里不知道:
- 如何在编写器中提交读取消息的偏移量,因为我只想在完成记录处理后提交。
- 如何在我的场景中使用 JdbcBatchItemWriter 作为 ItemWriter。
即将推出的 Spring Batch v4.2 GA 将为 Apache Kafka 主题的 reading/writing 数据提供支持。您已经可以使用 4.2.0.M2 release.
进行尝试
您还可以查看 Josh Long 的 Spring Tips installment 关于它的文章。
我需要一个 spring 批处理的 ItemReader 来使用 Kafka 消息,其结果将被进一步处理和写入。
这是我实施的一项reader:
public abstract class KafkaItemReader<T> implements ItemReader<List<T>> {
public abstract KafkaConsumer<String, T> getKafkaConsumer();
public abstract String getTopic();
public abstract long getPollingTime();
@Override
public List<T> read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
Iterator<ConsumerRecord<String, T>> iterator = getKafkaConsumer()
.poll(Duration.ofMillis(getPollingTime()))
.records(getTopic())
.iterator();
List<T> records = new ArrayList<>();
while (iterator.hasNext()) {
records.add(iterator.next().value());
}
return records;
}
}
这些是 spring 批处理作业和步骤的以下 bean:
@Bean
public ItemWriter<List<DbEntity>> databaseWriter(DataSource dataSource) {
//some item writer that needs to be implmented
return null;
}
@Bean
public Step kafkaToDatabaseStep(KafkaItemReader kafkaItemReader, //implementation of KafkaItemReader
StepBuilderFactory stepBuilderFactory,
DataSource dataSource) {
return stepBuilderFactory
.get("kafkaToDatabaseStep")
.allowStartIfComplete(true)
.<List<KafkaRecord>, List<DbEntity>>chunk(100)
.reader(kafkaItemReader)
.processor(itemProcessor()) //List<KafkaRecord> to List<DbEntity> converter
.writer(databaseWriter(dataSource))
.build();
}
@Bean
public Job kafkaToDatabaseJob(
@Qualifier("kafkaToDatabaseStep") Step step) {
return jobBuilderFactory.get("kafkaToDatabaseJob")
.incrementer(new RunIdIncrementer())
.flow(step)
.end()
.build();
}
这里不知道:
- 如何在编写器中提交读取消息的偏移量,因为我只想在完成记录处理后提交。
- 如何在我的场景中使用 JdbcBatchItemWriter 作为 ItemWriter。
即将推出的 Spring Batch v4.2 GA 将为 Apache Kafka 主题的 reading/writing 数据提供支持。您已经可以使用 4.2.0.M2 release.
进行尝试您还可以查看 Josh Long 的 Spring Tips installment 关于它的文章。