springboot版本
org.springframework.boot spring-boot-starter-parent 1.5.6.RELEASE
spring-kafka和kafka版本对应关系
在 pom中增加 spring-kafka 依赖
org.springframework.kafka spring-kafka 1.3.1.RELEASE
测试的kafka版本是kafka_2.11-0.10.1.1,其中 0.10.1.1 表示的是 kafka-clients-0.10.1.1.jar 的版本号。
按照版本对应关系应该使用spring-kafka的1.1.6版本发现代码中不能配置 groupid,所以改成了1.3.1版本,测试也没有问题,后面的代码是依赖spring-kafka的1.3.1版本实现的。
org.springframework.kafka spring-kafka 1.1.6.RELEASE
kafka-clients-0.10.1.1.jar 见下图右下角
application.properties 配置
# kafka spring.kafka.bootstrap-servers=localhost:9092 spring.kafka.consumer.group-id=myGroup spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
消息对象
/** * @Title: KFKMessage * @Description: 测试发送kafka消息 * @author chy * @date 2018/6/6 14:28 */ public class KFKMessage { private Long id; private String msg; private Date sendTime; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Date getSendTime() { return sendTime; } public void setSendTime(Date sendTime) { this.sendTime = sendTime; } }
消息生产者
@Component public class KfkProducer { @Autowired private KafkaTemplate kafkaTemplate; private static int index=1; public void sendMessage(){ KFKMessage m = new KFKMessage(); m.setId(System.currentTimeMillis()); m.setMsg("kafka消息--->"+index++); m.setSendTime(new Date()); kafkaTemplate.send("test", JsonUtil.writeValueAsString(m)); System.out.println("发送消息:"+JsonUtil.writeValueAsString(m)); } }
消息消费者 A
@Component public class KfkConsumerA { /** * 接收test-1主题的消息 * * 如果所有的消费者的组号都一样,那么从主题接收消息会随机选择一个消费者,就相当于队列。 * 如果所有的消费者的组号不一样,消费者可以重复消费 * * groupId 在 1.1.6 版本中不能配置 * * @param content */ @KafkaListener(topics = "test",groupId ="myGroup" ) public void processMessage(String content) { KFKMessage m = JsonUtil.jsonToBean(content, KFKMessage.class); System.out.println("A接收消息:" + content); } }
消息消费者 B
@Component public class KfkConsumerB { /** * 接收test主题消息 * 如果所有的消费者的组号都一样,那么从主题接收消息会随机选择一个消费者,就相当于队列。 * 如果所有的消费者的组号不一样,消费者可以重复消费 * * groupId 在 1.1.6 版本中不能配置 * * @param content */ @KafkaListener(topics = "test",groupId = "myGroup") public void processMessage(String content) { KFKMessage m = JsonUtil.jsonToBean(content, KFKMessage.class); System.out.println("B接收消息:" + content); } }
测试代码
@Component @EnableAsync public class ScheduledTask { @Autowired KfkProducer kfkProducer; /** * Kafka主题测试 */ @Async @Scheduled(fixedDelay=50) public void sendKafkaTopicTest() { kfkProducer.sendMessage(); }}
测试结果:如果 KfkConsumerA和 KfkConsumerB的groupId一样,只能有1个消费者接收消息
测试结果:如果 KfkConsumerA和 KfkConsumerB的groupId不一样,所有消费者都能接收消息