使用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也用线程局部变量绑定到新线程就行了。
使用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:// ...
- java 启用新线程异步调用
2秒后执行 某段代码: demo如下: System.out.println("正常执行...111"); Thread t = new Thread(){ public void ...
- Spring整合quartz关闭,关闭Tomcat Servlet容器时内存泄漏
出错信息 22-Sep-2017 06:19:51.064 WARNING [main] org.apache.catalina.loader.WebappClassLoaderBase.clearR ...
- idea maven web工程明明添加了maven lib的依赖,但启动web容器时始终报No Class Found?
idea maven web工程明明添加了maven lib的依赖,但启动web容器时始终报No Class Found? 很久没用idea搭新工程,最近自己想做个东西,冲心搭个web工程,jar包都 ...
- MyEclipse+Tomcat开发Web项目时修改内容不能及时显示问题解决方法
问题描述:MyEclipse+Tomcat开发Web项目时,修改的内容不能从浏览器即时显示 原因:缓存问题 解决方法:开启Tomcat的Debug模式 点击如下图红色标记中的图标(Restart th ...
- Session or Cookie?是否需要用Tomcat等Web容器的Session
Cookie是HTTP协议标准下的存储用户信息的工具,浏览器把用户信息存放到本地的文本文件中. Session是基于Cookie实现的. 2011年4月,武汉群硕面试的时候(实习生),面试官也问过这个 ...
- Servlet容器Tomcat中web.xml中url-pattern的配置详解[附带源码分析]
目录 前言 现象 源码分析 实战例子 总结 参考资料 前言 今天研究了一下tomcat上web.xml配置文件中url-pattern的问题. 这个问题其实毕业前就困扰着我,当时忙于找工作. 找到工作 ...
- Tomcat是什么:Tomcat与Java技、Tomcat与Web应用以及Tomcat基本框架及相关配置
1.Tomcat是什么 Apache Tomcat是由Apache Software Foundation(ASF)开发的一个开源Java WEB应用服务器. 类似功能的还有:Jetty. ...
- 如何优雅的关闭基于Spring Boot 内嵌 Tomcat 的 Web 应用
背景 最近在搞云化项目的启动脚本,觉得以往kill方式关闭服务项目太粗暴了,这种kill关闭应用的方式会让当前应用将所有处理中的请求丢弃,响应失败.这种形式的响应失败在处理重要业务逻辑中是要极力避免的 ...
随机推荐
- XML入门级的简单学习
xml案例<?xml version="1.0" encoding="ISO-8859-1"?> <note> <to>Ge ...
- Python之线程池
版本一: #!/usr/bin/env python # -*- coding:utf-8 -*- import Queue import threading class ThreadPool(obj ...
- HTML常用命名和CSS reset代码【收集总结】
CSS命名规则 头:header 内容:content/containe 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制整体布局宽度:wrapper 左右中:l ...
- 移动平台自动化测试从零开始-MonkeyRunner工具使用 (第二节)
选自:http://yuedu.baidu.com/search?word=%D3%DA%D3%BF&pbook=0 第2节 MonkeyRunner 安装部署 如果您已经正确的安装部署了A ...
- LPC18xx LPC43xx LPC4370 Bootrom USB DFU FPB - Flash Patch and Breakpoint Unit
What is the difference between a Bootrom vs bootloader on ARM systems Bootrom Bootrom (or Boot ROM) ...
- Python:常用函数封装
def is_chinese(uchar): """判断一个unicode是否是汉字""" if uchar >= u'\u4e00' ...
- iOS crash 异常捕获
// // UncaughtExceptionHandler.m // UncaughtExceptions // // Created by Matt Gallagher on 2010/05 ...
- 安装配置NFS服务
超级好的配置centos下服务的链接 http://www.server-world.info/en/note?os=CentOS_6&p=nfs http://linux.vbird.org ...
- JAVA自动化测试数据设计
数据管理是很重要的,数据管理与方法一样,依然是有层次的,我们在测试的过程中,可能会有多个环境,每个环境的URL啊,登录名啊,数据库连接地址啊等等不一样,我们可以把这些环境每个都配置一个数据文件,里面写 ...
- 【LeetCode】338. Counting Bits (2 solutions)
Counting Bits Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num ...