要求如下:
在一個web Service項目中,使用servlet程式設計,如何防止Tomcat被非正常關閉而導緻伺服器端的servletContext資料丢失?
本人思路如下:
在該項目初始化時,啟動一個線程,每隔一個小時就将servletContext的值存儲到一個txt檔案中核心代碼如下:
public class ServletContextThread extends HttpServlet implements Runnable{
//servletContext的值已先在該工程的其他處設定好了,結構為(name:---:nums,value:---:0),該線程已在初始化時就啟動了
public void run() {
}
public void init() throws ServletException {
FileWriter fw = null;
BufferedWriter bw = null;
String path = this.getServletContext().getRealPath("recorder.txt");
try {
while(true){
Thread.sleep(60*1000);
String nums = this.getServletContext().getAttribute("nums").toString();
fw = new FileWriter(path);
bw = new BufferedWriter(fw);
bw.write(nums);
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
bw.close();
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
一直說}
但是它總是說 bw.close();處空指針異常,求解????????????????
2013-9-11 16:51:35 org.apache.catalina.core.ApplicationContext log
嚴重: Servlet servletContextBiz threw unload() exception
javax.servlet.ServletException: Servlet.destroy() for servlet servletContextBiz threw exception
at org.apache.catalina.core.StandardWrapper.unload(StandardWrapper.java:1401)
at org.apache.catalina.core.StandardWrapper.stop(StandardWrapper.java:1727)
at org.apache.catalina.core.StandardContext.stop(StandardContext.java:4488)
at org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:1097)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1203)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:293)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1307)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1571)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1580)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1560)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at com.lx.biz.servletContextBiz.destroy(servletContextBiz.java:35)
at org.apache.catalina.core.StandardWrapper.unload(StandardWrapper.java:1382)
... 11 more
2013-9-11 16:51:36 org.apache.catalina.core.ApplicationContext log
嚴重: StandardWrapper.Throwable
java.lang.NullPointerException
at com.lx.biz.ServletContextThread.init(ServletContextThread.java:45)
at javax.servlet.GenericServlet.init(GenericServlet.java:212)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1161)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:981)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4044)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4350)
at org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:1105)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1203)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:293)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1307)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1571)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1580)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1560)
at java.lang.Thread.run(Unknown Source)
2013-9-11 16:51:36 org.apache.catalina.core.StandardContext loadOnStartup
嚴重: Servlet /counter threw load() exception
java.lang.NullPointerException
at com.lx.biz.ServletContextThread.init(ServletContextThread.java:45)
at javax.servlet.GenericServlet.init(GenericServlet.java:212)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1161)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:981)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4044)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4350)
at org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:1105)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1203)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:293)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1307)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1571)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1580)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1560)
at java.lang.Thread.run(Unknown Source)