Aprendizaje introductorio de Spring-kafka (3): use SpringBoot para enviar y recibir mensajes

Tabla de contenido

Uno, crea un nuevo proyecto SpringBoot

Dos, configuración de java

Tres, interfaz de controlador

Cuarto, comienza la prueba


Uno, crea un nuevo proyecto SpringBoot

Versión de SpringBoot: 2.1.2.RELEASE (la versión debe corresponder preferiblemente a la versión del cliente kafka)

Introducir dependencias

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

Dos, configuración de java

Clase de configuración SpringKafkaConfig
package com.asyf.demo.config;

import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.serialization.IntegerDeserializer;
import org.apache.kafka.common.serialization.IntegerSerializer;
import org.apache.kafka.common.serialization.StringDeserializer;
import org.apache.kafka.common.serialization.StringSerializer;
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.core.*;

import java.util.HashMap;
import java.util.Map;

@Configuration
@EnableKafka
public class SpringKafkaConfig {

    /**
     * 监听容器 @KafkaListener 需要这个侦听器容器工厂
     */
    @Bean
    ConcurrentKafkaListenerContainerFactory<Integer, String> kafkaListenerContainerFactory() {
        ConcurrentKafkaListenerContainerFactory<Integer, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
        factory.setConsumerFactory(consumerFactory());
        factory.setConcurrency(1);//例如,container.setConcurrency(3)创建三个KafkaMessageListenerContainer实例。
        return factory;
    }

    @Bean
    public ConsumerFactory<Integer, String> consumerFactory() {
        return new DefaultKafkaConsumerFactory<>(consumerConfigs());
    }

    @Bean
    public Map<String, Object> consumerConfigs() {
        Map<String, Object> props = new HashMap<>();
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        props.put(ConsumerConfig.GROUP_ID_CONFIG, "group_id");
        props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, true);
        props.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "100");
        props.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, "15000");
        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, IntegerDeserializer.class);
        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
        return props;
    }

    /**
     * kafkaTemplate实例
     */
    @Bean
    public KafkaTemplate<Integer, String> kafkaTemplate() {
        return new KafkaTemplate<Integer, String>(producerFactory());
    }

    @Bean
    public ProducerFactory<Integer, String> producerFactory() {
        return new DefaultKafkaProducerFactory<>(producerConfigs());
    }

    @Bean
    public Map<String, Object> producerConfigs() {
        Map<String, Object> props = new HashMap<>();
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        props.put(ProducerConfig.RETRIES_CONFIG, 0);
        props.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384);
        props.put(ProducerConfig.LINGER_MS_CONFIG, 1);
        props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432);
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, IntegerSerializer.class);
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        return props;
    }

    //监听器
    @Bean
    public Listener listener() {
        return new Listener();
    }

}
Clase de oyente
package com.asyf.demo.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.kafka.annotation.KafkaListener;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Listener {

    public static Logger logger = LoggerFactory.getLogger(Listener.class);

    /**
     * 从2.0版开始,该id属性(如果存在)将用作Kafka消费者group.id属性,并覆盖消费者工厂中的已配置属性(如果存在)。
     * 您还可以groupId显式设置或将其设置idIsGroup为false,以恢复使用使用者工厂配置的的group.id。
     */
    @KafkaListener(id = "Listener1", topics = {"annotated1"}, groupId = "consumer_group_1")
    public void listen1(String foo) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        logger.info(sdf.format(new Date()) + " - Listener1-接收消息:" + foo);
        Thread.sleep(1000 * 1); // 证明了接收消息是串行的
    }

}

Tres, interfaz de controlador

    @RequestMapping(value = "test")
    public String test() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String topic = "annotated1";
        kafkaTemplate.send(topic, 0, "topic:" + topic + " - 123456中文 - " + sdf.format(new Date()));
        kafkaTemplate.flush();
        return "test";
    }

Cuarto, comienza la prueba

1. Inicie el proyecto y podrá ver la información de asignación de particiones

 2. Solicitar interfaz: http://127.0.0.1:8080/test , la consola imprime la siguiente información

 

Referencia: https://docs.spring.io/spring-kafka/docs/2.2.13.RELEASE/reference/html/#even-quicker-with-spring-boot

Supongo que te gusta

Origin blog.csdn.net/cs373616511/article/details/106061498
Recomendado
Clasificación