gpt4 book ai didi

java - 如何在多实例 Tomcat 环境中以固定间隔运行任务?

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:58:54 27 4
gpt4 key购买 nike

我正在安排后台任务以固定间隔运行,但由于 tomcat 在多个实例中运行(即多个启动 Apache 服务器;在我的例子中是 3 个),那么任务在每个间隔运行 3 次。我会喜欢它运行一次(无论运行的 Tomcat 实例数量如何)。

我正在运行一个在启动时加载的 servlet(在 web.xml 中),它将启动我的任务:

<servlet>
<servlet-name>OnInit</servlet-name>
<servlet-class>box.OnInit</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

OnInit 类启动该类的单个实例:

public class BGTaskRefresh {
private static BGTaskRefresh refreshTaskFactory = null;
private final Timer timer = new Timer();

public BGTaskRefresh() {}
public static void init()
{
if( refreshTaskFactory == null )
{
refreshTaskFactory = new BGTaskRefresh();
refreshTaskFactory.start();
}
}

public void start()
{
timer.schedule(
new TimerTask()
{
public void run()
{
boxService box = new boxService();
box.refreshMethod();
}
},
5 * 60 * 1000, // 5-Min Delay for first run
60 * 60 * 1000); // 60-Mins (Interval between 2 runs)
}
}

最佳答案

您可能想看看 ,尤其是它的clustering能力:

two muppets
(来源:quartz-scheduler.org)

这在您的情况下可能有点矫枉过正,但 Quartz 会负责仅在单个实例上运行该作业(使用数据库进行同步),并将自动在空闲服务器上运行该作业。

另一个选项是 以及它提供的分布式锁和队列。

关于java - 如何在多实例 Tomcat 环境中以固定间隔运行任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9566621/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com