SpringBoot+Redis 发布与订阅

两个应用都引入

复制代码
 <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>

发布者

复制代码
/**
 * @author hrui
 * @date 2024/8/5 23:32
 */
@RestController
public class PublisherController {

    @Autowired
    private RedisMessagePublisher redisMessagePublisher;

    // 发布消息接口
    @GetMapping("/publish")
    public String publishMessage() {
        String message = "发布一条消息";
        redisMessagePublisher.publish(message);
        return "消息已发布!";
    }
}

/**
 * @author hrui
 * @date 2024/8/5 23:31
 */
@Service
public class RedisMessagePublisher {

    @Autowired
    private RedisTemplate redisTemplate;

    // 发布消息到指定的通道
    public void publish(String message) {
        redisTemplate.convertAndSend("my-topic", message);
        System.out.println("发布消息: " + message + " 到通道: my-topic");
    }
}

spring.application.name=fabu


server.port=8999



spring.data.redis.host=127.0.0.1
spring.data.redis.port=6379

订阅者

复制代码
@Configuration
public class RedisConfig {

    // 配置Redis消息监听容器
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
                                            MessageListenerAdapter listenerAdapter) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        // 订阅固定的通道 "my-topic"
        container.addMessageListener(listenerAdapter, new ChannelTopic("my-topic"));
        return container;
    }

    // 配置消息监听适配器,不需要指定方法名,默认调用handleMessage
    @Bean
    MessageListenerAdapter listenerAdapter(RedisMessageSubscriber subscriber) {
        //指定方法名接收消息
        return new MessageListenerAdapter(subscriber, "onMessage");
        //return new MessageListenerAdapter(subscriber);//使用默认方法handleMessage
    }
}

@Service
public class RedisMessageSubscriber {
    // 使用默认方法名 handleMessage 处理消息
//    public void handleMessage(String message, String channel) {
//        System.out.println("接收到消息: " + message + " 来自通道: " + channel);
//    }


    public void onMessage(String message, String channel) {
        System.out.println("接收到消息: " + message + " 来自通道: " + channel);
    }
}

spring.application.name=dingyue

server.port=9000

spring.data.redis.host=127.0.0.1
spring.data.redis.port=6379

这里只是简单介绍 处理方式有多种

  • 实现 MessageListener 接口 :适合希望直接控制消息处理的类,并且需要实现 onMessage 方法。
  • 使用 MessageListenerAdapter :适合将消息处理方法绑定到已有的类和方法上,不需要实现 MessageListener 接口。
相关推荐
leobertlan5 小时前
2025年终总结
前端·后端·程序员
面向Google编程5 小时前
从零学习Kafka:数据存储
后端·kafka
易安说AI6 小时前
Claude Opus 4.6 凌晨发布,我体验了一整晚,说说真实感受。
后端
易安说AI6 小时前
Ralph Loop 让Claude无止尽干活的牛马...
前端·后端
易安说AI6 小时前
用 Claude Code 远程分析生产日志,追踪 Claude Max 账户被封原因
后端
JH30736 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
颜酱7 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
qq_12498707539 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_9 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
2301_8187320610 小时前
前端调用控制层接口,进不去,报错415,类型不匹配
java·spring boot·spring·tomcat·intellij-idea