多线程,共享HttpServeltRequest对象时候,对象丢失现象

问题背景: web项目中一个比较复杂的查询功能,需要调用很多的底层接口,占用时间会比较多,如果用正常的用户线程,就是一个接口一个接口的调用,整的的时间会很多,因此使用多线程查询。对于每个底层都是一个一个线程查询,查询完成后,再汇总结果返回。

问题描述: 程序启动的查询接口的线程(下面成为子线程)在调用共享对象HttpServletRequest时候,有时候会报错找不到属性。有时候正常不报错。这个很奇怪,因为HttpServletRequest是在用户线程进来的时候,servlet容器自动初始化好了的,各个属性都是准备好的,也没有对外提供删除属性的方法。

问题猜想:子线程调用的时候HttpServletRequest属性丢失,肯定是哪里给删掉了,用户程序里面没有调用,那就是servlet容器给删掉了。。所以可能是用户线程已经执行完了返回给前端了,sevlet认为这个线程使用的servlet相关数据都已经无用了,所以自动对servlet对象做了销毁处理。 那子线程还没有走完,还在使用servLET,也说明子线程执行超时未完成,主线程不再等待了。。

检查猜想:将子线程执行时间设置很长,以保证子线程中的后续任务有足够时间执行。经过反复测试,没有再出现servletRequest对象丢失的问题了,猜想正确。

程序修正:不再使用HttpServeltRequest作为共享对象在各个线程之前。自定义一个线程安全的公用对象,将类似客户端相关的数据封装到该对象中,然后用于各个方法线程之间数据传递。

转载于:https://www.cnblogs.com/liuqingsha3/p/9144122.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值