springboot集成redis实现消息的订阅与发布

 更新时间:2024年05月23日 11:23:35   作者:厉害哥哥吖  
本文主要介绍了springboot集成redis实现消息的订阅与发布,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言 

本节内容主要介绍springboot项目通过集成redis,如何利用redis的订阅发布机制,完成系统消息的发布与订阅功能。Redis中的发布与订阅是一种消息通信模式,允许发送者(发布者)将消息发送给多个接收者(订阅者)。在 Redis中,发布与订阅通过PUBLISH和SUBSCRIBE命令实现。频道(Channel):频道是消息的通道,用于区分不同类型或主题的消息。订阅者可以选择订阅感兴趣的频道,以接收相应的消息。Redis的发布与订阅模式是无状态的,即发布者在发送消息之后不需要关心是否有订阅者接收到消息,也不需要维护订阅者的信息。当发布者向某个频道发布消息时,所有订阅了该频道的订阅者都会接收到相同的消息。这种机制使得消息的发布者和订阅者之间能够实现解耦,并支持一对多的消息传递方式,即广播形式。

正文

①创建一个web项目,引入redis启动器的pom依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
</dependency>

② 在application.yml中添加redis的配置

③创建redis的配置类, 初始化redis工具类RedisTemplate和redis订阅消息的监听容器RedisMessageListenerContainer

package com.yundi.atp.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.serializer.StringRedisSerializer;


@Configuration
public class RedisConfig {
    /**
     * 初始化一个Redis消息监听容器
     * @param connectionFactory
     * @return
     */
    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        // 添加其他配置,如线程池大小等
        return container;
    }

    @Bean
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
        redisTemplate.setDefaultSerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

 ④创建redis消息频道的常量

package com.yundi.atp.constant;

public class ChannelConstant {
    /**
     * 广播通道
     */
    public static final String CHANNEL_GLOBAL_NAME = "channel-global";

    /**
     * 单播通道
     */
    public static final String CHANNEL_SINGLE_NAME = "channel-single";
}

⑤ 创建一个http请求,用于发布基于redis的消息供客户端订阅

package com.yundi.atp.controller;

import com.yundi.atp.constant.ChannelConstant;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;


@RequestMapping(value = "base")
@RestController
public class BaseController {
    @Resource
    private RedisTemplate redisTemplate;

    /**
     * 发布广播消息
     *
     * @param msg
     */
    @GetMapping(value = "/publish/{msg}")
    public void sendMsg(@PathVariable(value = "msg") String msg) {
        redisTemplate.convertAndSend(ChannelConstant.CHANNEL_GLOBAL_NAME, msg);
    }
}

⑥ 创建一个消息订阅者,实现MessageListener接口,通过重写onMessage方法订阅消息

package com.yundi.atp.listen;

import com.yundi.atp.constant.ChannelConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.nio.charset.StandardCharsets;


@Slf4j
@Component
public class RedisMessageSubscriber implements MessageListener {
    @Autowired
    private RedisMessageListenerContainer redisMessageListenerContainer;

    /**
     * 订阅消息:将订阅者添加到指定的频道
     */
    @PostConstruct
    public void subscribeToChannel() {
        //广播消息
        redisMessageListenerContainer.addMessageListener(this, new ChannelTopic(ChannelConstant.CHANNEL_GLOBAL_NAME));
    }

    @Override
    public void onMessage(Message message, byte[] bytes) {
        String channel = new String(message.getChannel(), StandardCharsets.UTF_8);
        String messageBody = new String(message.getBody(), StandardCharsets.UTF_8);
        log.info("Received message: " + messageBody + " from channel: " + channel);
    }
}

 ⑦启动项目,通过http请求发布消息,查看是否能够订阅成功消息

⑧开启redis客户端测试,同样能够订阅到消息,证明redis的消息的订阅与发布是无状态的且是广播模式

到此这篇关于springboot集成redis实现消息的订阅与发布的文章就介绍到这了,更多相关springboot redis消息订阅与发布内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mybatis mapper.xml中如何根据数据库类型选择对应SQL语句

    mybatis mapper.xml中如何根据数据库类型选择对应SQL语句

    这篇文章主要介绍了mybatis mapper.xml中如何根据数据库类型选择对应SQL语句,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java零基础入门数组

    Java零基础入门数组

    数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同。Java 语言中提供的数组是用来存储固定大小的同类型元素
    2022-04-04
  • Springboot中基于X509完成SSL检验的原理与实现

    Springboot中基于X509完成SSL检验的原理与实现

    本文详细解析了HTTPS通信中SSL证书的作用和原理,SSL证书建立在客户端和服务器之间的安全通道,确保数据传输的完整性和保密性,详细的介绍了Springboot中基于X509完成SSL检验的原理与实现,感兴趣的可以了解一下
    2024-09-09
  • java多线程CountDownLatch与线程池ThreadPoolExecutor/ExecutorService案例

    java多线程CountDownLatch与线程池ThreadPoolExecutor/ExecutorService案

    这篇文章主要介绍了java多线程CountDownLatch与线程池ThreadPoolExecutor/ExecutorService案例,
    2021-02-02
  • JavaSE网络原理之UDP和TCP原理详解

    JavaSE网络原理之UDP和TCP原理详解

    TCP、UDP都是属于运输层的协议,提供端到端的进程之间的逻辑通信,而IP协议是提供主机间的逻辑通信,应用层规定应用进程在通信时所遵循的协议,这篇文章主要介绍了JavaSE网络原理之UDP和TCP原理的相关资料,需要的朋友可以参考下
    2026-01-01
  • Java8中Optional类型和Kotlin中可空类型的使用对比

    Java8中Optional类型和Kotlin中可空类型的使用对比

    这篇文章主要给大家介绍了关于Java8中Optional类型和Kotlin中可空类型的使用对比,文中通过示例代码给大家介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-09-09
  • mybatis动态生成sql语句的实现示例

    mybatis动态生成sql语句的实现示例

    在MyBatis中,动态SQL是一个非常重要的特性,它允许我们根据条件动态地生成SQL语句,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • java内存溢出示例(堆溢出、栈溢出)

    java内存溢出示例(堆溢出、栈溢出)

    这篇文章主要介绍了java内存溢出示例(堆溢出、栈溢出),需要的朋友可以参考下
    2014-04-04
  • java中堆和栈的区别分析

    java中堆和栈的区别分析

    这篇文章主要介绍了java中堆和栈的区别,分析了Java中堆和栈的原理及使用时的注意事项,需要的朋友可以参考下
    2014-09-09
  • 分析Java中的类加载问题

    分析Java中的类加载问题

    很多时候提到类加载,大家总是没法马上回忆起顺序,这篇文章会用一个例子为你把类加载的诸多问题一次性澄清
    2021-06-06

最新评论