写在前面接上一篇,这篇继续梳理一下自己在查找问题中遇到的疑惑点和解决过程,这篇主要是cglib
疑惑&解答
spring cglib是如何自定义classname的呢?
之前我们在debug的时候发现spring生产的cglib代理的className都有自己独特的标示,比如:class com.iiap.controller.DeviceController$$EnhancerBySpringCGLIB$$6cf59d5d,这个问题就需要去研究cglib的源码了。
123456789101112131415161718192021222324252627282930313233...
写在前面接上一篇,这篇主要是梳理一下自己在查找问题中遇到的疑惑点和解决过程
疑惑&解答
Springboot动态代理全是cglib吗?还是根据是否接口来判断是使用jdk代理还是cglib呢?
跟踪代码和查阅资料发现,springboot默认全部是cglib代理,我们可以从生成代理类的BeanPostProcessor看到,具体如下
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676...
写在前面接上一篇,同样的需求:需要写一个针对controller内参数的数据权限校验组件,所以需要想办法获取都某个对象的某个变量(可能跨层级)的值,所以研究和封装了一套可以使用的工具。这个工具类需要开发时定义好取值的路径,最终决定使用对参数注解,这样就可以针对单独参数的某个值进行权限校验。
开发思路:
1、在controller层的方法的参数上进行注解
2、为了提高拦截时的程序运行效率,项目启动时扫描所有注解的参数的方法放入缓存
3、aop拦截时进行判断是否需要存在于缓存,如有则进行权限校验
问题写完了注解代码,然后决定使用BeanPostProcessor...
写在前面最近需要写一个针对controller内参数的数据权限校验组件,所以需要想办法获取都某个对象的某个变量(可能跨层级)的值,所以研究和封装了一套可以使用的工具类
代码废话不多说,直接上代码,注释也写得比较明白了,就不赘述了
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959...
写在前面最近开始切换到mac上办公,所以记录了一下重要且实用的命令,以便后面再用。
会持续更新
命令
Iterm2
iterm2自动登录远程服务器
设置登录脚本
123cd ~/.sshtouch testvi test
然后复制以下bash,保存退出
1234567891011#!/usr/bin/expect -fset host 10.10.120.312set user rootset password root#set timeout -1spawn ssh $user@$hostexpect "*assword:*"send "$password\r"interacte...
写在前面最近在排查生产问题的时候发现,基于spring-data-es(版本:spring-data-elasticsearch-3.0.8.RELEASE.jar)的ElasticsearchRepository的查询有bug,如下方法:
1234public interface IiapImplTemplateDeviceRepository extends ElasticsearchRepository<IiapTemplateDeviceDoc, String> { List<IiapTemplateDeviceDoc> findByXXI...
写在前面项目中因为涉及到其他系统的数据状态同步,但是部署在不同机房和区域,所以使用了阿里开源的canal进行数据状态的同步
问题分析在维护这个项目的时候发现,系统在测试环境启动canal监听服务后,停止使用stop或kill命令都无法使服务停止,最后只能使用kill -9来强制杀掉进程
排查步骤
排查前是不知道是因为canal无法停止引起的。所以使用如下步骤来排查
1、jps -l确定进程确实一直存在,并获取到进程id
2、使用 jstack 查看当前进程id下有哪些异常的线程
拉到当前进程的线程信息首先看有没有系统内自写的代码所造成的的异常,这种可能性是最大的
结果真的发现有...
问题为新项目写了一个错误码支持国际化的缓存,但是在测试的时候遇到了一个难解的问题,测试环境不管header里传zh还是en都是英文提示,但是在本地调试却都是中文提示
解析先缓存处理的代码
1234567891011121314151617181920212223242526272829303132333435363738394041public class ErrorCodeMessageResource { /** 将国际化信息存放在一个map中 */ private static final Map<String, ResourceBundle> M...
写在前面接上文
分析为了防止出现上文的这种情况,自己抽空写了一个简单的线程池,用来处理这些更新失败的request,因为之前已经在updateRequest内做了自定义的版本控制,所以放弃了es内部的乐观锁的版本控制,
具体实现代码如下,注释已经很清楚了,不在此赘述:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858...
写在前面生产上在高并发使用java的UpdateByQueryRequest对es进行update的时候(与java线程无关,UpdateByQueryRequest内部本身就是异步请求)会出现一个情况:第一次更新成功,后续短时间内的更新条数都是0
分析后来根据查阅资料发现因为如下原因:
es内部为了防止出现并发操作的脏写情况出现,使用了_version的乐观锁控制。
_version元数据 第一次创建一个document的时候,它的_version内部版本号就是1;以后,每次对这个document执行修改或者删除操作,都会对 这个_version版本...