zoukankan      html  css  js  c++  java
  • 多线程,共享HttpServeltRequest对象时候,对象丢失现象

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

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

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

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

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

  • 相关阅读:
    C语言:链表实现的一个实例
    第二次作业——C++学习
    第二次作业———“A+B Format”思路与总结
    hdu 2962 Trucking (二分+最短路Spfa)
    hdu 2680 Choose the best route (dijkstra算法 最短路问题)
    hdu 1233 还是畅通工程 (最小生成树)
    poj 2253 Frogger (dijkstra最短路)
    poj 1062 昂贵的聘礼 (dijkstra最短路)
    hdu 2066 一个人的旅行
    poj 2387 Til the Cows Come Home(dijkstra算法)
  • 原文地址:https://www.cnblogs.com/liuqingsha3/p/9144122.html
Copyright © 2011-2022 走看看