发布订阅是消息的一种常用模式。常用的就有ActiveMQ,其实Redis也能实现发布订阅。首先Redis提供一个渠道,让消息能够发送到这个渠道上,而多个系统就可以监听这个渠道,如短信信通、邮件系统等。当一条消息发送到渠道是,渠道就会通知他的监听者,这样短信系统、邮件系统就可以得到这个渠道给他们消息,这些监听者在根据自己的处理逻辑处理这些消息。
- 为了接收Redis渠道发送过来的消息,我们首先需要定义一个消息监听器(MessageListener):
@Component
public class MyRedisMessageListener implements MessageListener {
@Override
public void onMessage(Message message, byte[] bytes) {
String messageBoby = new String(message.getBody());
String topic = new String(bytes);
System.out.println("从"+topic+"通道获取到消息:"+messageBoby);
}
}
- 然后我们在系统中配置其他信息,让系统能够不监控Redis的消息:
@Configuration
public class MyRedisListenerConfiguration {
@Autowired
private MyRedisMessageListener myRedisMessageListener;
@Autowired
private RedisConnectionFactory redisConnectionFactory;
//任务池
private ThreadPoolTaskScheduler threadPoolTaskScheduler;
/**
*创建任务池,运行线程等待处理Redis消息
*/
@Bean
public ThreadPoolTaskScheduler getThreadPoolTaskScheduler() {
if (threadPoolTaskScheduler != null) {
return threadPoolTaskScheduler;
}
threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(10);
return threadPoolTaskScheduler;
}
//定义Redis的监听容器
@Bean
public RedisMessageListenerContainer getContainer(){
RedisMessageListenerContainer container=new RedisMessageListenerContainer();
container.setConnectionFactory(redisConnectionFactory);
container.setTaskExecutor(threadPoolTaskScheduler);
container.setTopicSerializer(new StringRedisSerializer());
container.addMessageListener(myRedisMessageListener,new ChannelTopic("topic1"));
return container;
}
}
这里的redisConnectionFactory是springBoot自动创建的,所以这里只需要将他们注入进来。然后定义一个任务池,并设置任务池的大小为10,这样他就可以运行线程,并进行阻塞,等待Redis消息的传入。接着再定义一个Redis消息的监听容器RedisMessageListenerContainer ,并且让容器中设置了Redis连接工厂和指定运行消息的线程池,定义了接收“topic1”渠道的消息,这样就可以监听Redis关于“topic1”渠道的消息。
若希望Redis监听容器可以监听多个渠道,可以传入一个Topic集合:
源码:
- 接下来就可以进行测试了
(1)在redis客户端中
publish topic1 message
(2)使用redisTemplate
redisTemplate.convertAndSend(“topic1”,“message”);