# 监听器解释
监听一个对象的某个事件,对象的某个事件发生的时候触发监听器代码.
# 业务场景
一对多调用场景,比如当一个账号注册成功后,要给发送短信,要初始化这个人的积分为0,要刷新缓存,还要做很多其他的事情,我们想不到,那我们怎么办呢?难道是想到了在继续改业务代码吗?有没有一种松耦合的方式解决此问题呢? 当然有,我们今天说的监听器就是为了解决此问题的.
# fhs监听器的几个名词
namespace: 代表被监听对象的别名,比如user
event: 事件, user 可能有多个事件,比如注册成功,比如修改密码成功
listener: 监听器,监听器中配置了我要监听谁的什么事件,要触发什么动作
# 使用FHS监听器
- 首先确定被监听者的事件名和namespace,在事件发生的时候调用所有的监听器.
//注入监听器注册中心
@Autowired
protected DistributedListenerRegister distributedListenerRegister;
// 发送通知
Map<String,Object> extMap = new HashMap<>();
extMap.put(CommonConstant.USER_ID,changePricePO.getUpdateUser());
try{
distributedListenerRegister.callListener("user", "updatePassword", changePricePO,extMap);
}catch (Exception e){
LOGGER.error(JsonUtils.bean2json(changePricePO) + "自动提交失败",e);
}
2.实现一个普通监听器
@Component
public class UserUpdatePasswordHelloListener implements DistributedListener {
@Override
public Set<String> namespace() {
Set<String> namespaceSet = new HashSet<>();
//采购订单
namespaceSet.add("user");
return namespaceSet;
}
@Override
public String eventType() {
return "updatePassword";
}
@Override
public Map<String, Object> onMessage(Map<String, Object> param) {
System.out.println('我知道了,用户改密码了');
return null;
}
}
3.实现一个分布式监听器(使用springcloud) A 定义一个监听器接口,让用户注册服务的 application 依赖此接口.
FeignClient(name = "jiuzhou-module-bill-web", primary = false)
public interface RegistingBaseReverseAuditListenerRpcService extends DistributedListener {
/**
* 目标业务namespace
*
* @return
*/
@Override
default Set<String> namespace() {
Set<String> namespaceSet = new HashSet<>();
//采购订单
namespaceSet.add("buyTaskOrder");
return namespaceSet;
}
/**
* 事件类型
*
* @return 事件类型
*/
@Override
default String eventType() {
return CommonConstant.LISTENER_TYPE_REVERSE_AUDIT;
}
/***
* 采购订单反审核的时候触发的方法
* @param param 参数
* @return 如果返回结果包含errorMsg 代表有关联数据
*/
@Override
default Map<String, Object> onMessage(Map<String, Object> param) {
return this.buyTaskOrderReverseAuditCheck(param);
}
/**
* 采购订单反审核
*
* @param param 参数
* @return 反审核结果
*/
@PostMapping("/rpc/com.e6yun.project.jiuzhou.module.check.service.CheckBillRegistedBaseService/buyTaskOrderReverseAuditCheck")
Map<String, Object> buyTaskOrderReverseAuditCheck(@RequestBody Map<String, Object> param);
/**
* 这里返回2 指的是我比其他的listener后执行,优先执行合同本模块的listener然后执行我
* 不然那些本模块的报错的话,我无法回滚
*
* @return
*/
@Override
default int getOrder() {
return 2;
}
@Override
default Class<? extends DistributedListener> getRpcInterfaceClass() {
return RegistingBaseReverseAuditListenerRpcService.class;
}
@Override
default boolean isRpc() {
return true;
}
}
B 写他的实现类 此处省略,记得一定要 让对应的service 或者控制器 implement 此接口.
C 监听器注册中心在调用监听器的时候会优先找直接实现类来调用,如果找不到才会找feign代理实现.
当前内容版权归 fhs-opensource 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 fhs-opensource .