## 1.配置管道《监听器容器》
### 注意 redis的发布消息必须马上消费,否则就会丢失。只能消费一次
~~~
/**
* 监听器容器 在配置类中配置
* 负责信息监听的所有线程并分到配监听器中进行处理
*
* @param
* @return
*/
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory redisConnectionFactory, MessageListenerAdapter messageListenerAdapter) {
//Redis消息监听器
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
// 设置工厂
container.setConnectionFactory(redisConnectionFactory);
//设置监听者绑定的管道
ArrayList<Topic> topics = new ArrayList<>();
topics.add(new PatternTopic("log"));
// 第一个参数是监听者 第二个是监听的管道
container.addMessageListener(messageListenerAdapter, topics);
return container;
}
/**
* 消息监听器适配器 能将消息委托给目标方法
* @param messageListener
* @return
*/
@Bean
public MessageListenerAdapter messageListenerAdapter(MessageListener messageListener) {
return new MessageListenerAdapter(messageListener);
}
~~~
## 2.配置消息订阅者
~~~
/**
* 信息订阅者
* @author ZengMingyong
* @since 2022/2/27
*/
@Slf4j
@Component
public class Subscriber implements MessageListener {
@Autowired
private RedisTemplate redisTemplate;
/**
* 信息处理
* @param message 信息管道和信息内容
* @param pattern
*/
@Override
public void onMessage(Message message, byte[] pattern) {
Object channel = redisTemplate.getKeySerializer().deserialize(message.getChannel());
Object body = redisTemplate.getValueSerializer().deserialize(message.getBody());
log.info("消息管道:{},消息:{}",channel,body);
}
}
~~~
# 3.发布者
~~~
/**
* 发布者
* @return
*/
@GetMapping("/s")
public void index() {
HashMap<String, String> map = new HashMap<>();
map.put("admin","user");
map.put("username","zhangshan");
redisTemplate.convertAndSend("log",map);
}
~~~