Closed joker00425 closed 5 months ago
如果不是太在意性能,可以直接用AdviceListener 常规的做法是用一个ThreadLocal把BeforeEvent中的入参信息拿到并存起来,在ReturnEvent的时候从ThreadLocal中拿出来使用,记得在ReturnEvent和ThrowsEvent的时候清理ThreadLocal哈
如果不是太在意性能,可以直接用AdviceListener 常规的做法是用一个ThreadLocal把BeforeEvent中的入参信息拿到并存起来,在ReturnEvent的时候从ThreadLocal中拿出来使用,记得在ReturnEvent和ThrowsEvent的时候清理ThreadLocal哈
感谢大佬提醒,我们是采集比较底层的调用,对性能有一定要求的,应该要切换到EventListener 顺便再问一下,EventListener相比AdviceListener性能上的提升在于哪里呢
EventListener的优势是内存亲和。所有的Event是在线程中单例持有,整个事件处理过程中不会新分配任何的JVM对象。
AdviceListener将大部分场景都需要的处理集成到了Advice对象中,在事件处理过程中创建了Advice对象用于关联Before、Return/Throws,同时还采用了反射拿到了Class和Method。这些累积起来对性能敏感的场景是一个损耗。
项目中原先使用的AdviceListener,在com.alibaba.jvm.sandbox.api.listener.ext.AdviceListener#afterReturning中可以获取到参数,后面使用了EventListener发现无法从ReturnEvent事件中获取参数,请问大佬们有何解法