quartz:每个JVM运行单个实例

时间:2013-09-06 08:23:33

标签: process jvm singleton instance quartz-scheduler

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

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

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

我在下面给出了我的配置XML文件,希望这有帮助......

  

quartz.properties

#============================================================================
# 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();
        }

1 个答案:

答案 0 :(得分:1)

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