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

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

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

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

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

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

  • 相关阅读:
    210111做个期望值低的人
    error_1 springboot `com.mysql.jdbc.Driver'问题
    error_2 springboot mysql时区设置
    17_springboot Restful风格
    15_JSON springboot
    13_springboot文件上传
    12_springboot myBatis crud
    11_springboot JPA crud
    Swagger导出MarkDown
    Docker 使用中的一些问题
  • 原文地址:https://www.cnblogs.com/liuqingsha3/p/9144122.html
Copyright © 2011-2022 走看看