此问题在此处已有答案:
How to run a background task in a servlet based web application?(5个答案)
八年前就关门了。
必须定期调用servlet。(类似andorid中的服务概念)
如何做到这一点。使用计时器或任何其他解决方案?
先谢谢你。
此问题在此处已有答案:
How to run a background task in a servlet based web application?(5个答案)
八年前就关门了。
必须定期调用servlet。(类似andorid中的服务概念)
如何做到这一点。使用计时器或任何其他解决方案?
先谢谢你。
4条答案
按热度按时间py49o6xq1#
要扩展JB Nizet的评论...
formerly accepted answer是一种黑客。如果目标是让一些常规任务作为Web应用程序的一部分来执行,Java提供了一组光滑的技术来实现这一点。
第一个月
第一个是由Servlet规范定义的钩子,当部署Web应用程序和关闭Web应用程序时,该钩子会调用代码。
ScheduledExecutorService
的名字第二部分是添加到Java最新版本中的执行器服务,它是旧Timer类的一个更复杂的替代类,尤其需要ScheduledExecutorService。
因此,当您的Web应用启动时,ServletContextListener会启动ScheduledExecutorService。当ServletContextListener收到关闭通知时,它会告诉执行程序正常退出。
有一个诀窍:一定要捕获你的执行程序中的所有异常。如果一个异常泄漏了,执行程序会悄悄地停止执行。这是一个特性而不是一个bug。阅读文档,用谷歌搜索一下。
雅加达并发
一些Servlet容器支持Jakarta Concurrency。此规范提供了对上面讨论的执行器服务的自动管理。
lsmd5eda2#
您可以使用,
“5”表示
5 seconds
。response.addHeader("Refresh", "5")
调用添加一个响应头,该响应头被发送回客户端,指示浏览器应在5秒后对servlet进行另一次请求。同样的事情也可以使用html来完成,
你也可以在这里传递url,
也可以看看here。
pkwftd7m3#
如果使用Java EE 6,可以在war中打包一个EJB,并且可以使用一个带@Schedule注解的EJB。
它将定期执行,您无需执行任何其他操作(运行线程或休眠)。
gajydyqb4#
您可以使用Java线程来完成此操作。
1.调度servlet在服务器启动时加载。请参见如何将servlet设置为在容器启动时加载,而不是在第一次请求时加载?
1.在这个servlet的init()方法中,产生一个线程。
1.在这个线程的run()方法中,计算在执行任务之前等待的毫秒数。然后调用Thread.sleep(msec)。然后执行任务,并循环(无限)。java.util.Timer类可以提供很大帮助。
使用java.util.Timer类的schedule()方法:
或者使用java.util.Timer类的scheduleAtFixedRate()方法: