• springboot2.0整合redis的发布和订阅


    1.Maven引用

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>

    2.redis属性配置

    spring.redis.database=0
    spring.redis.host=127.0.0.1
    spring.redis.port=6379
    spring.redis.password=******
    server.port=5555

    3.设置监听相关对象

    3.1接听对象

    RedisReceiver可以是普通类或者继承MessageListener,普通类的写法如下,接收的时候只接收到消息,没有频道名
    package com.example.redistest.config;
    
    import org.springframework.data.redis.connection.Message;
    import org.springframework.data.redis.connection.MessageListener;
    import org.springframework.stereotype.Component;
    
    @Component
    public class RedisReceiver {
    
        public void receiveMessage(String message) {
            // TODO 这里是收到通道的消息之后执行的方法
            System.out.println(message);
        }
    }

    继承MessageListener,就能拿到消息体和频道名。

    package com.example.redistest.config;
    
    import org.springframework.data.redis.connection.Message;
    import org.springframework.data.redis.connection.MessageListener;
    import org.springframework.stereotype.Component;
    
    @Component
    public class RedisReceiver implements MessageListener {
    
        @Override
        public void onMessage(Message message, byte[] pattern) {
            System.out.println(new String(message.getBody()));
            System.out.println(new String(message.getChannel()));
        }
    }

    3.2 配置监听适配器、消息监听容器

    container.addMessageListener(listenerAdapter, new PatternTopic("channel:test"));

    消息监听容器增加监听的消息,第一个参数是监听适配器,第2个参数是监听的频道。

    package com.example.redistest.config;
    
    import org.springframework.cache.annotation.EnableCaching;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.connection.MessageListener;
    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;
    
    @Configuration
    @EnableCaching
    public class RedisCacheConfig {
    
        @Bean
        RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
                                                MessageListenerAdapter listenerAdapter) {
    
            RedisMessageListenerContainer container = new RedisMessageListenerContainer();
            container.setConnectionFactory(connectionFactory);
            // 可以添加多个 messageListener,配置不同的交换机
            container.addMessageListener(listenerAdapter, new PatternTopic("channel:test"));
            return container;
        }
    
        @Bean
        MessageListenerAdapter listenerAdapter(RedisReceiver receiver) {
            System.out.println("消息适配器1");
            return new MessageListenerAdapter(receiver, "onMessage");
        }
    
        @Bean
        StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
            return new StringRedisTemplate(connectionFactory);
        }
    
    }

    3.3 消息发送

    package com.example.redistest.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.data.redis.core.ValueOperations;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import java.util.Date;
    
    @RequestMapping("/redis")
    @Controller
    public class RedisController {
    
        @Autowired
        StringRedisTemplate template;
    
        /**
         * 发布消息
         *
         * @param id
         * @return
         */
        @RequestMapping("/sendMessage/{id}")
        public String sendMessage(@PathVariable String id) {
            for(int i = 1; i <= 5; i++) {
                template.convertAndSend("channel:test", String.format("我是消息{%d}号: %tT", i, new Date()));
            }
            return "";
        }
    
    }

    测试

    postman访问http://localhost:5555/redis/sendMessage/1

    接收消息后打印

  • 相关阅读:
    6.linux下指定项目使用特定jdk
    5.linux 执行shell报bad interpreter:No such file or directory错误
    定时任务基础版本
    同一台电脑安装两个jdk切换问题
    接口如何设计?安全如何保证?签名如何实现?防重如何实现?
    spring boot常见get 、post请求参数处理
    bat例子
    1.Volatile关键字详解
    1.linux目录
    解析xml报文,xml与map互转
  • 原文地址:https://www.cnblogs.com/powerwu/p/11505481.html
Copyright © 2020-2023  润新知