JAVA spring Boot集成kafka的使用 第二章 生产与发送消息

JAVA spring Boot集成kafka的使用 - 生产与发送消息

这里使用的是spring boot集成+kafka


1.生产消息

1.1 传统的消息生产者

传统的方式是需要手动创建Properties的配置对象去加入各种参数然后使用生产对象去发送消息

传统的方式需要在send方法中实现callback接口来获取发送成功或失败的状态

public class Producer {

    static Logger log = Logger.getLogger(Producer.class);

    private static final String TOPIC = "pikachu";
    private static final String BROKER_LIST = "http://localhost/:9092";
    private static KafkaProducer<String,String> producer = null;

    /*
    初始化生产者
     */
    static {

        Properties configs = initConfig();
        producer = new KafkaProducer<String, String>(configs);
    }

    /*
    初始化配置
     */
    private static Properties initConfig(){
        Properties properties = new Properties();
        properties.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,BROKER_LIST);
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,BROKER_LIST);
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringSerializer");
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringSerializer");
        properties.put("client. id", "producer. client. id. demo");//加上groupid
        return properties;
    }

    public static void main(String[] args) throws InterruptedException {
        //消息实体
        ProducerRecord<String , String> record = null;
            record = new ProducerRecord<String, String>(TOPIC, "value:testValue";
            //发送消息,实现callback接口判断是否成功或失败
            producer.send(record, new Callback() {
                @Override
                public void onCompletion(RecordMetadata recordMetadata, Exception e) {
                    if (null != e){
                        log.info("发送失败" + e.getMessage());
                    }else {
                        log.info("发送成功"+String.format("offset:%s,partition:%s",recordMetadata.offset(),recordMetadata.partition()));
                    }
                }
            });
        producer.close();
    }

}

1.2 集成的消息生产者

集成的方式没有直接使用kafka的生产对象去发送消息,而是使用spring下的KafkaTemplate类发送消息,可以直接用监听返回对象获取发送后的状态

@Component
@Slf4j
public class JinkxProducer {

    @Autowired
    private KafkaTemplate<String, Object> kafkaTemplate; //spring framework封装的kafka的包

    //自定义topic
    public static final String TOPIC_TEST = "topic.test";


    public void send(Object obj) {
        String obj2String = JSONObject.toJSONString(obj);
        log.info("准备发送消息为:{}", obj2String);
        //发送消息,监听返回对象包装 实现成功跟失败后的接口
        ListenableFuture<SendResult<String, Object>> future = kafkaTemplate.send(TOPIC_TEST, obj);
        future.addCallback(new ListenableFutureCallback<SendResult<String, Object>>() {
            @Override
            public void onFailure(Throwable throwable) {
                //失败的处理
                log.info(TOPIC_TEST + " - 生产者 发送消息失败:" + throwable.getMessage());
            }

            @Override
            public void onSuccess(SendResult<String, Object> stringObjectSendResult) {
                //成功的处理
                log.info(TOPIC_TEST + " - 生产者 发送消息成功:" + stringObjectSendResult.toString());
            }
        });
    }
}

1.消费消息

1.1 集成的消息消费

从任意来源获取到kafka的主题后,利用kafka监听的注解来监听数据从而进行消费,注意监听的主题topic一定要正确

/**
 * @author huhan
 * @Date 2022/1/12
 * @apiNote
 */
@Component
@Slf4j
public class KafkaConsumer {

    //模拟任意来源订阅的topic 一定要与从生产者定义的主题相同
    public static final String TOPIC_TEST = "topic.test";

    @KafkaListener(topics = TOPIC_TEST)
    public void topic_test(ConsumerRecord<?, ?> record, Acknowledgment ack, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic) {

        Optional message = Optional.ofNullable(record.value());
        if (message.isPresent()) {
            Object msg = message.get();
            log.info("消费者 消费了: Topic:" + topic + ",Message:" + msg);
            ack.acknowledge();
        }
    }

    @KafkaListener(topics = TOPIC_TEST) //@header 是获取kafka请求中的topic数据 使用的是kafkaHeader 包下的枚举类
    public void topic_test1(ConsumerRecord<?, ?> record, Acknowledgment ack, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic) {
        Optional message = Optional.ofNullable(record.value());
        if (message.isPresent()) {
            Object msg = message.get();
            log.info("消费者 消费了: Topic:" + topic + ",Message:" + msg);
            ack.acknowledge();
        }
    }
}

未完待续…

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring Boot可以轻松地集成Kafka,使得应用程序可以轻松地使用Kafka进行消息传递。 以下是Spring Boot集成Kafka的步骤: 1. 添加Kafka依赖 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency> ``` 2. 创建Kafka配置 在application.properties文件中添加以下配置: ``` spring.kafka.bootstrap-servers=localhost:9092 spring.kafka.consumer.group-id=my-group spring.kafka.consumer.auto-offset-reset=earliest 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 ``` 3. 创建生产者 创建一个Kafka生产者,用于将消息发送Kafka中: ``` @Service public class KafkaProducerService { @Autowired private KafkaTemplate<String, String> kafkaTemplate; public void sendMessage(String topic, String message) { kafkaTemplate.send(topic, message); } } ``` 4. 创建消费者 创建一个Kafka消费者,用于从Kafka中接收消息: ``` @Service public class KafkaConsumerService { @KafkaListener(topics = "my-topic") public void listen(String message) { System.out.println("Received message: " + message); } } ``` 5. 发送和接收消息 在应用程序中使用KafkaProducerService发送消息使用KafkaConsumerService接收消息: ``` @Autowired private KafkaProducerService kafkaProducerService; public void sendMessage() { kafkaProducerService.sendMessage("my-topic", "Hello Kafka!"); } ``` 6. 运行应用程序 运行应用程序,发送和接收Kafka消息。 以上就是Spring Boot集成Kafka的步骤。通过使用Spring BootKafka,可以轻松地构建可扩展的应用程序。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值