struts2关于A web application created a ThreadLocal with key of type 异常解决办法.

今天开始学习了struts2, 于是下了最新的版本struts2.2.3.1,在使用的过程中总是报错:A web application created a ThreadLocal with key of type , 尽管出现了这个错误,但是并不妨碍程序正常运行, 虽然程序虽然能正常运行,但是看的这个错误很是别扭,所以网上搜了一下看看,也就有了下面这篇文章

struts2关于A web application created a ThreadLocal with key of type 异常解决办法 

 

created a ThreadLocal with key of type [com.opensymphony.xwork2.inject.ContainerImpl$10] (value [com.opensymphony.xwork2.inject.ContainerImpl$10@12c74b9]) and a value of type [java.lang.Object[]] (value [[Ljava.lang.Object;@1a34544]) but failed to remove it。。。。

这类问题的解决办法:

       http://confluence.atlassian.com/pages/viewpage.action?pageId=218275753

看看老外的这篇,好像就是在讲这个问题,原因大概是说tomcat 6.025之后引入了一种内存泄露的检查机制,会把不能垃圾收集的对像做日志。

第一种解决办法:

使用低于6版本的tomcat

第二种解决办法:

在tomcat的server.xml文件(在tomcat的安装路径下的conf文件夹里)中把

<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>

这个监听给关了。

就是用<!--。。。-->把下面三句话括起来就可以啦。

<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
       <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
       <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

 

 以上是转载部分。

我控制台报错如下:

 

严重: A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/webDemo]]
	at java.util.concurrent.FutureTask.report(Unknown Source)
	at java.util.concurrent.FutureTask.get(Unknown Source)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123)
	at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:800)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
	at java.util.concurrent.FutureTask.run(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/webDemo]]
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
	... 6 more
Caused by: java.lang.IllegalArgumentException: Invalid <url-pattern> JavaMail/sendMail in servlet mapping
	at org.apache.catalina.core.StandardContext.addServletMapping(StandardContext.java:3245)
	at org.apache.catalina.core.StandardContext.addServletMapping(StandardContext.java:3220)
	at org.apache.catalina.deploy.WebXml.configureContext(WebXml.java:1367)
	at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1346)
	at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:878)
	at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:376)
	at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
	at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5322)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	... 6 more

十月 11, 2013 10:30:45 上午 org.apache.catalina.core.ContainerBase startInternal
严重: A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]
	at java.util.concurrent.FutureTask.report(Unknown Source)
	at java.util.concurrent.FutureTask.get(Unknown Source)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123)
	at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:302)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:732)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:691)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:456)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
	at java.util.concurrent.FutureTask.run(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: org.apache.catalina.LifecycleException: A child container failed during start
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1131)
	at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:800)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	... 6 more

十月 11, 2013 10:30:45 上午 org.apache.catalina.startup.Catalina start
严重: The required Server component failed to start so Tomcat is unable to start.
org.apache.catalina.LifecycleException: Failed to start component [StandardServer[8005]]
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:691)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:456)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardService[Catalina]]
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
	at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:732)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	... 7 more
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina]]
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
	at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	... 9 more
Caused by: org.apache.catalina.LifecycleException: A child container failed during start
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1131)
	at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:302)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	... 11 more

十月 11, 2013 10:30:45 上午 org.apache.coyote.AbstractProtocol pause
信息: Pausing ProtocolHandler ["http-bio-8888"]
十月 11, 2013 10:30:45 上午 org.apache.coyote.AbstractProtocol pause
信息: Pausing ProtocolHandler ["ajp-bio-8009"]
十月 11, 2013 10:30:45 上午 org.apache.catalina.core.StandardService stopInternal
信息: Stopping service Catalina
十月 11, 2013 10:30:45 上午 org.apache.coyote.AbstractProtocol destroy
信息: Destroying ProtocolHandler ["http-bio-8888"]
十月 11, 2013 10:30:45 上午 org.apache.coyote.AbstractProtocol destroy
信息: Destroying ProtocolHandler ["ajp-bio-8009"]
十月 11, 2013 10:30:45 上午 org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks
严重: The web application [/Convention-book] created a ThreadLocal with key of type [com.opensymphony.xwork2.inject.ContainerImpl$10] (value [com.opensymphony.xwork2.inject.ContainerImpl$10@3e708bac]) and a value of type [java.lang.Object[]] (value [[Ljava.lang.Object;@4ee1e93a]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
十月 11, 2013 10:30:45 上午 org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks
严重: The web application [/struts2Demo] created a ThreadLocal with key of type [com.opensymphony.xwork2.inject.ContainerImpl$10] (value [com.opensymphony.xwork2.inject.ContainerImpl$10@2395330e]) and a value of type [java.lang.Object[]] (value [[Ljava.lang.Object;@184aee62]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
十月 11, 2013 10:30:45 上午 org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks
严重: The web application [/struts2Demo] created a ThreadLocal with key of type [com.opensymphony.xwork2.inject.ContainerImpl$10] (value [com.opensymphony.xwork2.inject.ContainerImpl$10@5f687063]) and a value of type [java.lang.Object[]] (value [[Ljava.lang.Object;@41aaa484]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.


 

我解决的问题不是上面的方法,上面的方法我都试过了,都没有用,后来哪些配置文档也都该过来了。我解决的方法是:在出现问题之前,我再我的eclipse上面写了一个JavaMail发送电子邮件的实例,按照书上面的要求,导入两个包,mail.jar

activation.jar,java文件:

package com.servlet;
import java.io.*;
import java.util.*;

import javax.mail.*;
import javax.mail.internet.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet(name="SendMailServlet",urlPatterns={"JavaMail/sendMail"})
public class SendMailServlet extends HttpServlet{
	public void doPost(HttpServletRequest request,HttpServletResponse response)
	             throws ServletException,IOException{
		request.setCharacterEncoding("GB18030");
		response.setContentType("text/html; charset=GB18030");
		PrintWriter out = response.getWriter();
		String from = request.getParameter("from");
		final String password = request.getParameter("password");
		String smtpServer = request.getParameter("smtp");
		String to = request.getParameter("to");
		String subject = request.getParameter("subject");
		String content = request.getParameter("content");
		
		//用户名就是发件人邮箱从@之前的字符串
		final String username=from.substring(0,from.indexOf("@"));
		Properties props = new Properties();
		props.put("mail.smtp.host", smtpServer);
		props.put("mail.smtp.auth", "true");
		Authenticator authenticator  = new Authenticator(){
			public PasswordAuthentication getPasswordAuthentication(){
				return new PasswordAuthentication(username,password);
			}
		};
		
		//邮件会话
		Session mailSession = Session.getDefaultInstance(props,authenticator);
		mailSession.setDebug(true);
		try{
			//构造MimeMessage
			MimeMessage message = new MimeMessage(mailSession);
			//设置发件人
			message.setFrom(new InternetAddress(from));
			InternetAddress[] addresses = {new InternetAddress(to)};
			//设置收件人
			message.setRecipients(Message.RecipientType.TO, addresses);
			//设置邮件标题
			message.setSubject(subject);
			//构造Multipart
			MimeMultipart mp = new MimeMultipart();
			//构造BodyPart
			MimeBodyPart mbpContent = new MimeBodyPart();
			//设置邮件内容
			mbpContent.setText(content);
			//增加BodyPart
			mp.addBodyPart(mbpContent);
			//向MimeMessage添加正文
			message.setContent(mp);
			//设置发件日期
			message.setSentDate(new Date());
			//发送邮件
			Transport.send(message);
			out.println("邮件发送成功");
			
		}catch(MessagingException e){
			out.println("邮件发送失败");
			e.printStackTrace();
		}
	}

}


发送邮件页面write_email.jsp代码:

<%@ page language="java" contentType="text/html; charset=GBK"
    pageEncoding="GBK"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>写一份电子邮件</title>
</head>
<body>
<form action="sendMail" method="post">
<table border="1px">
  <tr>
     <td>发件人邮箱:</td>
     <td><input type="text" name="from" /></td>
  </tr>
  <tr>
     <td>发件人密码:</td>
     <td><input type="password" name="password" /></td>
  </tr>
  
  <tr>
     <td>SMTP服务器:</td>
     <td><input type="text" name="smtp" /></td>
  </tr>
  
  <tr>
     <td>收件人邮箱:</td>
     <td><input type="text" name="to" /></td>
  </tr>
   <tr>
     <td>邮箱标题:</td>
     <td><input type="text" name="subject" /></td>
  </tr>
   <tr>
     <td>邮箱内容:</td>
     <td><textarea rows="8" cols="40"></textarea></td>
  </tr>
  <tr>
   <td></td>
   <td><input type="submit" value="发送邮件" /></td>
  </tr>

</table>

</form>
</body>
</html>


结果第二天将这个web应用运行在tomcat上面的时候,就报错了,tomcat也启动不了了。

后来我把这个应用删除以及包,结果就恢复正常的,真是奇怪了。

我想了想自己之前修改过的文件,发现我改动了这里

@WebServlet(name="SendMailServlet",urlPatterns={"JavaMail/sendMail"})

JavaMail前面没有加“/”,加了斜杠就没问题了,之前都是只有一层的”/sendMail”,但是我这次把write_eamil.jsp放在了webContent下面的JavaMail下面了,所以我这里就要多一层目录了。

不知道为什么写成这样urlPatterns={"JavaMail/sendMail"})就会报这么“内存泄露的检查机制,会把不能垃圾收集的对像做日志。”的错误。


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值