欢迎光临散文网 会员登陆 & 注册

1 自定义Enable**注解,2 简单了解开门狗机制及源码

2023-07-16 20:32 作者:鲈鱼懂个der的Java  | 我要投稿

我用的版本jkd17,如果是jkd8或者11的在模仿做的时候可以去看下对应注解的源码差不多就可以直接复制粘贴用。

1 自定义Enable**注解

很多时候我们需要自己封装一个starter来进行出来,如果不在启动类上添加对应的@enable**注解,对应的配置类以及bean是不会被创建的

controller代码

自定义Enable**注解

先来说说@Import这个注解,这个注解是用来在加载一个configuration配置类的bean的时候加上@Import注解 会导入后面这个配置xxxSelector这种的bean,如果不添加spring容器是不会在加载上述configuration配置类再去额外的去加载别的configuration中的bean了

BookSelector

selectImports方法作用如下

个人感觉总的来说就是返回对应完整包名下的没有添加注解的configuration的配置类,也可以说是编程式配置类。

BookConfg

Book

测试

没有开启注解


编辑

结果


开启注解


编辑

结果


编辑切换为居中


这个可以用来自己学着封装一个starter,并且可以防止springboot启动的时候少扫描不必要的bean,我前面的文章有写如何自定义一个starter,嘻嘻

自定义starter,注解,实现分布式锁  ---某乎的文章名字(也是我这个菜鸟写的哈哈)


2 简单了解开门狗机制及源码

不耐心的或者觉得写的太乱的可以直接往下翻总结

redission中分布式锁的看门狗机制

依赖版本



个人来说就是一个key被锁住即将释放的时候,如果在当前线程还没执行完任务的时候,有新的线程进来争抢,会导致锁应该给谁的问题,这个时候官方为我们提供看门狗的机制,会自动增加锁的时间,默认的是30秒。不信的话,那个锁住的key的ttl为30秒,自己可以下去试验一下。


调用方法trylock


调用方法的时候默认给的释放时间是-1,这个比较特殊,请记住

这是核心判断锁key的ttl方法,推荐自己单独看上锁源码和操作,lua脚本放下面


再往下看核心代码


注意,这个mapConcurrentMap(自己去查是否线程安全,别一天到晚等着)存放对应的key和那几种service,后续的自己可以去看看,关于源码我下午看着看着记得有点乱。


总结

redission中的会实现一个看门狗的机制,并且在关键上锁方法内里面会有选择是主从节点返回一个resouce还是集群节点返回一个resource,这个应该涉及到主从key问题一致和集群key一致(本人猜想,主要是分布式锁涉及到了订阅发布操作)。还有实现的方法是一段lua脚本,其中对应的是实现的service有这几种。


看门狗续费的实现,其实是启动了一个TimerTask(定时任务),也就是每隔一段时间会有进程去更新一下这个key的ttl。还有那个上锁的key源码都是设置为可读写的,因为要解决对应的看门狗续费问题

如果分布式锁的看门狗续费失效的很多时候的切入点去看一下调用方法里的leaseTime是否是-1这个很关键!!!

也是scheduleExpirationRenewal方法是否正常调用

EVAL这个是执行lua脚本的关键

如果觉得写的很乱没有逻辑/可以改进的地方可直接私信我说一下问题,我会采取改进的,我是鲈鱼,努力分享自己所学。













1 自定义Enable**注解,2 简单了解开门狗机制及源码的评论 (共 条)

分享到微博请遵守国家法律