使用Quartz和Obsidian来调度任务

在介绍使用到的Quartz和Obsidian的API之前,首先我得声明一下,一般来说使用API并不是调度任务的最佳方式。Quartz提供了一个通过XML来配置作业的机制,而Obsidian则为你提供了一套完整的管理和监控的WEB应用。

然而,有一些使用场景还是强烈推荐使用API的,我们来看一下吧。

Quartz

我们先来看下在Quartz里每半小时调度一次任务是怎样实现的:

   // First, create the scheduler
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = sf.getScheduler();

// Build up the job detail
JobDetail job = JobBuilder.newJob(HelloWorld.class)
    .withIdentity("HelloWorldJob", "HelloWorldGroup")
    .build();

// Add some configuration
job.getJobDataMap().put("planet", "Earth");

// Create the scheduler
CronScheduleBuilder schedule = CronScheduleBuilder.cronSchedule("* 0/30 * * * ?");

// Create the trigger
CronTrigger trigger = TriggerBuilder.newTrigger()
    .withIdentity("HelloWorldTrigger", "HelloWorldGroup")
    .withSchedule(schedule)
    .build();

// Schedule the job with the created trigger.
scheduler.scheduleJob(job, trigger);

scheduler.start(); // This is how you start the scheduler itself if you need to

// Later, we can shut down the scheduler 
scheduler.shutdown();

可以看到,首先你得获取到一个调度器实例的句柄,然后创建JobDetail,CronScheduleBuilder,以及CronTrigger,最后你才能去调度任务。

这里有几步看起来有点多余,还有那些无关的属性比如说作业标识符,触发器名字,触发器组,等等,但这是你使用的一个基本的模板所必须的。

Obsidian

我们来看下Obsidian 是怎么做的。我们使用的是同一个Job类(假设它同时满足Quartz和Obsidian的要求),用的也是同样的半小时一次的策略。

   // Create our configuration parameters
List<ConfigurationParameter> parameters = Arrays.asList(
         new ConfigurationParameter().withName("planet")
                                     .withType(ParameterType.STRING)
                                     .withValue("Earth")
);

// Set up the job configuration
JobCreationRequest request = new JobCreationRequest()
.withNickname("HelloWorld")
.withJobClass(HelloWorld.class.getName())
        .withState(JobStatus.ENABLED)
.withSchedule("* 0/30 * * *")
        .withRecoveryType(JobRecoveryType.LAST) // how to recover failed jobs
.withParameters(parameters);

// Now actually save this configurations, which becomes active on all schedulers.
JobDetail addedJob = new JobManager().addJob(request, "Audit User");
System.out.println("Added new job: " + addedJob );

// If you need to start an embedded scheduler, use this line to initialize it.
SchedulerStarter scheduler = SchedulerStarter.get(SchedulerMode.EMBEDDED);

// Later, we can gracefully shut down the scheduler 
scheduler.shutDown();

可以看到的是,Obsidian非常简单,它废弃了那些对你开发和管理任务没有帮助的无关属性。你只需要创建一个JobCreationRequest,带上需要的几个字段,包括ConfigurationParameters什么 的,然后调用 JobManager.addJob(),把作业属性和可选的一个审核用户传进去就好了,这个用户是用来跟踪任务的修改的。

调用这个接口会把你的配置存储到Obsidian的数据库中,因此它会广播到你集群中的所有调度器中。很多用户都体会到了它的便利性,他们只需执行一次作业调度的初始化配置,就可以通过这个功能强大的WEB应用来对它们进行修改了。

这个API是经过仔细设计的,它提供的特性都是用户所需的,不仅功能强大同时还易于使用。这个示例是一个使用Obsidian的简单的模板,如果你想深入了解一下或者需要用到别的一些扩展的特性的话,可以参考下我们 完整的API文档

原创文章转载请注明出处: 使用Quartz和Obsidian来调度任务 英文原文链接

Tagged: ,

Comments are closed.