【问题标题】:quartz: Run single instance per JVM石英:每个 JVM 运行单个实例
【发布时间】:2013-09-06 08:23:33
【问题描述】:

我在我的 Java SSE (Java Flex) 应用程序中使用 Quartz Scheduler 2.2.0。我设置了一个每天上午 10:00 运行的时间表并执行一些工作。我没有关闭 Quartz Scheduler,因为我希望它每天都运行。

但是无论如何我知道 Quartz Scheduler 已经在运行,因为如果我在用户打开我的 Java Flex 应用程序时启动它,那么就会存在多个实例。

有什么方法可以让 JVM 进程在计算机上运行,​​我可以看到 Quartz Scheduler 进程已经启动,所以我不需要再次运行它,或者如果我再次运行它,它应该会自动检查一个实例是否存在所以它应该抛出一个异常。

我在下面提供了我的配置 XML 文件,希望对您有所帮助...

石英属性

#============================================================================
# Configure Main Scheduler Properties  
#============================================================================

org.quartz.scheduler.instanceName: SF-Tasks-Scheduler
org.quartz.scheduler.instanceId: Quartz_Instance_1
org.quartz.scheduler.instanceIdGenerator.class: org.quartz.simpl.HostnameInstanceIdGenerator
org.quartz.scheduler.skipUpdateCheck: true
org.quartz.scheduler.makeSchedulerThreadDaemon: true

#============================================================================
# Configure ThreadPool  
#============================================================================

org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 1
org.quartz.threadPool.threadPriority: 5

#============================================================================
# Configure JobStore  
#============================================================================

org.quartz.jobStore.misfireThreshold: 60000

org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore




#============================================================================
# Configure Plugins 
#============================================================================

org.quartz.plugin.triggHistory.class = \org.quartz.plugins.history.LoggingTriggerHistoryPlugin
org.quartz.plugin.triggHistory.triggerFiredMessage = Trigger {1}.{0} fired job {6}.{5} at\: {4, date, HH\:mm\:ss MM/dd/yyyy}
org.quartz.plugin.triggHistory.triggerCompleteMessage = Trigger {1}.{0} completed firing job {6}.{5} at {4, date, HH\:mm\:ss MM/dd/yyyy}

这就是我安排工作的方式

try {
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            JobDetail jobTaskUpdater = JobBuilder.newJob(JobTaskUpdater.class).withIdentity(JobTaskUpdater.class.getName(), GROUP_TASK_JOB_DETAIL).build();
            Trigger trigger = TriggerBuilder.newTrigger().withIdentity(NAME_TRIGGER_TASK_UPDATER, GROUP_TASK_TRIGGER).withSchedule(SimpleScheduleBuilder.repeatMinutelyForever()).build();          

            JobTaskUpdaterStatusListener listener = new JobTaskUpdaterStatusListener();
            KeyMatcher<JobKey> matcherTaskUpdater = KeyMatcher.keyEquals(jobTaskUpdater.getKey());      

            scheduler.getListenerManager().addJobListener(listener, matcherTaskUpdater);

            scheduler.scheduleJob(jobTaskUpdater, trigger); 


            scheduler.start();

        } catch (SchedulerException e) {
            e.printStackTrace();
        }

【问题讨论】:

    标签: process jvm singleton instance quartz-scheduler


    【解决方案1】:

    您可以通过此 scheduler.getCurrentlyExecutingJobs() 来获取当前正在运行的作业列表。如果您发现任何单个作业或调度程序是可运行的,那么您可以停止。

    【讨论】:

    • 我说的是 Quartz-Scheduler 本身的实例。
    • 它会返回我正在使用该 Quartz-Scheduler 实例执行的作业列表,但是如果有其他更独立的进程正在运行怎么办?我需要检查这个条件
    猜你喜欢
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    相关资源
    最近更新 更多