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 接口。
相关推荐
ltl1 小时前
Transformer 原论文怎么训出来的:8 张 P100、12 小时、warmup 4000 步
后端
why技术1 小时前
AI Coding开始进入第四个时代,我还没上车呢!
前端·人工智能·后端
程序猿追3 小时前
我搭了个网页工具:输入关键词,SERP API 自动吐出比价 Excel
后端
Lee川3 小时前
RAG 实战:从一篇掘金文章出发,拆解检索增强生成的全链路
前端·人工智能·后端
Lee川3 小时前
MCP 高德地图实战:当 AI 学会使用工具,一个协议如何重塑大模型的行动边界
前端·人工智能·后端
楼田莉子3 小时前
C++17新特性:__had_include/属性/求值顺序规则
开发语言·c++·后端
程序员cxuan3 小时前
Codex 把我家烂网给优化后,我 TM 直接原地起飞了。
人工智能·后端·程序员
IT_陈寒3 小时前
Redis批量删除踩了坑,原来DEL命令不是万能的
前端·人工智能·后端
叫我少年4 小时前
C# 命名空间与 using 指令 — 文件范围、全局导入、别名
后端
我是一颗柠檬5 小时前
【MySQL全面教学】MySQL基础SQL语句Day3(2026年)
数据库·后端·sql·mysql·oracle