JSP 如何以指定的时间间隔定期自动调用servlet [duplicate]

ulydmbyx  于 2022-12-07  发布在  其他
关注(0)|答案(4)|浏览(176)

此问题在此处已有答案

How to run a background task in a servlet based web application?(5个答案)
八年前就关门了。
必须定期调用servlet。(类似andorid中的服务概念)
如何做到这一点。使用计时器或任何其他解决方案?
先谢谢你。

py49o6xq

py49o6xq1#

要扩展JB Nizet的评论...
formerly accepted answer是一种黑客。如果目标是让一些常规任务作为Web应用程序的一部分来执行,Java提供了一组光滑的技术来实现这一点。

第一个月

第一个是由Servlet规范定义的钩子,当部署Web应用程序和关闭Web应用程序时,该钩子会调用代码。

ScheduledExecutorService的名字

第二部分是添加到Java最新版本中的执行器服务,它是旧Timer类的一个更复杂的替代类,尤其需要ScheduledExecutorService
因此,当您的Web应用启动时,ServletContextListener会启动ScheduledExecutorService。当ServletContextListener收到关闭通知时,它会告诉执行程序正常退出。
有一个诀窍:一定要捕获你的执行程序中的所有异常。如果一个异常泄漏了,执行程序会悄悄地停止执行。这是一个特性而不是一个bug。阅读文档,用谷歌搜索一下。

雅加达并发

一些Servlet容器支持Jakarta Concurrency。此规范提供了对上面讨论的执行器服务的自动管理。

lsmd5eda

lsmd5eda2#

您可以使用,

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

“5”表示5 secondsresponse.addHeader("Refresh", "5")调用添加一个响应头,该响应头被发送回客户端,指示浏览器应在5秒后对servlet进行另一次请求。
同样的事情也可以使用html来完成,

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

你也可以在这里传递url,

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

也可以看看here

pkwftd7m

pkwftd7m3#

如果使用Java EE 6,可以在war中打包一个EJB,并且可以使用一个带@Schedule注解的EJB。
它将定期执行,您无需执行任何其他操作(运行线程或休眠)。

gajydyqb

gajydyqb4#

您可以使用Java线程来完成此操作。
1.调度servlet在服务器启动时加载。请参见如何将servlet设置为在容器启动时加载,而不是在第一次请求时加载?
1.在这个servlet的init()方法中,产生一个线程。
1.在这个线程的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);

相关问题