web容器可能决定一个Servlet是否从servic中移除(例如,当一个容器想要回收内存资源时或者被关闭时)。在上面的场景中,容器会调用Servlet接口的destroy方法。在方法中,可以释放servlet使用的任何资源,保存持久化状态。destroy方法关闭在init方法中创建的数据库对象。

当servlet被移除时,它的service方法必须全部执行完成。服务器在所有请求被响应或者在一个特定时间后,通过调用destroy方法确保这一点的实现。当你的servlet正在执行超过服务器超时时间的长任务时,这些操作直到destroy方法被调用前都在执行。你必须确保任何持有客户端请求的线程完成。

本节的其余部分将介绍如何执行以下操作:

保持跟踪当前有多少线程在运行service方法

通过destroy方法通知长时间运行的线程关闭并等待完成来提供一个干净的关闭方法

让长时间运行的方法定期轮询以检查关闭,并在必要时停止工作,清理和返回

跟踪服务请求

要跟踪服务请求,需要在servlet类中包含一个变量,这个变量用来统计运行的service方法数量。这个变量需要使用同步方法增量、减量和返回变量值。

public class ShutdownExample extends HttpServlet {

private int serviceCounter = 0;

...

// Access methods for serviceCounter

protected synchronized void enteringServiceMethod() {

serviceCounter++;

}

protected synchronized void leavingServiceMethod() {

serviceCounter--;

}

protected synchronized int numServices() {

return serviceCounter;

}

}

当每次进入service方法时都需要增长变量值,每次离开service方法时都需要减小变量值。这是你要在HttpServlet子类覆写父类service方法的原因之一。新方法需要调用super.service()保留原始的service方法的内容。

protected void service(HttpServletRequest req,

HttpServletResponse resp)

throws ServletException,IOException {

enteringServiceMethod();

try {

super.service(req, resp);

} finally {

leavingServiceMethod();

}

}

通知方法关闭

为了确保一个干净的关闭,在所有请求完成前你的service方法不能释放任何共享资源。做到这一点的一部分是检查service的数量。另外一部分是通知长时间运行的任务是时候关闭了。为了能通知到位,需要另一个变量。这个变量需要有通常的访问方法。

public class ShutdownExample extends HttpServlet {

private boolean shuttingDown;

...

//Access methods for shuttingDown

protected synchronized void setShuttingDown(boolean flag) {

shuttingDown = flag;

}

protected synchronized boolean isShuttingDown() {

return shuttingDown;

}

}

下面是一个使用这些变量提供干净的关闭方法的示例:

public void destroy() {

/* Check to see whether there are still service methods /*

/* running, and if there are, tell them to stop. */

if (numServices()> 0) {

setShuttingDown(true);

}

/* Wait for the service methods to stop. */

while (numServices()> 0) {

try {

Thread.sleep(interval);

} catch (InterruptedException e) {

}

}

}

创建规范的长期运行方法

提供干净关闭的最后一步是使任何长时间运行的方法都比较规范。可能需要长期运行的方法需要检查通知他们关闭的变量并在需要时强制打断正在执行的工作。

public void doPost(...) {

...

for(i = 0; ((i < lotsOfStuffToDo) &&

!isShuttingDown()); i++) {

try {

partOfLongRunningOperation(i);

} catch (InterruptedException e) {

...

}

}

}

java销毁servlet_销毁servlet相关推荐

  1. java创建和销毁一个对象_有效的Java –创建和销毁对象

    java创建和销毁一个对象 创建和销毁对象(第2章) 这是Joshua Blochs的< 有效的Java>第2章的简短摘要.我仅包括与自己相关的项目. 静态工厂(项目1) 静态工厂与构造函 ...

  2. Java中Filter、Servlet、Listener的学习

    1.Filter的功能filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个reques ...

  3. Java web后端2 Servlet Maven HttpServlet ServletConfig ServletContext HTTP协议

    创建项目 新建项目 Java Enterprise JDK1.8 Web Application Tomcat JAVA 默认 过程需要联网 Maven的配置 IDEA内置Maven 修改本地仓库位置 ...

  4. JAVA WEB篇2——Servlet

    JAVA WEB篇2--Servlet Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,是Java语言编写 的服务器端程序,换句话说,Serv ...

  5. JAVA Web学习篇--Servlet

    Servlet由来 做过BS项目的人都知道,浏览器可以依据HTML静态标记语言来显示各式各样的网页.可是假设我们须要在网页上完毕一些业务逻辑:比方登陆验证.或者说网页显示的内容在server的数据库中 ...

  6. 基于javaweb的智能小区物业管理系统(java+jsp+bootstrap+javascript+servlet+mysql)

    基于javaweb的智能小区物业管理系统(java+jsp+bootstrap+javascript+servlet+mysql) 运行环境 Java≥8.MySQL≥5.7.Tomcat≥8 开发工 ...

  7. Java进阶-tomcat+Maven+Servlet+HTTP协议+xml(十)

    文章目录 一.WEB开发概述 1.1.WEB资源介绍 1.2.软件架构 1.3.WEB通信模式 (B/S) 1.4.URL请求路径 1.5.WEB服务器软件 二.TOMCAT 2.1.概述 2.2.T ...

  8. JAVA Web学习之servlet开发

    01.servlet开发入门 动态web资源开发有两种技术:Servlet和JSP,只有把Servlet学明白了才能学JSP. Sun公司在其API中提供了一个Servlet接口,用户若想用一个动态w ...

  9. java.lang.AbstractMethodError: javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/

    今天启动tomcat的时候出现了这样的错误 java.lang.AbstractMethodError: javax.servlet.jsp.JspFactory.getJspApplicationC ...

  10. java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.LoopTag 错误

    java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.LoopTag 电脑重置后,写一个springmvc的作业的时候,使用tom ...

最新文章

  1. 人工智能不是单纯的经验和总结
  2. eclipse egit(分支管理 上)
  3. MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)
  4. STM32F103使用DAC功能输出正弦波
  5. 尝试从远程计算机访问Web服务不显示调用按钮
  6. WSDM2021 | 多交互注意力网络用于CTR预估中细粒度特征学习
  7. nodejs学习笔记(3)
  8. [转]word 转换成pdf
  9. MySQL-快速入门(11)用户管理
  10. ctypes 传递opencv二值化图像给C++函数
  11. 谈谈RJ45线序的打法及口诀
  12. 如何申请免费163邮箱?如何申请163邮箱账号?
  13. 各种网页播放面板代码,MediaPlayer Replayer等
  14. Flutter 实现风车加载动画组件
  15. Android开发、adb、monkey测试
  16. 智能算法系列之粒子群优化算法
  17. Nodejs和ajax不同,Nodejs和AJAX的区别是什么?
  18. 关于自制CMSIS_DAP离线下载器下载算法的代码说明:“0xE00ABE00, 0x062D780D, 0x24084068, 0xD3000040, 0x1E644058, 0x1C49D1FA“
  19. 衢州计算机考试在哪里考,第一个省考考点出了!衢州14个考点及地址公布!
  20. 解决 mapping values are not allowed here

热门文章

  1. java微信支付超时_Java语言:微信支付之关闭订单
  2. 数据结构——绪论、时间复杂度
  3. 类对象初始化和Initializer_list的
  4. 【css】svg修改图标颜色
  5. STM32 SHT10温湿度传感器的信号采集
  6. Linux Canbus调试笔记
  7. 了解 Qt 绘图设备QPixmap、QBitmap、QImage和 QPicture
  8. K-Means聚类算法原理及实现
  9. Tomcat虚拟主机配置示例
  10. 1867最短路径问题(SPFA)