我平是的工作主要是写一些功能模块和接口,以及bug的定位和修复,罗列一些工作中遇到的小问题,算是个整理
1 一次开发dubbo接口时,在dubbo调用的接口里又调用了第三方接口,于是我本地同时启动两个springboot项目,但是一直报错,后来才突然意识到,是dubbo的默认20880TCP端口和tomcat的8080端口冲突了,且注意,dubbo的请求与响应实体类要实现序列化接口,另外,dubbo的测试可以直接使用命令行,telnet IP port,调用方法用invoke,不要再去安装jemeter插件啦
2 将Arrays.asList()转为set时,有一次的场景是去掉set中的"",我直接调用了remove()方法,但是debug发现无法删除,查阅资料发现是与hashCode算法有关,解决方案是,将得到的set集合作为入参新建一个set即可
3 @Slf4j注解使用的log日志,打印时常常使用log.info("{} get***failed!","service")的占位符打印,但是在error级别的日志就不在支持占位符,你这么写它能通过编译,日志不会打印
4 在idea代码编辑界面的行号位置,鼠标右键点击第一个annotate可以看到这行代码的git提交者信息
5 必要的操作,如必须写入DB的日志,流的关闭等,最好放到finally代码块处理
6 set集合和list集合的retainAll() removeAll()这些方法可以帮你很好的提高效率
7 ES的deleteByQuery请求可能导致数据删除不干净,最好是把要删除的数据统一放到某个索引中然后再删除索引
8 Bigdecimal构造方法参数不要传dubble类型,会有精度问题,尽量使用String入参
9 如果一个模块中调用了多个接口,接口无顺序要求,且整体新能较差,可以考虑启用多线程异步化接口调用
10 反射很好用,尤其是当你需要做新旧数据对比,同时记录对象中那些字段值变更的时候,利用反射可以快速获取字段名称和值,且在java中,反射获取的字段顺序和类中的定义顺序是一致的
11 对于第三方接口的调用,可以设定一个日志记录表,每次调用接口时,记录请求的时间,请求体,接口响应以及调用成功/失败的结果记录,写入日志表的操作放在finally模块中,这样排查起问题来很方便
12 开发中时常用到各种常量,通常会建立一个常量类,最好可以将这个类直接声明成接口,将常量声明为public static final
13 如果你的系统中需要处理多个不同版本之间的ES问题,构建请求的时候建议直接手写json请求体而不是使用restHighClient去代码构建,因为不同版本对代码构建的兼容可能有问题
14 oracle在插入数据时候,超过4000字节的字符串会被oracle自动转为long,插入时会报类型错误,先将字段类型改为long,再改为clob可以解决这个问题
15 尽量使用批量处理的SQL而不是循环写DB,频繁的IO磁盘会导致性能降低
16 在处理字符串的时候,习惯使用equals和spring的StringUtils,尽量避免==和!=判断,同时注意indexOf方法,有时这个下标方法会很坑爹
17 无论你多自信,写完的代码先debug是个好习惯,我就出现过把三个本该不同的变量粘贴成同一个
18 保护好自己的头发,不要得罪产品经理