Spring boot 集成kafka消费品春季批次
我有一个在spring boot中开发的Kafka消费者,我能够阅读主题中的信息。 我想将它与Spring批处理集成,因为我想创建一个批处理文件。Spring boot 集成kafka消费品春季批次,spring-boot,apache-kafka,spring-batch,kafka-consumer-api,spring-kafka,Spring Boot,Apache Kafka,Spring Batch,Kafka Consumer Api,Spring Kafka,我有一个在spring boot中开发的Kafka消费者,我能够阅读主题中的信息。 我想将它与Spring批处理集成,因为我想创建一个批处理文件。 我不知道如何做到这一点。Spring Batch在中添加了对Kafka主题的读/写数据的支持,请参见和 您还可以查看Josh Long在Spring Batch中提供的关于Kafka支持。Spring Batch在、请参阅和中添加了对Kafka主题的读/写数据的支持 您还可以查看Josh Long编写的关于Spring批处理中的Kafka支持的文章。
我不知道如何做到这一点。Spring Batch在中添加了对Kafka主题的读/写数据的支持,请参见和
您还可以查看Josh Long在Spring Batch中提供的关于Kafka支持。Spring Batch在、请参阅和中添加了对Kafka主题的读/写数据的支持 您还可以查看Josh Long编写的关于Spring批处理中的Kafka支持的文章。尝试如下:
private static final Logger LOG = LoggerFactory.getLogger(Listener.class);
@KafkaListener(id = "batch-listener", topics = "${app.topic.batch}")
public void receive(@Payload List<String> messages,
@Header(KafkaHeaders.RECEIVED_PARTITION_ID) List<Integer> partitions,
@Header(KafkaHeaders.OFFSET) List<Long> offsets) {
LOG.info("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
LOG.info("beginning to consume batch messages");
for (int i = 0; i < messages.size(); i++) {
LOG.info("received message='{}' with partition-offset='{}'",
messages.get(i), partitions.get(i) + "-" + offsets.get(i));
}
LOG.info("all batch messages consumed");
}
@EnableKafka
@Configuration
public class ListenerConfig {
@Value("${spring.kafka.bootstrap-servers}")
private String bootstrapServers;
@Bean
public Map<String, Object> consumerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.GROUP_ID_CONFIG, "batch");
props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, "5");
return props;
}
@Bean
public ConsumerFactory<String, String> consumerFactory() {
return new DefaultKafkaConsumerFactory<>(consumerConfigs());
}
@Bean
public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory());
factory.setBatchListener(true);
factory.getContainerProperties().setBatchErrorHandler(new BatchLoggingErrorHandler());
return factory;
}
}
参考:尝试如下操作:
private static final Logger LOG = LoggerFactory.getLogger(Listener.class);
@KafkaListener(id = "batch-listener", topics = "${app.topic.batch}")
public void receive(@Payload List<String> messages,
@Header(KafkaHeaders.RECEIVED_PARTITION_ID) List<Integer> partitions,
@Header(KafkaHeaders.OFFSET) List<Long> offsets) {
LOG.info("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
LOG.info("beginning to consume batch messages");
for (int i = 0; i < messages.size(); i++) {
LOG.info("received message='{}' with partition-offset='{}'",
messages.get(i), partitions.get(i) + "-" + offsets.get(i));
}
LOG.info("all batch messages consumed");
}
@EnableKafka
@Configuration
public class ListenerConfig {
@Value("${spring.kafka.bootstrap-servers}")
private String bootstrapServers;
@Bean
public Map<String, Object> consumerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.GROUP_ID_CONFIG, "batch");
props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, "5");
return props;
}
@Bean
public ConsumerFactory<String, String> consumerFactory() {
return new DefaultKafkaConsumerFactory<>(consumerConfigs());
}
@Bean
public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory());
factory.setBatchListener(true);
factory.getContainerProperties().setBatchErrorHandler(new BatchLoggingErrorHandler());
return factory;
}
}
ref:我如何用它以特定格式创建一个批处理文件,并为所有字段定义索引。此外,我们是否需要关心制作人是单独发送消息还是成批发送消息。@Sonia您需要哪种类型的文件,无法理解,如果您想成批生成消息,那么您也需要注意这一点。我如何用它创建一个特定格式的批处理文件,并为所有字段定义索引。另外,我们是否需要关心制作人是单独发送消息还是成批发送消息。@Sonia您需要哪种类型的文件,无法理解,如果您想成批生成消息,那么您也需要注意这一点。我可以使用KafkaItemReader来使用spring批处理应用程序中主题的avro消息吗?是,创建reader时,可以通过在consumerProperties中将key.deserializer属性设置为Kafkaavroderializer来实现。KafkaItemReader类将以GenericRecord形式返回记录?我需要将它们转换为SpecificRecord,或者如何转换?实际上,我想读取消息来自的架构字段,并且必须将所有字段映射到java对象,然后使用指定格式的传入数据创建一个批处理文件。@MahmoudBenHassine是否支持spring batch with spring cloud starter stream kafka。因为我接受了卡夫卡作为流。然后我需要将这些流传递给spring批处理。有没有可能?@MahmoudBenHassine我按照这种方式从azure事件中心读取卡夫卡流。我是否可以使用KafkaItemReader来使用spring批处理应用程序中主题的avro消息?是的,您可以在创建reader时将consumerProperties中的key.deserializer属性设置为Kafkaavroderializer。KafkaItemReader类将以GenericRecord的形式返回记录?我需要将它们转换为SpecificRecord,或者如何转换?实际上,我想读取消息来自的架构字段,并且必须将所有字段映射到java对象,然后使用指定格式的传入数据创建一个批处理文件。@MahmoudBenHassine是否支持spring batch with spring cloud starter stream kafka。因为我接受了卡夫卡作为流。然后我需要将这些流传递给spring批处理。有没有可能?@MahmoudBenHassine我按照这种方式从azure事件中心读取卡夫卡流。