如何在指定的时间间隔内定期自动调用servlet

时间:2014-10-18 06:01:25

标签: java api jsp servlets timer

必须定期调用servlet。(如android中的服务概念)

如何做到这一点。使用计时器或任何其他解决方案?

提前致谢。

4 个答案:

答案 0 :(得分:3)

扩展JB Nizet的评论...

formerly accepted answer有点像黑客。如果目标是让某些常规任务作为Web应用程序的一部分执行,那么Java提供了一些灵活的技术来实现这一目标。

ServletContextListener

第一个是Servlet规范定义的钩子,用于在部署Web应用程序和Web应用程序关闭时调用代码。这个钩子是ServletContextListener

ScheduledExecutorService

第二部分是添加到Java最新版本的执行程序服务,作为旧Timer类的更复杂的替代方法。特别需要ScheduledExecutorService

因此,当您的Web应用程序启动时,ServletContextListener将启动ScheduledExecutorService。当ServletContextListener被告知关闭时,它会告诉执行者正常退出。

这方面的一个技巧:确保在执行程序中捕获所有异常。如果异常泄漏,执行程序将以静默方式停止执行。这是一个不是bug的功能。阅读文档并通过谷歌搜索进行研究。

搜索StackOverflow以获取示例并讨论这两者。

答案 1 :(得分:1)

你可以使用,

response.addHeader("Refresh", "5");

" 5"表示5 secondsresponse.addHeader("Refresh", "5")调用添加一个响应头,该头被发送回客户端,指示浏览器应在5秒后再发出一次servlet请求。

使用html也可以做同样的事情,

<meta http-equiv="refresh" content="5" />

你可以在这里传递网址,

<meta http-equiv="refresh" content="5" url="example.com"/>

另请查看here ..

答案 2 :(得分:0)

如果使用Java EE 6,则可以在战争中打包EJB,并且可以使用@Schedule带注释的EJB。

它将定期执行,您不必做任何其他事情(运行线程或睡眠)。

答案 3 :(得分:-2)

您可以使用Java Threads执行此操作。

  1. 安排在服务器启动时加载的servlet。请参阅如何设置要在启动容器时加载的servlet,而不是第一次请求?

  2. 在这个servlet的init()方法中,产生一个线程。

  3. 在此线程的run()方法中,计算在执行任务之前要等待的毫秒数。然后调用Thread.sleep(msec)。然后执行任务,并循环(无限)。 java.util.Timer类可以提供很多帮助。
  4. 使用java.util.Timer类的schedule()方法:

    long now = System.currentTimeMillis();
    Date whenToRun = new Date(now+millisecondsInFuture);
    Timer timer = new Timer();
    TimerTask task = new TimerTask() {
      public void run() {
    // job code here
      }
    };
     timer.schedule(task, whenToRun);
    

    或者使用java.util.Timer类的scheduleAtFixedRate()方法:

    int initialDelay = 30000; // start after 30 seconds
    int period = 5000;        // repeat every 5 seconds
    Timer timer = new Timer();
    TimerTask task = new TimerTask() {
     public void run() {
    // job code here
      }
    };
     timer.scheduleAtFixedRate(task, initialDelay, period);