摘要:当被移除时,它的方法必须全部执行完成。服务器在所有请求被响应或者在一个特定时间后,通过调用方法确保这一点的实现。做到这一点的一部分是检查的数量。可能需要长期运行的方法需要检查通知他们关闭的变量并在需要时强制打断正在执行的工作。
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) { ... } } }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/74233.html
摘要:实际开发中最常见的和方法配置文件配置文件如下引用百度定义 Servlet全解析笔记 Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容,Servlet的常见类型有,继承自Httpservlet的普通Servlet类、Se...
摘要:协议版本请求头客户端向服务器端表示,我能支持什么类型的数据。在地址栏上输入项目名称向报告,我这个应用里面有这个,名字叫做具体的路径是注册的映射。的配置,通过这个对象,可以获取在配置的时候一些信息先说,在写怎么用,最后说有什么用。 1.Http协议 什么是协议 双方在交互、通讯的时候, 遵守的一种规范、规则。 http协议 针对网络上的客户端 与 服务器端在执行http请求的时候...
摘要:中的异步处理指的是什么中的异步处理指的是什么答在中引入了一项新的技术可以让异步处理请求。开启异步处理代码开启异步支持启动异步处理的上下文在此处添加异步处理的代码如果文章有错的地方欢迎指正,大家互相交流。 以下我是归纳的过滤器监听器知识点图: showImg(https://segmentfault.com/img/remote/1460000013263166?w=3974&h=187...
摘要:系列文章请查看超详细的面试题总结一之基础知识篇超详细的面试题总结二之基础知识篇超详细的面试题总结三之集合篇常见问题下面的都是自己之前在学习的时候总结的,对于巩固的基础知识应该有很大帮助。注意多线程的并发的读写类属性会导致数据不同步。 系列文章请查看: 超详细的Java面试题总结(一)之Java基础知识篇 超详细的Java面试题总结(二)之Java基础知识篇 超详细的Java面试题总结(...
摘要:个人的学习笔记是的简称,是运行在服务器或应用服务器上的程序,它是作为来自浏览器或其他客户端的请求和服务器上的数据库或应用程序之间的中间层,就是一个类,运行在服务器上。处理数据并生成结果。所有的文件都必须遵守这个标准。 个人的学习笔记 Servlet(Server Applet)是Java Servlet的简称,是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器...
阅读 3169·2021-11-23 10:02
阅读 3136·2021-11-16 11:53
阅读 3112·2021-09-23 11:21
阅读 3387·2019-08-30 13:02
阅读 1645·2019-08-29 16:18
阅读 1579·2019-08-29 12:55
阅读 1472·2019-08-26 12:24
阅读 2102·2019-08-26 10:36