必须定期调用servlet。(如android中的服务概念)
如何做到这一点。使用计时器或任何其他解决方案?
提前致谢。
答案 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 seconds
。response.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执行此操作。
安排在服务器启动时加载的servlet。请参阅如何设置要在启动容器时加载的servlet,而不是第一次请求?
在这个servlet的init()方法中,产生一个线程。
使用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);