简介
Redisson提供给开发者使用的另一个高性能功能组件--发布-订阅式的主题,可实现类似消息中间件RabbitMQ的消息通信的功能,实际应用有:服务模块解耦、消息通信等业务模块中,可以说是Redisson在构建分布式应用系统中的有一大利器。与消息中间件RabbitMQ的基本消息模型类似,Redisson的基于发布-订阅式主题主要由3大部分组成,即生产者、消费者和消息。生产者将消息以主题的形式发布,而消费者只需要订阅相应的主题,即可实现自动监听消费处理消息。
代(上)码(菜)
生产者
/**
* 记录用户登录成功后的轨迹-生产者
*/
@Component
public class UserLoginPublisher {
//定义日志
private static final Logger log= LoggerFactory.getLogger(UserLoginPublisher.class);
//构造基于发布-订阅式主题的Key
private static final String topicKey="redissonUserLoginTopicKey";
//构造Redisson客户端操作实例
@Autowired
private RedissonClient redissonClient;
/**
* 异步发送消息
* @param dto
*/
public void sendMsg(UserLoginDto dto){
try {
//判断消息对象是否为null
if (dto != null){
log.info("记录用户登录成功后的轨迹-生产者-发送消息:{} ", dto);
//创建主题
RTopic rTopic=redissonClient.getTopic(topicKey);
//发布消息
rTopic.publishAsync(dto);
}
}catch (Exception e){
log.error("记录用户登录成功后的轨迹-生产者-发生异常:{}", dto, e.fillInStackTrace());
}
}
}
消费者
/**
* 记录用户登录成功后的轨迹-消费者
*/
@Component
public class UserLoginSubscriber implements ApplicationRunner,Ordered{
//定义日志
private static final Logger log= LoggerFactory.getLogger(UserLoginSubscriber.class);
//构造基于发布-订阅式主题的Key
private static final String topicKey="redissonUserLoginTopicKey";
//构造Redisson客户端操作实例
@Autowired
private RedissonClient redissonClient;
/**
* 在这个方法里实现“不断地监听该主题中消息的动态” - 即间接地实现自动监听消费
* @param arguments
* @throws Exception
*/
@Override
public void run(ApplicationArguments arguments) throws Exception {
try {
RTopic rTopic=redissonClient.getTopic(topicKey);
rTopic.addListener(UserLoginDto.class, new MessageListener
<UserLoginDto>() {
@Override
public void onMessage(CharSequence charSequence, UserLoginDto
dto) {
log.info("记录用户登录成功后的轨迹-消费者-监听消费到消息:{} ",dto);
//判断消息是否为null
if (dto!=null){
//如果消息不为null,则将消息记录入数据库中
System.out.println("insert into table");
}
}
});
}catch (Exception e){
log.error("记录用户登录成功后的轨迹-消费者-发生异常:",e.fillInStackTrace());
}
}
/**
* 设置项目启动时也跟着启动
* @return
*/
@Override
public int getOrder() {
return 0;
}
}
PS:简单补充下消费者实现的两个接口
1.ApplicationRunner
springBoot项目启动时,若想在启动之后直接执行某一段代码,就可以用 ApplicationRunner这个接口,并实现接口里面的run(ApplicationArguments args)方法,方法中写上自己的想要的代码逻辑。
2.Ordered
传送门:
https://www.cnblogs.com/fangjian0423/p/spring-Ordered-interface.html