Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在多实例Tomcat环境中以固定的时间间隔运行任务。?_Java_Multithreading_Task_Quartz Scheduler_Hazelcast - Fatal编程技术网

Java 如何在多实例Tomcat环境中以固定的时间间隔运行任务。?

Java 如何在多实例Tomcat环境中以固定的时间间隔运行任务。?,java,multithreading,task,quartz-scheduler,hazelcast,Java,Multithreading,Task,Quartz Scheduler,Hazelcast,我正在安排后台任务以固定的时间间隔运行,但由于tomcat在多个实例中运行(即多个启动Apache服务器;在我的情况下为3台),因此该任务在每个时间间隔内运行3次。。我希望它运行一次(不管运行的Tomcat实例有多少) 我正在运行一个启动时加载的servlet(在web.xml中),它将启动我的任务: 奥尼特 长方体 1. OnInit类启动该类的单个实例: 公共类BGTaskRefresh{ 私有静态BGTaskRefresh refreshTaskFactory=null; 专用最终计时

我正在安排后台任务以固定的时间间隔运行,但由于tomcat在多个实例中运行(即多个启动Apache服务器;在我的情况下为3台),因此该任务在每个时间间隔内运行3次。。我希望它运行一次(不管运行的Tomcat实例有多少)

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


奥尼特
长方体
1.
OnInit类启动该类的单个实例:

公共类BGTaskRefresh{
私有静态BGTaskRefresh refreshTaskFactory=null;
专用最终计时器=新计时器();
公共BGTaskRefresh(){}
公共静态void init()
{
如果(refreshTaskFactory==null)
{
refreshTaskFactory=新的BGTaskRefresh();
refreshTaskFactory.start();
}
}
公开作废开始()
{
时间表(
新TimerTask()
{
公开募捐
{
boxService box=新的boxService();
box.refreshMethod();
} 
},                      
5*60*1000,//首次运行延迟5分钟
60*60*1000);//60分钟(两次运行之间的间隔)
}
}

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


(来源:)

在您的情况下,这可能有些过分,但Quartz将只在单个实例上运行作业(使用数据库进行同步),并将在空闲服务器上自动运行作业


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

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

我发现了一篇关于基于DB的锁定技术的文章:

我(我们?)似乎缺少了一些东西。Java定时器的内置功能不应该能够处理它吗?我的意思是,有固定的时间间隔是很常见的,而且你的应用服务器在多个实例中运行。@Haim:如何?它只是一个Java类,管理很少的线程。如果您有多个JVM(可能在不同的机器上),那么该类如何知道其他实例?它们是完全独立的——这就是为什么要对它们中的每一个执行任务,这就是为什么要对它们进行锁定、数据库锁定和文件锁定——因为您需要JVM之外的某种同步/协调。还是我遗漏了什么?