【消息队列开发】 实现消费者订阅消息

🍃前言

本次开发任务

  • 实现消费者订阅消息

🌳关于订阅消息方法参数解析

我们关于订阅消息的方法如下:

在这里插入图片描述

  • consumerTag: 消费者的身份标识
  • autoAck: 消息被消费完成后, 应答的方式. 为 true 自动应答. 为 false 手动应答.
  • consumer: 是一个回调函数,此处类型设定成函数式接口. 这样后续调用 basicConsume 并且传实参的时候, 就可以写作 lambda 样子了
  • queueName:需要订阅消息的队列

在这里插入图片描述

回调函数实现代码如下:

/*
 * 只是一个单纯的函数式接口(回调函数). 收到消息之后要处理消息时调用的方法.
 */
@FunctionalInterface
public interface Consumer {
    // Delivery 的意思是 "投递", 这个方法预期是在每次服务器收到消息之后, 来调用.
    // 通过这个方法把消息推送给对应的消费者.
    void handleDelivery(String consumerTag, BasicProperties basicProperties, byte[] body) throws MqException, IOException;
}

🎋如何实现将消息推送给消费者

消费者订阅消息后,如何将消息推送给消费者呢?

首先我们需要知道一个队列都有那些消费者进行消费,且一个队列的消费者肯定不止一个。

这里博主的做法是,给最初的队列类,加一个集合类的属性,用于储存当前都有那些消费者进行消费

这么多的消费者,那他们应该怎样消费这些消息呢?

这里博主采用轮询的方式进行消费,轮着进行消费就好

以此我们再创建一个属性为 consumerSeq 记录当前取到了第几个消费者. 方便实现轮询策略.

在这里插入图片描述

🎍消费者类

对于消费者,我们创建一个类,并给出基础属性,实现如下:

/*
 * 表示一个消费者(完整的执行环境)
 */
public class ConsumerEnv {
    private String consumerTag;
    private String queueName;
    private boolean autoAck;
    // 通过这个回调来处理收到的消息.
    private Consumer consumer;

    public ConsumerEnv(String consumerTag, String queueName, boolean autoAck, Consumer consumer) {
        this.consumerTag = consumerTag;
        this.queueName = queueName;
        this.autoAck = autoAck;
        this.consumer = consumer;
    }

    public String getConsumerTag() {
        return consumerTag;
    }

    public void setConsumerTag(String consumerTag) {
        this.consumerTag = consumerTag;
    }

    public String getQueueName() {
        return queueName;
    }

    public void setQueueName(String queueName) {
        this.queueName = queueName;
    }

    public boolean isAutoAck() {
        return autoAck;
    }

    public void setAutoAck(boolean autoAck) {
        this.autoAck = autoAck;
    }

    public Consumer getConsumer() {
        return consumer;
    }

    public void setConsumer(Consumer consumer) {
        this.consumer = consumer;
    }
}

🍀消费消息的流程

如果有消息需要进行消费,我们就将该队列放入 一个阻塞队列中,并用一个扫描线程对给该队列进行扫描。若有需要消费的消息队列,就将该队列取出来,交给线程池进行执行信息的回调函数。
在这里插入图片描述
该流程,我们创建一个类ConsumerManager进行实现这些操作:

在这里插入图片描述
该部分代码后面博主再进行书写

🎄如何实现消息确认呢?

我们在执行回调函数之前,先将需要消费的该消息放入待确认的集合中,若执行回调函数没有发生异常与错误,我们就认为消息消费成功。实现了消息确认。

⭕总结

关于《【消息队列开发】 实现消费者订阅消息》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以回答你关于Spring集成Kafka消费者监听的问题。在Spring集成Kafka消费者监听的过程中,我们可以使用Spring Kafka提供的注解@KafkaListener来实现消息订阅和消费。 下面是一个简单的示例: 首先,我们需要在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> <version>2.5.5.RELEASE</version> </dependency> ``` 接着,在Spring Boot应用程序中创建一个KafkaListenerConfig类,用于配置Kafka消费者: ``` @Configuration @EnableKafka public class KafkaListenerConfig { @Value("${spring.kafka.bootstrap-servers}") private String bootstrapServers; @Bean public Map<String, Object> consumerConfigs() { Map<String, Object> props = new HashMap<>(); props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); return props; } @Bean public ConsumerFactory<String, String> consumerFactory() { return new DefaultKafkaConsumerFactory<>(consumerConfigs()); } @Bean public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() { ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>(); factory.setConsumerFactory(consumerFactory()); return factory; } } ``` 在上面的代码中,我们使用@EnableKafka注解启用Kafka监听器,并通过@Bean注解创建了一个Kafka消费者工厂和一个Kafka监听器容器工厂。 接下来,我们可以在Spring Boot应用程序中创建一个Kafka消息监听器类: ``` @Component public class KafkaMessageListener { @KafkaListener(topics = "test-topic", groupId = "test-group") public void listen(String message) { System.out.println("Received message: " + message); } } ``` 在上面的代码中,@KafkaListener注解指定了要订阅的Kafka主题和消费者组ID。在监听方法中,我们可以处理收到的消息。 最后,我们需要在application.properties文件中配置Kafka的连接信息: ``` spring.kafka.bootstrap-servers=localhost:9092 ``` 这样,我们就完成了Spring集成Kafka消费者监听的配置。当应用程序运行时,它将自动订阅指定的Kafka主题并处理收到的消息

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

遇事问春风乄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值