译:9.使用Redis进行消息传递
本指南引导您完成使用Spring Data Redis发布和订阅通过Redis发送的消息的过程。Messaging with Redis
1. 我们将构建什么?
您将构建一个使用StringRedisTemplate发布字符串消息的应用程序,并使用MessageListenerAdapter为其提供POJO订阅。
使用Spring Data Redis作为发布消息的手段可能听起来很奇怪,但正如您将发现的那样,Redis不仅提供了NoSQL数据存储,还提供了消息传递系统。
2. 我们需要准备什么?
大约十五分钟
一个喜欢的文本编辑器或者IDE
JDK 1.8 或者更高
你也可以导入代码到你的IDE中
-
Redis server
3. 如何完成这个指南?
像大多数Spring入门指南一样,您可以从头开始并完成每个步骤,也可以绕过已熟悉的基本设置步骤。 无论哪种方式,你最终得到工作代码。
为了兼顾无法使用Intellij Idea 的读者,我这里依然采用STS来完成这个指南。
1. 打开我们的STS ,New ————> Import Spring Getting Started Content
2. 输入message, 搜索找到Message Redis
Tips: Code Sets 我们仍然全部勾选,这样系统默认会生成一个已经写好的complete 项目,这样方便我们在Initial项目中模仿学习。
3. 搭建Redis 服务器
在构建消息传递应用程序之前,您需要设置将处理接收和发送消息的服务器。
Redis是一个开源的BSD许可的键值数据存储器,它还附带了一个消息传递系统。
3.1 在Windows 操作系统安装Redis
关于Redis 在windows 上的安装详情可参考我的另外一篇博文: 揭开Redis的神秘面纱
3.2 启动Redis 服务器
下载安装好后,你如果没有配置环境变量需要先进入Redis 安装文件夹
比如我们的安装在C:\app\Redis\Redis-x64-3.2.100 那么我们打开命令行窗口后,执行以下命令进入安装文件夹:
C:\app\Redis\Redis-x64-3.2.100
Tips: 如果已经配置了环境变量可以跳过上述步骤
然后我们执行启动Redis 服务器命令
redis-serve
执行成功后你会看到下面图示的内容:
Tips: 如果看到上述内容,说明服务器启动成功,端口监听在6379端口
4. 创建一个Redis消息接收器
在任何基于消息传递的应用程序中,都有消息发布者和消息接收者。 要创建消息接收方,请使用一种方法来实现接收方以响应消息:
src/main/java/hello/Receiver.java
package hello; import java.util.concurrent.CountDownLatch; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; public class Receiver {
private static final Logger LOGGER=LoggerFactory.getLogger(Receiver.class); private CountDownLatch latch; @Autowired
public Receiver(CountDownLatch latch) {
this.latch=latch;
} public void receiveMessage(String message) {
LOGGER.info("Received <" +message+">");
latch.countDown();
}
}
Receiver是一个简单的POJO,它定义了一种接收消息的方法。 正如您将Receiver注册为消息侦听器时所看到的,您可以根据需要命名消息处理方法。
出于演示的目的,它的构造函数使用倒计数锁存器进行自动装配。 这样,它可以在收到消息时发出信号。
5. 注册侦听器并发送消息
Spring Data Redis提供了使用Redis发送和接收消息所需的所有组件。 具体来说,你需要配置:
- 连接工厂
- 消息侦听器容器
- Redis模板
您将使用Redis模板发送消息,并且您将向Receiver注册消息侦听器容器,以便它可以接收消息。 连接工厂驱动模板和消息侦听器容器,使它们能够连接到Redis服务器。
本示例使用Spring Boot的默认RedisConnectionFactory,它是基于Jedis Redis库的JedisConnectionFactory的一个实例。 连接工厂被注入到消息监听器容器和Redis模板中。
src/main/java/hello/Application.java
package hello; import java.util.concurrent.CountDownLatch; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter; @SpringBootApplication
public class Application { private static final Logger LOGGER=LoggerFactory.getLogger(Application.class); @Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,MessageListenerAdapter listenerAdapter) {
RedisMessageListenerContainer container=new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(listenerAdapter,new PatternTopic("chat"));
return container;
} @Bean
MessageListenerAdapter listenerAdapter(Receiver receiver) {
return new MessageListenerAdapter(receiver,"receiveMessage");
} @Bean
Receiver receiver(CountDownLatch latch) {
return new Receiver(latch);
} @Bean
CountDownLatch latch() {
return new CountDownLatch(1);
} @Bean
StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
return new StringRedisTemplate(connectionFactory);
} public static void main(String[] args)throws InterruptedException{
ApplicationContext ctx=SpringApplication.run(Application.class,args); StringRedisTemplate template=ctx.getBean(StringRedisTemplate.class);
CountDownLatch latch = ctx.getBean(CountDownLatch.class); LOGGER.info("Sending message...");
template.convertAndSend("chat", "Hello from Redis!"); latch.await();
System.exit(0);
}
}
在listenerAdapter方法中定义的bean在容器中定义的消息侦听器容器中注册为消息侦听器,并将侦听“chat”主题上的消息。
由于Receiver类是POJO,因此需要将其包装在实现AddMessageListener()所需的MessageListener接口的消息侦听器适配器中。
消息侦听器适配器还配置为在消息到达时调用Receiver上的receiveMessage()方法。
连接工厂和消息监听器容器bean都是您需要侦听消息的。
要发送消息,您还需要一个Redis模板。在这里,它是一个配置为StringRedisTemplate的bean,它是RedisTemplate的一个实现,它着重于Redis的常用用法,其中键和值都是`String`s。
main()方法通过创建Spring应用程序上下文来解决所有问题。应用程序上下文然后启动消息监听器容器,并且消息监听器容器bean开始监听消息。然后,main()方法从应用程序上下文中检索StringRedisTemplate bean,并使用它发送“来自Redis的Hello!”消息在“chat”主题上。最后,它关闭Spring应用程序上下文并结束应用程序。
6. 编译成可执行Jar
您可以使用Gradle或Maven从命令行运行应用程序。 或者您可以构建一个包含所有必需的依赖项,类和资源的可执行JAR文件,并运行该文件。 这使得在整个开发生命周期内跨越不同环境等,将服务作为应用程序发布,版本化和部署变得非常容易。
生成Jar
如果您正在使用Gradle,则可以使用./gradlew bootRun运行该应用程序。 或者您可以使用./gradlew构建构建JAR文件。 然后你可以运行JAR文件:
java -jar build/libs/gs-messaging-redis-0.1.0.jar
如果您使用的是Maven,则可以使用./mvn spring-boot:run来运行该应用程序。 或者您可以使用./mvn clean包构建JAR文件。 然后你可以运行JAR文件:
java -jar target/gs-messaging-redis-0.1.0.jar
上述过程将创建一个可运行的JAR。 您也可以选择构建经典的WAR文件。
7. 执行成功后你将看到下面的信息:
恭喜! 您刚刚使用Spring和Redis开发了一个简单的发布和订阅应用程序。
源码:点击查看
译:9.使用Redis进行消息传递的更多相关文章
- Redis应用----消息传递
1.摘要 消息传递这一应用广泛存在于各个网站中,这个功能也是一个网站必不可少的.常见的消息传递应用有,新浪微博中的@我呀.给你评论然后的提示呀.赞赞赞提示.私信呀.甚至是发微博分享的新鲜事:知乎中的私 ...
- 【译】StackExchange.Redis中文使用文档
StackExchange.Redis中文使用文档 Intro 最近想深入学习一些 Redis 相关的东西.于是看了看官方的项目StackExchange.Redis,发现里面有一份文档,于是打算翻译 ...
- SpringBoot实战(七)之与Redis进行消息传递
此次教程演示安装的是Window版的Redis, Linux安装Redis可以参考我的这篇博文:Redis的安装和客户端使用注意事项 关于Java连接Redis操作方面可以参考我的这篇博文:Java连 ...
- [Redis知识体系] 一文全面总结Redis知识体系
本系列主要对Redis知识体系进行详解.@pdai Redis教程 - Redis知识体系详解 知识体系 学习资料 知识体系 知识体系 相关文章 首先,我们通过学习Redis的概念基础,了解它适用的场 ...
- Spring Framework 5.x 学习专栏
Spring Framework 5.0 入门篇 Spring构建REST Web Service 消费一个RESTful Web Service 事务管理 Spring使用JDBC访问关系数据 任务 ...
- hydra-microservice 中文手册(3W字预警)
Hydras 是什么? Hydra 是一个 NodeJS 包(技术栈不是重点,思想!思想!思想!),它有助于构建分布式应用程序,比如微服务. Hydra 提供服务发现(service discover ...
- redis配置文件英译汉
# By default Redis asynchronously dumps the dataset on disk. This mode is # good enough in many appl ...
- [译]Redis大冒险
原文:ALCA in Redis-land 一篇对使用Redis在NoSQL的世界中冒险之旅的总结. The legs of our journey 像每次出发一样,先对我们这次的旅程路线做个介绍: ...
- 如何监控Redis性能指标(译)
Redis给人的印象是简单.很快,但是不代表它不需要关注它的性能指标,此文简单地介绍了一部分Redis性能指标.翻译过程中加入了自己延伸的一些疑问信息,仍然还有一些东西没有完全弄明白.原文中Metri ...
随机推荐
- BZOJ1177 [Apio2009]Oil 二维前缀和 二维前缀最值
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1177 题意概括 在一个n*m的矩阵中,每一个位置一个数字. 现在让你选出3个k*k的矩阵,它们互不 ...
- simple简单消息队列
一:介绍 1.优缺点 简单,但是耦合性较高. 这种模式是生产者与消费者一一对应,就是一个产生者,有一个消费者来消费. 如果,多个消费者想消费一个队列中的消息就不适合了.这种情况在后面会接着介绍. 2. ...
- java语言打印上三角和下三角,进一步得到九九乘法表
关于下面两种图形的打印问题 ***** 与 * **** ** *** *** ** **** * ***** 一:程序 1.先打印下三角 2.结果 3.后打印上三角 4.结果 二:知识点 1.f ...
- hdu1573 X问题【中国剩余定理】
<题目链接> X问题 Problem Description 求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod ...
- 【知了堂学习笔记】java 自定义异常
java 常见异常种类(Java Exception): 算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCas ...
- Spring框架学习06——AOP底层实现原理
在Java中有多种动态代理技术,如JDK.CGLIB.Javassist.ASM,其中最常用的动态代理技术是JDK和CGLIB. 1.JDK的动态代理 JDK动态代理是java.lang.reflec ...
- “==”和equals方法究竟有什么区别?
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符. 如果一个变量指向的数据是对象类型的 ...
- C# 创建多级文件夹示例
string str = ""; ; i < j; i++) { str = str + "\\新建文件夹" ; } System.IO.Director ...
- 多臂机测试, AB测试
bandit 强盗,土匪:恶棍:敲诈者 ['bændɪt] 多臂机 multi-armed bandit MAB 简写. one-arm bandit tiger ji 是一种自动AB测试的方 ...
- Lakeshore 中文开发界面,示例项目,飞机大战 等 Lakeshore Chinese development interface, sample project, aircraft war, etc
Lakeshore 中文开发界面,示例项目,飞机大战 等 Lakeshore Chinese development interface, sample project, aircraft war, ...