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 接口。
相关推荐
指令集梦境1 小时前
Cursor + Spring Boot实战:从零写一个RESTful API
spring boot·后端·restful
码云之上2 小时前
聊聊如何设计一个高效、稳定的 Node.js 接入层
前端·后端·node.js
IT_陈寒3 小时前
Vite项目build后路由404了?你可能漏了这个小配置
前端·人工智能·后端
宸津-代码粉碎机4 小时前
Spring AI企业级实战|从RAG优化到Agent多工具调度
java·大数据·人工智能·后端·python·spring
吴佳浩4 小时前
AI Infra 的真相:Go 没输,rust也不是取代
后端·rust·go
喵个咪4 小时前
实时游戏网络协议深度对比:KCP vs WebRTC vs WebSocket
后端·websocket·webrtc
普通网友4 小时前
springboot之集成Elasticsearch
spring boot·后端·elasticsearch
QuZero4 小时前
Guava Cache Deep Dive
java·后端·算法·guava
invicinble4 小时前
关于flowable流程引擎技术栈相关
spring boot
leeyi5 小时前
SSE 实时推流 —— Token 怎么一个个蹦出来
后端·agent