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

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

这该怎么做。 使用计时器还是其他解决方案?

提前致谢。

扩展JB Nizet的评论……

以前接受的答案是一种黑客攻击。 如果目标是让一些常规任务作为Web应用程序的一部分执行,那么Java提供了一些灵活的技术来实现这一目标。

ServletContextListener

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

ScheduledExecutorService

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

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

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

搜索StackOverflow以获取这些示例和讨论。

您可以使用 ,

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

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

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

  

你可以在这里传递url,

  

还看看这里 ..

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

它将定期执行,您不必执行任何其他操作(运行线程或hibernate)。

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

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

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

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

使用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);