Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.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 在多实例环境中仅执行一次Quartz作业_Java_Quartz Scheduler_Quartz - Fatal编程技术网

Java 在多实例环境中仅执行一次Quartz作业

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

我试图在Quartz 1.6中创建一个
作业
,但只需要执行一次,因为我有两个测试实例,它们的.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”……否则,您将遭受严重破坏。有关详细信息,请参阅群集配置文档。