3.7 Redis的Sub/Pub
3.7.1 Receiver类
public class Receiver {
private static final Logger logger = LogManager.getLogger(Receiver.class);
/*
用处:假如有10个订阅者,就设置为10,这样每当一个订阅者接收之后调用latch.cutDown()
发布者发布方法最后调用latch.await(),即所有订阅者都接受到消息方法结束
*/
private CountDownLatch latch;
public void setLatch(CountDownLatch latch) {
this.latch = latch;
}
public void receiveMessage(String message){
// 可以在这里执行一些操作,比如向某些用户发送信息
logger.info("receive"+message);
latch.countDown();
}
}
3.7.2 RedisConfig.java
//**************pub/sub*************
/*
* 信息的接受者
* */
@Bean
public RedisMessageListenerContainer listenerContainer(){
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory());
// addMessageListener(监听器,监听的频道),可以有多个Listener
container.addMessageListener(messageListenerAdapter(),new PatternTopic("zyy"));
return container;
}
@Bean
public MessageListenerAdapter messageListenerAdapter(){
// MessageListenerAdapter(监听实例,监听的方法)
return new MessageListenerAdapter(receiver(),"receiveMessage");
}
@Bean
public Receiver receiver(){
Receiver receiver = new Receiver();
receiver.setLatch(latch());
return receiver;
}
@Bean
CountDownLatch latch(){
return new CountDownLatch(1); //灵活的设置值
}
3.7.3 测试类
public class SubPubTest extends BaseTest {
@Autowired
private StringRedisTemplate template;
@Autowired
CountDownLatch latch;
@Test
public void test() throws InterruptedException {
// 模拟服务器向某个监听器发送信息,这里会执行Receiver类的receiveMessage方法
template.convertAndSend("zyy","hello SubPub!");
latch.await(); //直到CountDownLatch的值为0才停止
}
}
3.7.4 总结
先建立接受者,可以认为是一个有若干个方法(receiveMessage)的普通类(Receiver),将类装载到Spring容器中 需要配置一个监听器(MessageListenerAdapter),并告诉监听器哪个类(Receiver)接受信息,以及处理信息的方法名(receiveMessage) 配置监听器容器(RedisMessageListenerContainer),将监听器加入到容器中,还要告诉该监听器负责监听的关键话题(new PatternTopic(“zyy”)),可以是Topic的任一个实现类,但关键字只能为字符串
3.7.5 CountDownLatch类
辅助监听器:每次发送给一个订阅者就执行cutDown(),到0就意味着全部发送完毕