Springboot + Redis发布订阅模式实现简陋版聊天室

安装redis就不写了,直接开启redis服务。

(1)去到我自己Mac 电脑的安装目录下 cd /usr/local/bin
(2)开启:redis-server
在这里插入图片描述

成功了。

SpringBoot中pom.xml文件添加redis的依赖包:

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-pool2</artifactId>
		</dependency>

配置redis的端口号,用户名和密码,最大连接数,redis服务器IP地址等等参数。
在这里插入图片描述

# Redis数据库索引(默认为0)
spring.redis.database=0  
# Redis服务器地址
spring.redis.host=localhost
# Redis服务器连接端口
spring.redis.port=6379  
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制) 默认 8
spring.redis.lettuce.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
spring.redis.lettuce.pool.max-wait=-1
# 连接池中的最大空闲连接 默认 8
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接 默认 0
spring.redis.lettuce.pool.min-idle=0

写一个配置类,加上@Configuration注解让Spring容器管理它的生命周期和作用范围。

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
    @Bean
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                StringBuilder sb = new StringBuilder();
                sb.append(target.getClass().getName());
                sb.append(method.getName());
                for (Object obj : params) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }
        };
    }
}
Controller:
@RequestMapping("/testRedis")
    @ResponseBody
    public String getUrl(String messages , String username){
        // 连接频道,发送消息
        stringRedisTemplate.convertAndSend("jojo_channel" , messages);
        // 调用客户端,获取发送的聊天消息
        String demo = RedisClient.returnMessage();
 
        return "客户端接收到的的消息:"+demo;
    }
RedisClient 接收消息的客户端:
@Configuration
public class RedisClient {

    public static String messages;

    @Bean
    MessageListenerAdapter messageListenerAdapter(){
        return new MessageListenerAdapter((MessageListener) (message, pattern) -> {
            System.out.println("接收到的信息: " + message.toString());
            messages = message.toString();
            returnMessage();
        });
    }
// 创建连接和监听频道
    @Bean
    RedisMessageListenerContainer redisContainer(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container
                = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(messageListenerAdapter(), topic());
        return container;
    }
   // 设置要关注的频道
    @Bean
    ChannelTopic topic() {
        return new ChannelTopic("jojo_channel");
    }
// 自定义方法返回信息
    public static String returnMessage(){
        System.out.println("准备返回的信息:"+messages);
        return messages;
    }

}

用postman请求看看发布消息后订阅方是否能收到。

在这里插入图片描述
在这里插入图片描述

这就是成功了,但是这里只是非常简单而已,请求的那个controller就是模拟消息发布者,Client里面定义的接收消息的方法并且返回模拟消息接收,其余的可以自己做个简单拆分,发送消息做成一个接口,接收消息返回再做一个接口。注意redis是基于内存的,Client掉线的话,再上线也是收不到信息了的。

猜你喜欢

转载自blog.csdn.net/whiteBearClimb/article/details/104679613
今日推荐