多线程,共享HttpServeltRequest对象时候,对象丢失现象
Posted liuzhaoqing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程,共享HttpServeltRequest对象时候,对象丢失现象相关的知识,希望对你有一定的参考价值。
问题背景: web项目中一个比较复杂的查询功能,需要调用很多的底层接口,占用时间会比较多,如果用正常的用户线程,就是一个接口一个接口的调用,整的的时间会很多,因此使用多线程查询。对于每个底层都是一个一个线程查询,查询完成后,再汇总结果返回。
问题描述: 程序启动的查询接口的线程(下面成为子线程)在调用共享对象HttpServletRequest时候,有时候会报错找不到属性。有时候正常不报错。这个很奇怪,因为HttpServletRequest是在用户线程进来的时候,servlet容器自动初始化好了的,各个属性都是准备好的,也没有对外提供删除属性的方法。
问题猜想:子线程调用的时候HttpServletRequest属性丢失,肯定是哪里给删掉了,用户程序里面没有调用,那就是servlet容器给删掉了。。所以可能是用户线程已经执行完了返回给前端了,sevlet认为这个线程使用的servlet相关数据都已经无用了,所以自动对servlet对象做了销毁处理。 那子线程还没有走完,还在使用servLET,也说明子线程执行超时未完成,主线程不再等待了。。
检查猜想:将子线程执行时间设置很长,以保证子线程中的后续任务有足够时间执行。经过反复测试,没有再出现servletRequest对象丢失的问题了,猜想正确。
程序修正:不再使用HttpServeltRequest作为共享对象在各个线程之前。自定义一个线程安全的公用对象,将类似客户端相关的数据封装到该对象中,然后用于各个方法线程之间数据传递。
以上是关于多线程,共享HttpServeltRequest对象时候,对象丢失现象的主要内容,如果未能解决你的问题,请参考以下文章