热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

9.使用Redis进行消息传递

本指南引导您完成使用SpringDataRedis发布和订阅通过Redis发送的消息的过程。MessagingwithRedis1.我们将构建什么?您将构建一个使用StringRed

本指南引导您完成使用Spring Data Redis发布和订阅通过Redis发送的消息的过程。Messaging with Redis

1. 我们将构建什么?

您将构建一个使用StringRedisTemplate发布字符串消息的应用程序,并使用MessageListenerAdapter为其提供POJO订阅。

使用Spring Data Redis作为发布消息的手段可能听起来很奇怪,但正如您将发现的那样,Redis不仅提供了NoSQL数据存储,还提供了消息传递系统。

 2. 我们需要准备什么?
  • 大约十五分钟

  • 一个喜欢的文本编辑器或者IDE

  • JDK 1.8 或者更高

  • Gradle 4+ 或者 Maven 3.2+

  • 你也可以导入代码到你的IDE中

    • Spring Tool Suite (STS)

    • IntelliJ IDEA

      • 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开发了一个简单的发布和订阅应用程序。

源码:点击查看


推荐阅读
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 第2讲 Android Camera Native Framework 初识cameraserver进程
    本讲是AndroidCameraNativeFramework专题的第2讲,我们初识CameraServer,包括如下内容:Camera ... [详细]
author-avatar
随之爱_629
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有