Tag: 石英调度器

春季日程安排:@Scheduled与Quartz

我正在阅读有关调度的Spring 3.0文档 。 我倾向于Spring的JobDetailBean Quartz。 不过,@ Scheduled注解吸引了我的眼球。 看来这是另一种使用Spring框架调度任务的方式。 基于文档,Spring提供了三种调度方式: @Scheduled 通过石英 通过JDK定时器 我对JDK Timer没有兴趣。 为什么我应该select@Scheduled over Quartz? (当我提到Quartz时,我的意思是使用Spring的bean封装来实现Quartz)。 假设我的用例足够复杂,我将与第三方Web服务通信以按指定的时间间隔导入和导出数据。

石英:防止jobs.xml中的作业的并发实例

这应该很容易。 我使用的是在Apache Tomcat 6.0.18下运行的Quartz,而且我有一个jobs.xml文件 ,它可以设置每分钟运行的计划作业。 我想要做的是,如果在下一次触发时间到来的时候,工作还在运行,我不想开始新的工作,所以我可以让旧的实例完成。 有没有办法指定这在jobs.xml(防止并发实例)? 如果不是的话,有没有办法在我的应用程序的Job实现中(这是通过JobExecutionContext ?)共享访问内存中的单例,所以我可以自己处理并发? (并检测前一个实例是否正在运行) 更新:在文档中陷入困境之后,我正在考虑一些方法,但要么不知道如何让它们工作,或者有问题。 使用StatefulJob 。 这可以防止并发访问…但我不知道如果我使用它会发生什么其他的副作用,我也想避免以下情况: 假设触发时间是每一分钟,即触发#0 =在时间0,触发#1 = 60000msec,#2 = 120000,#3 = 180000等,并且在时间0触发#0触发我的工作需要130000msec。 用简单的Job,当作业触发器#0仍在运行时,它将执行触发器#1和#2。 使用StatefulJob,这将执行触发器#1和#2,在#0在130000结束后立即执行。我不想要那个,我想要#1和#2不运行,并且下一个运行作业的触发器应该发生在#3(180000msec)。 所以我仍然需要使用StatefulJob来做其他事情,以便按照我想要的方式工作,所以我没有看到使用它的好处。 使用TriggerListener从vetoJobExecution()返回true。 虽然实现接口看起来很简单,但我必须弄清楚如何以声明方式设置TriggerListener的一个实例。 找不到xml文件的文档 。 使用实现Job的我的类拥有的static共享线程安全对象(例如信号量或其他)。 我不喜欢在Tomcat / Quartz中通过static关键字使用单例的想法,不确定是否有副作用。 另外,我真的不希望他们成为真正的单身人士,只是与特定的工作定义有关。 实现我自己的触发器 ,它扩展了SimpleTrigger,并包含可以运行自己的TriggerListener的共享状态。 再一次,我不知道如何设置XML文件来使用这个触发器,而不是标准的<trigger><simple>…</simple></trigger> 。

Quartz:永远不会执行的Cronexpression式

我知道这里有一个重复,这可能是我的情况,尽pipe它应该得到一些更好的解释,我将尝试在这里提供。 我使用Spring应用程序上下文来处理Java Web应用程序。 在这种情况下,我使用Quartz来定义计划任务。 这些作业是由.properties文件中定义的cron触发的。 Spring上下文embedded在war中,而.properties文件位于应用程序服务器上(在这种情况下,Tomcat)。 这样做很好,可以根据环境(开发,集成,生产等)定义不同的cron。 现在,当我在自己的计算机上本地运行这个应用程序时,我不希望这些作业被执行。 有没有办法写一个永远不会触发的cronexpression式?

在Spring中将bean引用注入Quartz作业?

我设法在Spring中使用JobStoreTX持久存储来configuration和调度Quartz作业。 我不使用Spring的Quartz作业,因为我需要在运行时dynamic地调度它们,而且我发现将Spring和Quartz集成的所有示例都是在Springconfiguration文件中对shcedules进行硬编码的。无论如何,这里是我安排工作: JobDetail emailJob = JobBuilder.newJob(EMailJob.class) .withIdentity("someJobKey", "immediateEmailsGroup") .storeDurably() .build(); SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger() .withIdentity("someTriggerKey", "immediateEmailsGroup") .startAt(fireTime) .build(); // pass initialization parameters into the job emailJob.getJobDataMap().put(NotificationConstants.MESSAGE_PARAMETERS_KEY, messageParameters); emailJob.getJobDataMap().put(NotificationConstants.RECIPIENT_KEY, recipient); if (!scheduler.checkExists(jobKey) && scheduler.getTrigger(triggerKey) != null) { // schedule the job to run Date scheduleTime1 = scheduler.scheduleJob(emailJob, trigger); } EMailJob是一个使用Spring的JavaMailSenderImpl类发送电子邮件的简单工作。 public class EMailJob implements Job […]

确保Spring Quartz作业执行不重叠

我有一个Java程序,每20秒执行一次Spring Qquartz。 有时只需要几秒钟的时间来执行,但随着数据变得更大,我相信它会运行20秒或更长时间。 在一个实例仍在执行的情况下,如何防止Quartz触发/触发作业? 在数据库上执行相同操作的2个作业不会那么好。 有什么办法可以做一些同步吗?