我在Servlet的init()方法中启动了定时器Timer,定时执行任务。
在web.xml中通过load-on-startup让servlet能够自动初始化实例,
并且在该Servlet中重写destory()方法,代码内容是销毁servlet时cancel掉定时器。但是不太清楚这个Servlet实例什么时候被销毁,我的定时器可能需要长时间来运行(间隔以天为单位),我怕因为servlet实例不活动,Servlet容器自动把它销毁而导致定时器被无端关闭,有没有这种隐患呢?

解决方案 »

  1.   

    当你的servlet容器关闭的时候销毁,因此完全不用担心
      

  2.   

    这个只有天知道它什么时候会被容器销毁,也许web.xml会有设置吧。如果实在不行就用引用来指向它。一般有引用指向一个实例它应该就不会被销毁了。
      

  3.   

     回复人:spiniper() ( 一级(初级)) 信誉:100  2007-08-03 11:29:54  得分:0-------------------------
    请你复习下servlet的生命周期
      

  4.   

    不过定时机制,其实最好还是放在ContextListener,除非你用的servlet容器版本实在很低
      

  5.   

    sorry,完整的应该叫ServletContextListener
      

  6.   

    我看Servlet的destroy方法的说明文档,他的调用时机有可能是超时或是Servlet容器关闭。这个servlet我没有去重写service方法,也就是没有人去让他“运动”,一直在内存里呆着啊。肯定有更好的定时器启动方案,但是如果已经确定用上面的方式,那么有哪些方法让它工作的更“保险”呢?
      

  7.   

    刷新真快
    -------------------------------------
     回复人:killme2008(www.rubyeye.net) ( 一星(中级)) 信誉:96-----------------------------------------说的很清晰了,定时器写在ServletContextListener里。
    这样在web服务启动时,就会自动启动此监听器,服务停止监听器就停了,和servlet没关系。
      

  8.   

    还复习什么,servlet的生命周期我熟了,但是servlet容器不一定要关闭才会销毁servlet,一个servlet对象在长期不用的情况下也会被销毁掉。这是一个很人性化的设计,如果你要是架设一个服务器,服务器的servlet容器一定是长期开着的,可能一开就是几个月甚至几年。如果生成一个对象就永久保存直到servlet容器关闭才销毁,并且这个对象可能很久都不会用到,那容器为什么要把它放在内存中占用地方呢。而且java的对象销毁机制也是如此,每个对象都有一个销毁的方法,但是并不是代表调用了销毁方法对象就会被立即销毁,这要看java虚拟机高兴什么时候销毁它,它才可能被回收。你调用销毁方法只是告诉虚拟机,这个对象要被尽快销毁,但是它不一定就被销毁了。
    所以,servlet作为一个对象,它要什么时候被销毁那只有天知道,或者只有虚拟机自己知道什么时候销毁了。
      

  9.   

    对于超时这种情况来说,这个servlet实例怎么来判断长期不用,我在init()中启动了定时器,如果定时器使用频率提高到小时或者分钟可以令servlet一直活动下去吗?
      

  10.   

    spiniper() ( 一级(初级))
    前半部分说的还有道理,servlet规范是说servlet的销毁是由容器决定或者容器关闭时销毁
    不过就部分实现来说都是一直留在内存中的,所以就楼主的情况就是别瞎担心,
    先这样做,过段时间后看看。后半部分扯淡了,java什么时候有销毁方法了?
    java没有析构函数不用我说吧,java的垃圾回收算法也并不保证没有引用的对象一定被回收。
    而且servlet的销毁不是虚拟机说的算,而是由容器决定,两种情况:容器决定回收servlet占据的内存
    ,容器关闭
      

  11.   

    使用load-on-startup servlet实现定时机制,这是经过实践的技术,
    在servlet2.2之前的项目几乎都是这样做,或者你知道有更好的办法。
      

  12.   

    楼上的意思是servlet规范在不同的容器中实现的方式是有差别的?那我还是去实际观察有没有意外发生吧,用检测结果来说明可行性。
    谢谢各位啦!
      

  13.   

    其实你可以什么都不用管
    spring来帮你完成定时的调度http://www.busmate.com/collection/958/12487.html
      

  14.   

    Servlet Life CycleThe life cycle of a servlet is controlled by the container in which the servlet has been deployed. When a request is mapped to a servlet, the container performs the following steps.   1. If an instance of the servlet does not exist, the web container
             1. Loads the servlet class.
             2. Creates an instance of the servlet class.
             3. Initializes the servlet instance by calling the init method.                       
                Initialization is covered in Initializing a Servlet.
       2. Invokes the service method, passing request and response objects. Service  
          methods are discussed in Writing Service Methods.If the container needs to remove the servlet, it finalizes the servlet by calling the servlet's destroy method. When a servlet container determines that a servlet should be removed from service (for example, when a container wants to reclaim memory resources or when it is being shut down), the container calls the destroy method of the Servlet interface. j2ee1.4规范中的两段话。可见,servlet只会有一个实例,容器可能根据需要去销毁servlet的实例,销毁时间应该是不定的。
      

  15.   

    我不清楚Jboss是不是在容器关闭前把servlet实例一直留在内存中。
    但可以确定我的那个Servlet服务器配置内存是很多的,有新资源可用应该就不会销毁旧资源的了。希望能够把容器销毁时间延后。
      

  16.   

    我碰到的了这样的问题,在servlet里加入Timer来定时执行任务,
    应用服务器是weblogic
    delay=0;
    period=900000 //周期为15分钟
    //period=1800000  //周期为30分钟
    myTimer.schedule(TimerTask, delay,period);
    当周期为15分钟时任务正常执行
    当周期为30分钟时任务只在启动是执行一次,不能进行周期执行。
    大家分析下是什么原因?