我正在安排后台任务以固定间隔运行,但由于 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)
}
}
最佳答案
您可能想看看 quartz-scheduler ,尤其是它的clustering能力:
(来源:quartz-scheduler.org)
这在您的情况下可能有点矫枉过正,但 Quartz 会负责仅在单个实例上运行该作业(使用数据库进行同步),并将自动在空闲服务器上运行该作业。
另一个选项是 hazelcast以及它提供的分布式锁和队列。
关于java - 如何在多实例 Tomcat 环境中以固定间隔运行任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9566621/