【问题标题】:How to run a task in fixed intervals in a multiple-instances Tomcat env.?如何在多实例 Tomcat 环境中以固定间隔运行任务?
【发布时间】:2012-03-05 12:26:00
【问题描述】:

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

【问题讨论】:

    标签: java multithreading task


    【解决方案1】:

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


    (来源:quartz-scheduler.org

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

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

    【讨论】:

    • 看来我(我们?)在这里遗漏了一些东西。 Java Timer 的内置能力不应该可以处理吗?我的意思是,有固定的间隔是很常见的,而且你的应用程序服务器也可以在多个实例中运行..
    • @Haim:怎么样? Timer 只是一个管理少数线程的 Java 类。如果您有多个 JVM(可能在不同的机器上),那么该类如何知道其他实例?它们是完全独立的——这就是为什么你的任务是在它们上执行的,这就是为什么你有提到 Quartz、数据库和文件锁定的答案——因为你需要在 JVM 之外进行某种同步/协调。还是我错过了什么?
    【解决方案2】:

    您将需要某种同步机制。虽然理想情况下您需要一个分布式调度程序(例如 Quartz 集群),但考虑到您的使用场景,您可能有一些共享会话状态的机制或应用程序底层的共享数据库;您可以简单地记录操作并获取基于数据库的锁,以确保一次只有一个实例运行命令(并在锁获取后仔细检查以确保您没有两次运行相同的任务)。

    这是我发现的一篇关于基于 DB 的锁定技术的文章:http://blog.udby.com/archives/15

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-15
      • 2010-11-05
      • 2017-09-06
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      相关资源
      最近更新 更多