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

标签 java multithreading task

我正在安排后台任务以固定间隔运行,但由于 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/

相关文章:

Java嵌套for循环打印输出

c# - 任务执行去哪里了?

java - Dijkstra算法对无向图的错误实现

java - 在java中获取twitter页面标题、描述和关键字

java - 如何在 JTable Cell 中显示多行

multithreading - 使用 Goroutine 实际上需要更长的时间来执行

java - 僵尸线程正在吞噬我的大脑(J2EE、Tomcat、Hibernate、Quartz)

Java 线程,绿色还是原生?

task - 用多个点命名 grunt js 任务和文件

xml - Joomla,为特定 View 添加任务参数