sprintboot集成kafka

springboot版本


   org.springframework.boot
   spring-boot-starter-parent
   1.5.6.RELEASE
   

spring-kafka和kafka版本对应关系

sprintboot集成kafka_第1张图片

在 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 见下图右下角

sprintboot集成kafka_第2张图片

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个消费者接收消息

sprintboot集成kafka_第3张图片

测试结果:如果 KfkConsumerA和 KfkConsumerB的groupId不一样,所有消费者都能接收消息

sprintboot集成kafka_第4张图片

sprintboot集成kafka_第5张图片

你可能感兴趣的:(kafka)