## 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);
}
~~~