Spring Boot使用Redis进行消息的发布与订阅-阿里云开发者社区

开发者社区> coderzs> 正文

Spring Boot使用Redis进行消息的发布与订阅

简介: Redis 不仅提供一个NoSQL数据库,同时还提供了一套消息系统。 下面我将Spring Boot使用Redis进行消息的发布与订阅具体的流程分享给大家 首先引入依赖 org.
+关注继续查看

Redis 不仅提供一个NoSQL数据库,同时还提供了一套消息系统。
下面我将Spring Boot使用Redis进行消息的发布与订阅具体的流程分享给大家

首先引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-redis</artifactId>
    <version>1.4.7.RELEASE</version>
</dependency>
1.发送消息
@SpringBootApplication
@EntityScan(basePackages= {"cn.sh.sttri.app.messagepush"})
@EnableCaching
@EnableScheduling
public class MessagepushApplication {

    public static void main(String[] args) {

        ApplicationContext ct=SpringApplication.run(MessagepushApplication.class, args);

        StringRedisTemplate template = ct.getBean(StringRedisTemplate.class);
        template.convertAndSend("messagepush", "Hello message !");
        template.convertAndSend("messagepush3", "Hello message3 !");

    }
}

发送消息我们使用StringRedisTemplate来发送键和值均为字符串的消息。在main()方法中我们创建一个Spring应用的Context,初始化消息监听者容器,开始监听消息。然后获取StringRedisTemplate的实例,往messagepush和messagepush3两个主题发送消息

2.Redis 配置消息通道

创建一个Redis消息配置类
连接工程我们使用Spring Boot默认的RedisConnectionFactory
我们将在listenerAdapter方法中定义的Bean注册为一个消息监听者,它将监听messagepush和messagepush3两个主题的消息。

因为Receiver类是一个POJO,要将它包装在一个消息监听者适配器(实现了MessageListener接口),这样才能被监听者容器RedisMessageListenerContainer的addMessageListener方法添加到连接工厂中。有了这个适配器,当一个消息到达时,就会调用receiveMesage()方法进行响应。

@Configuration
public class RedisChannelConfig {
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
                                            MessageListenerAdapter listenerAdapter) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        //订阅主题messagepush和messagepush3
        container.addMessageListener(listenerAdapter, new PatternTopic("messagepush"));
        container.addMessageListener(listenerAdapter, new PatternTopic("messagepush3"));
        //这个container 可以添加多个 messageListener
        return container;
    }

    @Bean
    MessageListenerAdapter listenerAdapter(MessageReceive receiver) {
        //这个地方 是给messageListenerAdapter 传入一个消息接受的处理器,利用反射的方法调用“receiveMessage”
        //也有好几个重载方法,这边默认调用处理器的方法 叫handleMessage 可以自己到源码里面看
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }

    @Bean //注入操作数据的template(这里不需要操作redis数据,和消息队列功能无关)
    StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
        return new StringRedisTemplate(connectionFactory);
    }

}
3.处理MessageReceive 消息接收类的receiveMessage()处理业务

/**redis 消息处理器*/
@Component
public class MessageReceive {

    @Autowired
    private MessageReceiveHandler messageReceiveHandler;
    /**接收消息的方法*/
    public void receiveMessage(String message){
        //System.out.println(message);

        messageReceiveHandler.messagePush(message);
    }

}

到MessageReceiveHandler 类中调用messagePush()

@Component
public class MessageReceiveHandler {
  public void messagePush(String message){
     
   System.out.println("----------收到消息了message:"+message);

 }
}

到这里一个完整的Spring Boot使用Redis进行消息的发布与订阅过程就打通了


img_a9ce2806b7d26ac0d4b0dc529cdc1b09.png
图片.png

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
RocketMQ系列(五)广播与延迟消息
今天要给大家介绍RocketMQ中的两个功能,一个是“广播”,这个功能是比较基础的,几乎所有的mq产品都是支持这个功能的;另外一个是“延迟消费”,这个应该算是RocketMQ的特色功能之一了吧。
403 0
使用Redis搭建持久化K-V存储
最近在项目中需要在多机之间共享一些集合,Hash等有类型的数据结构,如果基于Mysql来存储的话需要预先定义一系列表结构并维护表结构和数据结构的一致性,后续还需要根据时间对数据库做旧数据清理工作,所以开始调研一些能满足下列需求的存储引擎。 具有高可用,持久化的特性。 数据可以设置失效时间,方便自动数据清理。 支持常用数据结构,如集合,有序集合,Hash map,列表等。 支持事务操作,
4331 0
【Spring Boot】使用JDBC 获取相关的数据
【Spring Boot】使用JDBC 获取相关的数据 使用JDBC 获取相关的数据 什么是JDBC Java Database Connectivity 是一种用于执行SQL语句的Java API,与数据库建立连接、发送 操作数据库的语句并处理结果。
4726 0
Spring Boot使用过滤器和拦截器分别实现REST接口简易安全认证
本文通过一个简易安全认证示例的开发实践,理解过滤器和拦截器的工作原理。
4846 0
为何高并发系统中都要使用消息队列?这次彻底懂了!
很多高并发系统中都会使用到消息队列中间件,那么,问题来了,为什么在高并发系统中都会使用到消息队列中间件呢?立志成为资深架构师的你思考过这个问题吗?
21 0
+关注
coderzs
90后阳光青年,现就职于电信研究院Java高级开发工程师,对Java ,iOS,H5, C++等方向有一定的涉足。
33
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载