发布订阅功能是一个普遍的需求,消息队列也可以进行该功能的实现,这里展示redis怎么实现订阅通知。
1.建立一个任务池
/** 任务池 **/
@Bean
public ThreadPoolTaskScheduler initTaskScheduler() {
ThreadPoolTaskScheduler taskPool = new ThreadPoolTaskScheduler();
taskPool.setPoolSize(20);
return taskPool;
}
暂时设置为20个任务大小进行测试
2.建立监听容器
/** 监听容器 **/
@Bean
public RedisMessageListenerContainer initRedisContainer(RedisMessageListener listener) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(jedisConnectionFactory());
container.setTaskExecutor(initTaskScheduler());
//定义监听渠道
ChannelTopic topic = new ChannelTopic("topic1");
container.addMessageListener(listener,topic);
return container;
}
3.建立监听器,需要@Component交给IOC监听容器才能拿到
@Component
@Slf4j
public class RedisMessageListener implements MessageListener {
@Override
public void onMessage(Message message, byte[] bytes) {
//消息体
String body = new String(message.getBody());
//渠道名称
String topic = new String(bytes);
log.info("接收到消息:{}",body);
log.info("由{}渠道发送而来",topic);
}
}
4.测试
@GetMapping("/listener")
public String testListener() {
redisTemplate.convertAndSend("topic1","hello world");
return "发送完毕";
}
到此显示已经可以正常的通信了,但是当服务器没启动时,在redis控制台publish topic1 msg,在启动服务并不会通知,即消息的可靠性并不确定,相对而言还是更推荐使用消息队列