开篇,[Spring]我踩的@Async坑

Spring里提供了对大处理的多线程支持。对一个service的方法来说,这个@Async注解就可以简单实现处理的多线程化。(至于excutors的配置和异步支持的开启不再赘述)

说说我踩上的两个坑。

1.有个CSV的上传操作和插入DB操作,数据量比较大,故考虑异步,当然选择最简单的@Async是最理想的。DB操作中有底层包填入登录用户的功能。

而此时bug出现。这个service死活填不进去操作者!底包的问题?service问题?

仔细研究发现:系统的底层包对数据库操作者的自动填入是放在MDC中的,而这个可恶的MDC是基于线程的,用户登录会从Spring的框架中取出来,放入MDC中,退出则删除,而Async是脱离Spring mvc管理的。自然根本没有在DB登录的线程里存储。

解决方案:为了改动量更小,这里打破了一般的流程,不用底包的自动填入,而是前台controller传入登录者参数,手动塞登录者。

2.系统有个操作履历的功能,具体实现也用的异步记录,当时想法是履历成功与失败,快速还是慢速都不影响前台的操作。

此时bug出现。在连接测试中才发现,T﹏T填入的操作者是null?!而且时而出现,时而不出现。

分析:直接调用的Spring的securitycontext,与坑1类似,这时候是在另外的线程,取不到登录者!之所以本地测试没问题,默认Spring是一个线程!见图

具体分析过程画了个草稿图。

图片发自简书App


图片发自简书App


心得:必须要再深入了解下Spring的原理。不然还有坑。只是Google是会踩很多坑的,很多时候效率也不一定是最高的。这时候想问题做事多一些焦虑是好事,而用的时候多想想具体场景会不会有这样那样的问题。把时间多花在这些地方!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,706评论 19 139
  • 在我搭建基于Spring Cloud的微服务体系应用的时候所需要或者是常用的属性配置文件,还有这些属性的用途,此配...
    StrongManAlone阅读 9,608评论 0 18
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,776评论 25 709
  • 体测结束了,跑到最后的时候就想掉眼泪,跑完了坐在那儿眼眶红红的突然就很想哭,不知道是被自己感动了还是终于走到这里感...
    糖豆乐豆阅读 3,169评论 0 0
  • 一大早就迎来震耳欲聋的口号声 我只听见好多路人要求参与☞ 金丰店 刘树芳 ...
    Promiscuou阅读 2,047评论 0 1