销毁servlet

更新日期: 2019-04-19阅读: 2.3k标签: 容器

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.fly63.com/article/detial/2976

Web容器_Web服务器及常见的Web容器有哪些?

首先来理解一下简单的一个请求发送到响应的过程。客户端,通常是浏览器或者一些应用发送请求到你的服务器地址,比如访问你的Url或者其他的东西。而我们的服务器通常要分为两个部分,一部分是服务器硬件,有了硬件之后还有有硬件上对应运行的软件。

css实现图片自适应容器的几种方式

css实现图片自适应容器:经常有这样一个场景,需要让图片自适应容器的大小。img标签的方式:我们马上就能想到,把width、height 设置为100%啊。来看一哈效果。

搞懂依赖注入, 用 PHP 手写简易 IOC 容器

好的设计会提高程序的可复用性和可维护性,也间接的提高了开发人员的生产力。今天,我们就来说一下在很多框架中都使用的依赖注入。要搞清楚什么是依赖注入如何依赖注入,首先我们要明确一些概念。

如何优雅监听容器高度变化

不管是对元素的哪种操作,都会造成它的属性、子孙节点、文本节点发生了变化,如果能能监听得到这种变化,这时只需比较容器宽高变化,即可实现对容器宽高的监听,而无需关系它外部行为。DOM3 Events 规范为我们提供了 MutationObserver 接口监视对 DOM 树所做更改的能力

css怎么使容器放不下自动换行?

css可以通过word-break与white-space这两个属性来设置自动换行。word-wrap属性允许长单词或URL地址换行到下一行。white-space属性可以设置文本换行方式。

Node.js/Deno 之父关于JavaScript成为新一代容器的思考

服务端绝大部分程序都是 Linux 程序。这些程序一般由文件系统、一些可执行文件,一些共享的库文件(这些库文件与一些系统库例如 systemd 或者 nsswitch 做交互)。Docker 让使用 Linux 容器变得更容易

CSS容器查询

CSS容器查询终于来了! 它们目前在谷歌浏览器(105)中得到了支持,很快就会在Safari 16中得到支持。这对前端来说容器查询与媒体查询一样重要。在这节课中,我们介绍一下容器查询是如何工作的,如何使用它们

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!