sprintboot集成kafka

springboot版本

<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>1.5.6.RELEASE</version>
   <relativePath/>
</parent>

spring-kafka和kafka版本对应关系


在 pom中增加 spring-kafka 依赖

<dependency>
   <groupId>org.springframework.kafka</groupId>
   <artifactId>spring-kafka</artifactId>
   <version>1.3.1.RELEASE</version>
</dependency>

测试的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版本实现的。

<dependency>
   <groupId>org.springframework.kafka</groupId>
   <artifactId>spring-kafka</artifactId>
   <version>1.1.6.RELEASE</version>
</dependency>

 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不一样,所有消费者都能接收消息



猜你喜欢

转载自blog.csdn.net/chy2z/article/details/80595767