博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Data Redis实现消息队列——发布/订阅模式
阅读量:6309 次
发布时间:2019-06-22

本文共 2631 字,大约阅读时间需要 8 分钟。

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式。利用redis这两种场景的消息队列都能够实现。

定义:

生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列,谁先抢到消息谁就会从队列中取走消息;即对于每个消息只能被最多一个消费者拥有。
发布者订阅者模式:发布者生产消息放到队列里,多个监听队列的消费者都会收到同一份消息;即正常情况下每个消费者收到的消息应该都是一样的。

下面就以Spring Data Redis实现简单的消息“发布/订阅”服务。

spring-redis使用RedisMessageListenerContainer进行消息监听,客户程序需要自己实现MessageListener,并以指定的topic注册到RedisMessageListenerContainer,这样,在指定的topic上如果有消息,RedisMessageListenerContainer便会通知该MessageListener。

下面是在spring配置文件中配置spring-redis:

上面例子中,最后三个bean的配置是实现发布/订阅服务的关键,RedisMessageListener是自己写的实现了org.springframework.data.redis.connection.MessageListener的业务类,并以“topic.channel” 这个topic注册到RedisMessageListenerContainer。RedisMessageListenerContainer在消息到达后负责通知MessageListener。

下面是RedisMessageListener的代码:

package com.ljq.durian.common.listener;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.connection.Message;import org.springframework.data.redis.connection.MessageListener;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.RedisSerializer;public class RedisMessageListener implements MessageListener {    @Autowired    private RedisTemplate
redisTemplate; @Override public void onMessage(Message message, byte[] pattern) { RedisSerializer
serializer = redisTemplate.getValueSerializer(); Object channel = serializer.deserialize(message.getChannel()); Object body = serializer.deserialize(message.getBody()); System.out.println("主题: " + channel); System.out.println("消息内容: " + String.valueOf(body)); } public RedisTemplate
getRedisTemplate() { return redisTemplate; } public void setRedisTemplate(RedisTemplate
redisTemplate) { this.redisTemplate = redisTemplate; }}

 

这样,应用启动时,消息的订阅方(subscriber)就注册好了。这时候只要使用一个简单的程序,模拟publisher,向指定topic发布消息,RedisMessageListener就可以接收到消息,spring-redis的写法是这样:

redisTemplate.convertAndSend("topic.channel", "hello world!");

转载地址:http://ulxxa.baihongyu.com/

你可能感兴趣的文章
同步类容器和并发类容器——ConcurrentMap、CopyOnWrite、Queue
查看>>
【Leetcode】Longest Common Prefix
查看>>
Django 常用查询
查看>>
hrbust 训练赛 hdu 1017
查看>>
自定义异常
查看>>
innodb数据结构
查看>>
删除无序单链表中值重复出现的节点
查看>>
Python中os和sys模块
查看>>
【noi 2.6_4978】宠物小精灵之收服(DP)
查看>>
使用POI替换word中的特定字符/文字改进版
查看>>
用C#编程的建议
查看>>
C,C++回文字符串判断(字符串指针的用法)
查看>>
C++ Primer Plus 第六版笔记
查看>>
我的大学,我的梦
查看>>
MongoDB -- 安装(win 10)
查看>>
【译】Spring 4 + Hibernate 4 + Mysql + Maven集成例子(注解 + XML)
查看>>
安装SQL sever2008时显示重新启动计算机规则失败,应该怎么解决?
查看>>
Unity接第三方SDK时遇到的坑
查看>>
asp.net mvc 向前台传数据的方式
查看>>
MAC升级node及npm
查看>>