记一次需求
好久没写日志了,不是没活,是没时间写,需求都很赶,且都有后续优化,但日志也很有必要写,经验是宝贵但,记忆是不可靠的。必须要把经验记录下来。
需求大概是 需要在执行“某些”操作(这些操作有个特点就是执行后会造成更改数据库的结果)之后记录下来,需要记录更改了什么。然后把这些记录生产成消息发给mq去消费。
对于这次需求的实现,我是这样思考的。
1.需要记录这个操作更改了什么,那一定是有执行前和执行后的比较对象的。那如何优雅的比较同一个类的两个不同实例呢?
首先,那肯定是比较属性,但不能人工代码一个个手打比较属性。
所以我选择使用反射获取到对象所属类的所有属性。
那改了什么,这个返回值怎么设计。
为了明确改了什么,需要三个东西,1.具体属性字段,2.改之前,3.改之后
用什么数据结构?
用map,因为被修改的字段,和修改字段的具体两个内容(改之前和改之后)之间需要有映射。
map的key是String类型,是我们通过反射取到的字段名。
map的value是list类型,list(0)是改之前,list(1)是改之后。
如下可参考:
Map> map = new HashMap >();
很好,这是第一个需要思考的点,已解决。
2.第二个事情
逻辑上,这个东西只是最近这一段时间采用的,那需要连类似zookeeper的东西配置一下开关,这样我们通过线上网站就可以决定是否执行的代码。
就这样子,一般公司都有,结合需求考虑,这个东西该有。
if(zk上的某一个节点值 ) {
//do something
}
Ok,这个问题解决。
3,第三个问题 同步还是异步
业务上个人理解,既然这个只是用来记录某些业务操作的,那它就不该,影响到原来接口执行。所以不应该是同步的,一方面有时间的考虑,另一方面,原来的业务不应该等待被记录的业务才有返回。
所以这里,我用了spring的监听事件机制,但是光有监听事件,监听到之后的逻辑默认不配置线程池也是同步的,不过这个好搞,springboot的话直接给监听方法加一个 “异步”的注解就完事了。这么配,默认走的spring默认的线程池。
可是公司规范推荐让用公司的线程池。所以,pass。
也可以自己声明一个异步配置类,还是加上注解,之后异步的操作需要用线程,就直接从这里的线程池取了。
但我没用这种,因为这个项目很多人用,不仅是自己组的,不太确定有没有人已经做过这种配置了,或者我做完这种配置会不会影响其他人的一些异步义务。
所以,虽然监听事件已经写好,但我也不打算用注解的方式去搞异步扔进线程池里了。
我直接把该执行记录的逻辑,在触发的时候,扔线程池里就可以。
问:那你最开始为啥想用spring监听事件和spring的异步线程池?
答:大概是因为如果采用这种方式,不用写线程池和任务逻辑了。
上面这几个点,我会依次在下篇或者下下篇讲清楚。


![[大厂实习记录3]如何优雅的实现需求-->“记录某些更改操作的具体更改信息发给mq“ [大厂实习记录3]如何优雅的实现需求-->“记录某些更改操作的具体更改信息发给mq“](http://www.mshxw.com/aiimages/31/324803.png)
