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

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


接收消息后打印

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