Java 在多实例环境中仅执行一次Quartz作业
我试图在Quartz 1.6中创建一个Java 在多实例环境中仅执行一次Quartz作业,java,quartz-scheduler,quartz,Java,Quartz Scheduler,Quartz,我试图在Quartz 1.6中创建一个作业,但只需要执行一次,因为我有两个测试实例,它们的.war文件版本相同 这是我的TestPlugin类,Job将每60秒执行一次: public class TestPlugin implements PlugIn { public TestPlugin() { super(); } public void destroy() { } public void init(ActionServlet
作业
,但只需要执行一次,因为我有两个测试实例,它们的.war文件版本相同
这是我的TestPlugin
类,Job
将每60秒执行一次:
public class TestPlugin implements PlugIn {
public TestPlugin() {
super();
}
public void destroy() {
}
public void init(ActionServlet arg0, ModuleConfig arg1)
throws ServletException {
try {
JobDetail job = JobBuilder.newJob(TestDemonio.class)
.withIdentity("anyJobName", "group1").build();
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("anyTriggerName", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("0/60 * * ? * * *"))
.build();
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.scheduleJob(job, trigger);
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
然后我让我的类TestExecute
打印一个简单的输出:
@DisallowConcurrentExecution
public class TestDemonio implements Job {
public void execute(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("QUARTZ JOB MESSAGE");
}
}
我已经研究了如何通过添加注释@DisallowConcurrentExecution
来实现我想要的功能,该注释只执行一次作业,但我在每个实例上都会收到一条消息
这是我的quartz.properties文件:
# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.
#
org.quartz.scheduler.instanceName: DefaultQuartzScheduler
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 10
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
org.quartz.jobStore.misfireThreshold: 60000
org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
您需要将以下属性添加到quartz.property文件(源:):
org.quartz.jobStore.isClustered:true
阅读本手册,了解有关isClustered
属性的更多信息,请参阅链接
请注意:
@当同一节点上运行两个具有相同jobkey的不同作业时,DisallowConcurrentExecution起作用
而isClustered属性用于确保在应用程序运行时执行作业的单个实例,多个节点通过数据库表进行原子性通信。您是否也可以共享quartz.properties文件?另外,检查数据库表中的作业条目,了解它显示了多少个作业实例?另外,请注意,
@DisallowConcurrentExecution
,据说是为了在单个节点上执行单个作业。对于多个节点,quartz群集负责。语句只执行一次的必要性
和将每60秒执行一次
相互排除。请澄清所需的信息behavior@Ankur我添加了quartz属性文件。为了安全起见,我们需要设置org.quartz.scheduler.instanceId=AUTO,因为quartz中的集群是在数据库级别完成的。如果quartz的两个实例具有相同的名称,即(org.quartz.scheduler.instanceName),但instanceId不同(org.quartz.scheduler.instanceId)它们将形成一个集群。我将quartz jar添加到项目中,quartz.properties文件在其中,当我执行作业时,它将被自动识别?@Ankur-isClustered:true适用于quartz的多个实例或我们应用程序的多个实例?我检查了您提供的参考,并在这里为isClustered标志编写了它设置为“true”以启用群集功能。如果您有多个Quartz实例使用同一组数据库表,则必须将此属性设置为“true”……否则,您将遭受严重破坏。有关详细信息,请参阅群集配置文档。