前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis常用技术-----发布订阅

Redis常用技术-----发布订阅

作者头像
秃头哥编程
发布2019-06-11 17:35:50
3550
发布2019-06-11 17:35:50
举报
文章被收录于专栏:秃头哥编程秃头哥编程

银行卡消费的时候,银行往往会通过微信、短信或邮件通知用户交易的详细信息,这便是发布订阅模式。

我们可以使用下面的命令进行模拟

先打开一个客户端1,输入命令

代码语言:javascript
复制
SUBSCRIBE chat

表示客户端1订阅一个名为chat的渠道,之后打开客户端2,输入命令

代码语言:javascript
复制
publish chat "Hello World!"

这个时候客户端2就向渠道chat发送了一条消息,再看客户端1,可以看到消息已经输出。

在Spring中,我们自定义接收消息的类,需要实现MessageListener接口,并实现接口定义的方法onMessage,代码如下。

代码语言:javascript
复制
public class RedisMessageListener implements MessageListener {

    @SuppressWarnings("rawtypes")
    private RedisTemplate rt;

    @SuppressWarnings("rawtypes")
    public RedisTemplate getRt() {
        return rt;
    }

    @SuppressWarnings("rawtypes")
    public void setRt(RedisTemplate rt) {
        this.rt = rt;
    }


    @Override
    public void onMessage(Message message, byte[] pattern) {
        // 获取消息
        byte[] body = message.getBody();
        // 使用值序列化器转换
        String msgBody = (String)getRt().getValueSerializer().deserialize(body);
        System.out.println(msgBody);
        // 获取channel
        byte[] channel = message.getChannel();
        // 使用字符串序列化器转换
        String channelStr = (String)getRt().getStringSerializer().deserialize(channel);
        System.out.println(channelStr);
        // 渠道名称转换
        String bytesStr = new String(pattern);
        System.out.println(bytesStr);
    }

}

这里我们没有使用注解,所以要去spring.xml中注册bean

代码语言:javascript
复制
<!-- 实例化类 -->
<bean id="redisMsgListener" class="com.codeliu.transaction.RedisMessageListener">
    <property name="rt" ref="redisTemplate"></property>
</bean>

实例化监听类之后还不行,还得给一个监听容器,在Spring中对应的类为RedisMessageListenerContainer,它可以用来监听Redis的发布订阅消息。同样在Spring.xml中进行配置

代码语言:javascript
复制
<!-- 配置监听容器 -->
<bean id="topicContainer" class="org.springframework.data.redis.listener.RedisMessageListenerContainer" destroy-method="destroy">
    <!-- redis连接工厂 -->
    <property name="connectionFactory" ref="connectionFactory"></property>      
    <!-- 连接池,只有线程池生存,才能继续监听 -->
    <property name="taskExecutor">
        <bean class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
            <property name="poolSize" value="3"></property>
        </bean>
    </property>     
    <!-- 消息监听map -->
    <property name="messageListeners">
        <map>
            <!-- 配置监听者,key-ref与bean id保持一致 -->
            <entry key-ref="redisMsgListener">
                <!-- 监听类 -->
                <bean class="org.springframework.data.redis.listener.ChannelTopic">
                    <constructor-arg value="chat"></constructor-arg>
                </bean>
            </entry>
        </map>
    </property>
</bean>

这里配置了线程池,这个线程池将会持续的生存以等待消息传入,而这里配置了容器用id为redisMsgListener的Bean进行渠道chat的监听。当消息通过渠道chat方法的时候,就会使用id为redisMsgListener的Bean处理消息。

下面进行测试

代码语言:javascript
复制
public static void main(String[] args) {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
    RedisTemplate rt = applicationContext.getBean(RedisTemplate.class);
    String channel = "chat";
    // 向渠道chat发送消息
    rt.convertAndSend(channel, "Hello World!");
}

convertAndSend方法就是向指定的渠道发送消息。

输出

代码语言:javascript
复制
Hello World!
chat
chat
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 秃头哥编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档