使用tomcat作为web应用容器时,启用新线程找不到Session的问题

  今天做一个功能,为了快速响应前端,业务完成后,另起了一个线程做一些不影响业务的统计工作,然后立即将业务操作结果返回给前台。

结果在新线程里报空指针找不到request对象。检查了下,我们用的是struts2的框架,在struts2里会把request绑定在线程局部变量里。通过上下文的ServeltActionContext就能取了。那我就手动在新线程里把request设置到struts2的上下文里吧。

request找得到了,但request.getSession()是空的。很奇怪,这么短的时间不可能session超时销毁啊。发现如果原来那个主线sleep一下,不那么急着返回前端,就不会有这个错。推测是容器在完成响应会做了什么操作,导致request找不到关联的session了。

查看tomcat的源代码,发现他的httpResquest接口实现类 org.apache.catalina.connector.Request有一个recycle方法。顾名思义回收,把这个Request的上下文给清掉了,当然session也没有了。这样新的请求来的时候,就不用创建了,直接把这个没有状态的对象绑定上新的上下文就能用了,相当于一个对象池的作用。

所以原因就是,主线程执行得很快,完成的时候主线程绑定的request被清理了,不再与session关联了。而我们新创建的线程绑定了那个request对象,在主线程完成后就找不到session了。解决方法很简单,把session也用线程局部变量绑定到新线程就行了。

时间: 2024-12-28 12:59:22

使用tomcat作为web应用容器时,启用新线程找不到Session的问题的相关文章

通过ajax访问Tomcat服务器web service接口时出现No 'Access-Control-Allow-Origin' header问题的解决办法

问题描述 通过ajax访问Web服务器(Tomcat7.0.42)中的json web service接口的时候,报以下跨域问题: XMLHttpRequest cannot load http://localhost:8080/get-employees-by-name/name/admin. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhos

java 启用新线程异步调用

2秒后执行 某段代码: demo如下: System.out.println("正常执行...111"); Thread t = new Thread(){ public void run(){ try { sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } //2秒执行 System.out.println("2秒后 执行"); } }; t.start(); System.

Spring整合quartz关闭,关闭Tomcat Servlet容器时内存泄漏

出错信息 22-Sep-2017 06:19:51.064 WARNING [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [license] appears to have started a thread named [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Wo

Session or Cookie?是否需要用Tomcat等Web容器的Session

Cookie是HTTP协议标准下的存储用户信息的工具,浏览器把用户信息存放到本地的文本文件中. Session是基于Cookie实现的. 2011年4月,武汉群硕面试的时候(实习生),面试官也问过这个问题. 当时只知道Session是基于Cookie的,但是没有想到"不使用Tomcat等Web容器的Session,只使用Cookie也可以实现自己的Session,完成会话管理,而且据说性能更好." 以前的做法: 使用HttpRequestSession保存用户信息,非常方便. 配置一个

eclipse集成tomcat运行web时提示引入jar包的类找不到的解决办法

参考:http://blog.csdn.net/fjssharpsword/article/details/50635049 在eclipse集成tomcat开发web时,java类引入的jar包,编译通过,但启动tomcat运行web时提示找不到jar包内的类,需要作如下配置,将jar包在部署到集成的tomcat环境中. 问题:在 web应用 右键->Run as -> Run on Server情况下,会找不到Java Resources下Libraries的jar,应该是eclipse工

Servlet容器Tomcat中web.xml中url-pattern的配置详解[附带源码分析]

前言 今天研究了一下tomcat上web.xml配置文件中url-pattern的问题. 这个问题其实毕业前就困扰着我,当时忙于找工作. 找到工作之后一直忙,也就没时间顾虑这个问题了. 说到底还是自己懒了,没花时间来研究. 今天看了tomcat的部分源码 了解了这个url-pattern的机制.  下面让我一一道来. tomcat的大致结构就不说了, 毕竟自己也不是特别熟悉. 有兴趣的同学请自行查看相关资料. 等有时间了我会来补充这部分的知识的. 想要了解url-pattern的大致配置必须了解

JavaWeb-06(Dom4j技术及Schema 约束、Tomcat与Web程序结构)

JavaWeb-06 JavaWeb-Dom4j技术及Schema 约束.Tomcat与Web程序结构 DOM4J及Schema 一.Dom4j解析(掌握) DOM4J解析XML文档 a. Dom4j是一个简单.灵活的开放源代码的库.Dom4j是由早期开发JDOM的人分离出来而后独立开发的.与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性. b. Dom4j是一个非常优秀的Java XML API,具有性能优异.功能强大和极

Tomcat是什么:Tomcat与Java技、Tomcat与Web应用以及Tomcat基本框架及相关配置

1.Tomcat是什么       Apache Tomcat是由Apache Software Foundation(ASF)开发的一个开源Java WEB应用服务器. 类似功能的还有:Jetty.Resin.Websphere.weblogic.JBoss.Glassfish.GonAS等,它们的市场占有率如下,可以看到Tomcat是最受欢迎的Java WEB应用服务器. Tomcat在技术实现上所处的位置如下: 下面我们来了解下Tomcat与这些技术之间的关系. 1-1.Tomcat与Ja

JavaWeb-07(tomcat与web程序结构与Http协议与Servlet基础)

JavaWeb-07 JavaWeb-tomcat与web程序结构与Http协议与Servlet基础 HTTP协议(记住) 1.http协议:规定了客户端和服务端交流时的数据格式 a. WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议. b. HTTP是HyperText Transfer Protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程及数据本身的格式. c. HT