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

来源:互联网 发布:python shell怎么打开 编辑:程序博客网 时间:2024/05/20 15:40

今天开始学习了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 startjava.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 moreCaused by: java.lang.IllegalArgumentException: Invalid <url-pattern> JavaMail/sendMail in servlet mappingat 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 startjava.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 startat 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 moreCaused 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 moreCaused by: org.apache.catalina.LifecycleException: A child container failed during startat 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{//构造MimeMessageMimeMessage message = new MimeMessage(mailSession);//设置发件人message.setFrom(new InternetAddress(from));InternetAddress[] addresses = {new InternetAddress(to)};//设置收件人message.setRecipients(Message.RecipientType.TO, addresses);//设置邮件标题message.setSubject(subject);//构造MultipartMimeMultipart mp = new MimeMultipart();//构造BodyPartMimeBodyPart mbpContent = new MimeBodyPart();//设置邮件内容mbpContent.setText(content);//增加BodyPartmp.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"})就会报这么“内存泄露的检查机制,会把不能垃圾收集的对像做日志。”的错误。


 

原创粉丝点击