kafka配置文件
package com.goodwe.kafka.configuration; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.common.serialization.StringDeserializer; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.kafka.annotation.EnableKafka; import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; import org.springframework.kafka.config.KafkaListenerContainerFactory; import org.springframework.kafka.core.ConsumerFactory; import org.springframework.kafka.core.DefaultKafkaConsumerFactory; import org.springframework.kafka.listener.ConcurrentMessageListenerContainer; import java.util.HashMap; import java.util.Map; @Configuration @EnableKafka public class KafkaConfiguration { @Value("${spring.kafka.bootstrap-servers}") private String servers; @Value("${spring.kafka.consumer.enable-auto-commit}") private boolean enableAutoCommit; @Value("${spring.kafka.consumer.auto-commit-interval}") private String autoCommitInterval; @Value("${spring.kafka.consumer.group-id}") private String groupId; @Value("${spring.kafka.consumer.auto-offset-reset}") private String autoOffsetReset; @Value("${spring.kafka.listener.concurrency}") private int concurrency; @Value("${spring.kafka.consumer.max-poll-records}") private int maxPollRecords; @Bean public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<String, String>> kafkaListenerContainerFactory() { ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>(); factory.setConsumerFactory(consumerFactory()); factory.setConcurrency(concurrency); factory.getContainerProperties().setPollTimeout(5000); factory.setBatchListener(true);//@KafkaListener 批量消费 每个批次数量在Kafka配置参数中设置ConsumerConfig.MAX_POLL_RECORDS_CONFIG //factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL_IMMEDIATE);//设置提交偏移量的方式 return factory; } public ConsumerFactory<String, String> consumerFactory() { return new DefaultKafkaConsumerFactory<>(consumerConfigs()); } public Map<String, Object> consumerConfigs() { Map<String, Object> propsMap = new HashMap<>(8); propsMap.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, servers);//连接地址 propsMap.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, enableAutoCommit);//如果为true,消费者的偏移量将在后台定期提交 propsMap.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, autoCommitInterval);//#设置自动提交周期 propsMap.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);//消费者组 propsMap.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, autoOffsetReset);//消费方式 propsMap.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, maxPollRecords);//每个批次获取数 propsMap.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); propsMap.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); return propsMap; } }
kafka使用
kafka生产者:
package com.goodwe.kafka.services; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Service; @Service public class KafkaProviderServices { @Autowired private KafkaTemplate<String,Object> kafkaTemplate; @Value("${spring.kafka.topic}") private String topic; public void sender(Object value){ kafkaTemplate.send(topic,value); } }
kafka消费者:
package com.goodwe.kafka.services; import org.springframework.kafka.annotation.KafkaListener; import org.springframework.stereotype.Service; @Service public class KafkaconsumerServices { String str = ""; @KafkaListener(topics = "datatest",groupId = "test") //消费的主题为datatest 消费组为test public void consumer(String message) { //System.out.println("test topic message:" + message); str = message; } public String showData() { String data = str; str = ""; return data; } }
参数列表
#kafka #连接地址 spring.kafka.bootstrap-servers=192.168.1.43:9092 #消费者组 spring.kafka.consumer.group-id=group_gops_data3 # earliest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费 # latest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据 # none:topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常 spring.kafka.consumer.auto-offset-reset=earliest #如果为true,消费者的偏移量将在后台定期提交 spring.kafka.consumer.enable-auto-commit=true #设置自动提交周期 spring.kafka.consumer.auto-commit-interval=5000 #此设置限制每次调用poll返回的消息数 spring.kafka.consumer.max-poll-records=10 #每个监听器的消费者个数 spring.kafka.listener.concurrency= 5 #数据标签 spring.kafka.topic= datatest # 最大取多少块缓存到消费者(默认10) spring.kafka.queued.max.message.chunks=50