利用Spring Data Redis 来实现消息的发布订阅机制

news/2024/8/22 16:30:05

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

redis是一款高性能key-value存储系统,不仅能做缓存,还能用于消息队列
这里利用Spring Data Redis 来实现消息的发布订阅机制
Demo地址:https://gitee.com/1913210361/redis-queue-demo

一共3个应用,1个发布者应用,2个订阅者应用

714c267c316e74631e63a1447630410eac0.jpg

发布者应用

58a030993b6d73a8ecd5982f9f1c345f47a.jpg


RedisConfig redis序列化配置
Person 示例传输的POJO对象
Publisher 发布服务

@Component
public class Publisher {

    @Autowired
    @Qualifier(value = "customRedisTemplate")
    private RedisTemplate redisTemplate;

    /**
     * 向指定频道发布消息
     * @param channel 频道名称
     * @param object 消息
     */
    public void publish(String channel,Object object){
        redisTemplate.convertAndSend(channel,object);
    }
}

一个发布测试类

public class DemoApplicationTests {

    @Autowired
    private  Publisher publisher;

    @Test
    public void startPublisher() {
        System.out.println("发布消息");
        //Person person = new Person("redis","10","x");
        publisher.publish("testChannel","渠道1消息");
        publisher.publish("testChannel2","渠道2消息");
    }
}

订阅者应用

39d24b53598685d3e8aa0adc4bbd3c95ba7.jpg
MessageConfig 接收消息配置
RedisConfig redis序列化配置,与发布服务相同
Subscriber 订阅服务

MessageConfig接收消息配置

@Configuration
public class MessageConfig {
    @Autowired
    private Subscriber subscriber;

    @Autowired
    @Qualifier(value = "customRedisTemplate")
    private RedisTemplate redisTemplate;


    /**
     * RedisMessageListenerContainer充当消息侦听器容器。
     * 它用于从Redis通道接收消息并驱动注入其中的MessageListener实例。
     * 侦听器容器负责消息接收的所有线程并将其分派到侦听器进行处理。
     * 消息监听器容器是MDP和消息传递提供者之间的中介,并负责注册以接收消息,资源获取和释放,异常转换等。
     *
     * 此外,为了最小化应用程序占用空间,RedisMessageListenerContainer允许多个侦听器共享一个连接和一个线程,即使它们不共享订阅。
     * 因此,无论应用程序跟踪多少个侦听器或通道,运行时成本在其整个生命周期内保持不变。
     * 此外,容器允许更改运行时配置,以便您可以在应用程序运行时添加或删除侦听器,而无需重新启动。
     * 此外,容器使用延迟订阅方法,仅在需要时使用RedisConnection。
     * 如果所有侦听器都已取消订阅,则会自动执行清理,并释放该线程。

     * 为了帮助消息的异步性,容器需要一个java.util.concurrent.Executor(或Spring的TaskExecutor)来分派消息。
     * 根据负载,侦听器数量或运行时环境,您应该更改或调整执行程序以更好地满足您的需求。 强烈建议选择适当的TaskExecutor来利用其运行时。
     * @param listenerAdapter
     * @return
     */
    @Bean
    RedisMessageListenerContainer container(MessageListenerAdapter listenerAdapter) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(redisTemplate.getConnectionFactory());
        List<Topic> topicList = new ArrayList<>();
        topicList.add(new PatternTopic("testChannel"));
        container.addMessageListener(listenerAdapter, topicList);
        return container;
    }

    /**
     * 消息侦听器适配器,能将消息委托给目标侦听器方法
     * @return
     */
    @Bean
    MessageListenerAdapter listenerAdapter() {
        return new MessageListenerAdapter(subscriber);
    }

}

Subscriber 订阅服务

@Component
public class Subscriber implements MessageListener{

    @Autowired
    @Qualifier(value = "customRedisTemplate")
    private RedisTemplate redisTemplate;

    /**
     * 每次新消息到达时,都会调用回调
     * @param message
     * @param pattern
     */
    @Override
    public void onMessage(Message message, byte[] pattern) {
        RedisSerializer<?> keySerializer = redisTemplate.getKeySerializer();
        RedisSerializer<?> valueSerializer = redisTemplate.getValueSerializer();
        Object channel = keySerializer.deserialize(message.getChannel());
        Object body = valueSerializer.deserialize(message.getBody());
        System.out.println("渠道: " + channel);
        System.out.println("消息内容: " + String.valueOf(body));
    }
}

当我跑下发布服务测试用例的时候,两个订阅者分别会收到来自订阅渠道的消息

b53b5ff34f11cceee6277460d5887b9b3bd.jpg

 

a7bb538f16ea8a1c5c0f23bef18b1089e5a.jpg

转载于:https://my.oschina.net/itsaysay/blog/3011836


http://www.niftyadmin.cn/n/4072638.html

相关文章

H3C-实验七

对每台路由器的直连ip编写动态路由命令 路由器1 rip 1 network 192.168.1.0 network 10.1.1.0 undo summary undo network 10.0.0.0 version 2 network 10.1.1.0 0.0.0.3 路由器2 rip 1 network 10.1.1.0 undo summary undo network 10.0.0.0 version 2 network 10.1.1.0 0.0.0…

linux 删除!号

在linux 中&#xff0c;可能会有错误的或恶意的程序创建包含无法打印的字符的目录。定位和重命名这些目录&#xff0c;这样就可以更容易地检查并删除它们。要完成该操作&#xff0c;您首先需要在 ls中包含 -i开关&#xff0c;以获取该目录的索引节点的数值。然后&#xff0c;使…

音乐剧

音乐剧&#xff08;Musical theater&#xff09;是由喜歌剧及轻歌剧&#xff08;或称“小歌剧”&#xff09;演变而成的&#xff0c;早期称作“音乐喜剧”&#xff0c;后来简称为“音乐剧”&#xff0c;是19世纪末起源于英国的一种歌剧体裁&#xff0c;是由对白和歌唱相结合而演…

计算机二级报错学校能改吗,您好!我在报计算机等级考试的时候报错科目了,已经提交了还能修改嘛...

网上申报的话可以给主管考试部门打电话申请把你提交的资料退回重新提交。交费后&#xff0c;能退钱&#xff0c;基本上退不了&#xff0c;除非你去找考点的老师帮你取消报名。报名后&#xff0c;改科目&#xff0c;还是得去找考点的老师&#xff0c;也就是报考的学校。如果可以…

仿小米下载热榜,RecyclerView item轮流入场

具体使用方法在这&#xff1a;项目地址 下面说下具体实现&#xff1a; 首先&#xff0c;既然做了&#xff0c;那就多做几种模式&#xff0c;左右两边都可以设置轮流进入或是轮流退出&#xff0c;所以先定义两个枚举类来说明是哪种模式&#xff1a; public enum ScrollDirection…

MTF测试图卡规格

1.Imatest Chart Finder计算图卡大小 测试camera MTF时&#xff0c;需要知道所需要的图卡的大小&#xff0c;Imatest提供了一个网页&#xff0c;只要输入sensor的像素&#xff0c; 镜头的视场角&#xff0c;还有镜头到图卡的距离就可以得出图卡的大小。 网页链接[Imatest Chart…

列举计算机应用领域,列举出计算机的4个应用领域?

计算机的应用领域已渗透到社会的各行各业&#xff0c;正在改变着传统的工作、学习和生活方式&#xff0c;推动着社会的发展。计算机的主要应用领域如下&#xff1a;1.科学计算(或数值计算)科学计算是指利用计算机来完成科学研究和工程技术中提出的数学问题的计算。在现代科学技…

音乐类型

01.什么是trip-hop&#xff1f;  trip-hop是英伦&#xff0f;欧洲跳舞音乐的一种&#xff0c;它的名字来源是“ trip&#xff0b; hip hop"&#xff1d; trip-hop"&#xff0c;因为它发源自英国的bristol,因此最早时称作"bristol hip-hop".。由于把把hip…