• 译:9.使用Redis进行消息传递


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

    1. 我们将构建什么?

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

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

     2. 我们需要准备什么?

    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:appRedisRedis-x64-3.2.100 那么我们打开命令行窗口后,执行以下命令进入安装文件夹:

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

    源码:点击查看

  • 相关阅读:
    Movement Type
    Excel制表技巧
    [转]MM移动类型的配置相关的系统表,举例说明SAP是如何根据配置抛帐的
    Microsoft Excel:Automatically color alternating rows(columns)
    eBook试载(1):Workbook对象与示例(1)
    辨析:would rather 和 prefer
    Serial Number Management In SAP SD
    <摘录>NAL格式
    linux服务简介关闭不需要的Linux服务
    <摘录>PS和TS流的区别
  • 原文地址:https://www.cnblogs.com/xingyunblog/p/9128568.html
Copyright © 2020-2023  润新知