Tag: quartz scheduler

使用Spring的Quartz作业和调度任务之间的区别?

我是Spring-boot(版本1.3.6)和Quartz的新手,我想知道使用Spring-scheduler创建任务有什么区别: @Scheduled(fixedRate = 40000) public void reportCurrentTime() { System.out.println(“Hello World”); } 和石英方式 : 0. Create sheduler. 1. Job which implements Job interface. 2. Create JobDetail which is instance of the job using the builder org.quartz.JobBuilder.newJob(MyJob.class) 3. Create a Triger 4. Finally set the job and the trigger to the scheduler 在代码中: public class HelloJob implements […]

石英性能

似乎Quartz调度程序每秒可以运行的作业数量有限制。 在我们的场景中,我们每秒大约有20个作业以24×7的速度启动,而石英每秒可以运行多达10个作业(有100个石英线程和100个数据库连接池大小,用于JDBC支持的JobStore),但是,当我们将它增加到20个每秒工作,石英变得非常慢,其触发的工作与他们的实际预定时间相比非常晚,造成许多失火并最终显着降低系统的整体性能。 一个有趣的事实是,对于这样的延迟触发器, JobExecutionContext.getScheduledFireTime().getTime()在其调度时间之后变为10-20甚至更多分钟。 石英调度程序每秒可以运行多少个作业而不会影响作业的预定时间,这些负载的最佳石英线数应该是多少? 或者我在这里遗漏了什么? 关于我们想要实现的目标的细节: 我们有近10k项目(分为2个或更多类别,在目前情况下我们有2个类别),我们需要在给定频率下进行一些处理,例如15,30,60 …分钟,这些项目应在该频率内处理每分钟给定一个油门。 例如,假设60分钟频率,每个类别的5k项目应该以每分钟500项的节流量进行处理。 因此,理想情况下,这些物品应在一天中每小时的前10(5000/500)分钟内处理,每分钟有500件待处理的物品,这些物品在每分钟的均匀分布均匀分布,因此我们将大约8-一个类别每秒9项。 现在为了实现这一目标,我们使用Quartz作为调度程序来触发处理这些项目的作业。 但是,我们不会在Job.execute方法中处理每个项目,因为每个项目处理需要5-50秒(平均到30秒),这涉及webservice调用。 我们宁愿为JMS队列上的每个项目处理推送消息,并且单独的服务器机器处理这些作业。 我注意到Job.execute方法花费的时间不超过30毫秒 。 服务器细节: Solaris Sparc 64位服务器,带有8/16内核/线程cpu,用于具有16GB RAM的调度程序,我们在调度程序集群中有两台这样的机器。

如何使用Quartz调度程序维护作业历史记录

我想保留由Quartz调度程序安排的作业历史,其中包含以下属性:“开始时间”,“结束时间”,“成功”,“错误”。 有两个可用的接口: ITriggerListener和IJobListener (我使用接口的C#命名约定,因为我使用的是Quartz.NET,但可能会要求Java版本提出相同的问题)。 IJobListener有一个JobToBeExecuted和一个JobWasExecuted方法。 后者提供了一个JobExecutionException以便您知道什么时候出错了。 但是,无法关联JobToBeExecuted和JobWasExecuted 。 假设我的工作运行了十分钟。 我在t0和t0+2开始它(所以它们重叠)。 我得到两次对JobToBeExecuted调用,并在我的历史表中插入两个开始时间。 当两个作业都在t1和t1+2结束时,我得到两次对JobWasExecuted调用。 如何知道每次调用中要更新的数据库记录(以及其相应的开始时间来存储结束时间)? ITriggerListener还有另一个问题。 当作业失败时,无法在TriggerComplete方法中获得任何错误。 我如何获得所需的行为?

如何将实例变量传递给Quartz作业?

我想知道如何在Quartz中外部传递一个实例变量? 下面是我想写的伪代码。 我怎样才能将externalInstance传递给这个Job? public class SimpleJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { float avg = externalInstance.calculateAvg(); } }

java quartz scheduler立即开始一项新工作

是否可以创建一个立即触发的工作? 当我想让这个工作成为现在的时候我用现在的日期和时间来存储一个cron表达式字符串 – 我觉得它太复杂了,还有另一种方法可以立即触发这项工作吗? 提前致谢。

Spring 4.0.6 with quartz 1.8.6:setCronExpression方法未暴露给CronTriggerBean类

我使用的是弹簧版4.0.6和石英,版本1.8.6。 问题是,当我尝试使用配置类而不是xml(带@Configuration注释)时,我无法使用方法设置cron表达式 CronTriggerBean ctBean = new CronTriggerBean(); ctBean.setCronExpression(“0 35 15?* MON *”); 请告诉我是否存在版本兼容性问题。 确切的错误是这样的: 对于类型CronTriggerBean,方法setCronExpression(String)未定义

在Java中安排例外

我正在开发一个需要从给定URL下载文件的任务,其中一个要求是它可以处理网络故障和exception。 在我的实现中,我有一个DonwloadManager为每个URL分配一个线程,以免被阻塞。 问题是我不知道如何通过代码模拟失败和exception,我尝试使用Quartz作为调度程序和只抛出exception的作业,但据我所知,调度程序在不同的线程上运行,所以这不会完全影响下载线程。 有没有办法在下载线程中模拟exception? 以下是我的更多见解的代码: public class DownloadManager { int allocatedMemory = 0; void validateURLs(String[] urls) { if (urls.length == 0) { throw new IllegalArgumentException(“URLs List is empty”); } } public ArrayList downloadURLs(String[] urls, int memorySize) throws Exception { validateURLs(urls); ExecutorService executor = Executors.newWorkStealingPool(); CompletionService completionService = new ExecutorCompletionService(executor); ArrayList downloadStatus = new ArrayList(); allocatedMemory […]

Quartz cron表达式为特定日期的两周一次

我正在尝试创建Quartz cron表达式,该表达式在给定的一天每两周运行一次 例如 星期一每两周一次 并使用以下表达式 0 0 6 ? * 1#2,1#4 但不知何故,我得到以下错误 未实现对指定多个“第n”天的支持。

Spring + Quartz重新安排或更新触发器?

我使用的是Spring 3.2和Quartz 2.2 。 我的target Class和method , public class Producer { public void executeListener() { System.out.println(” Test Method . “); } } 在我的spring applicationContext.xml , <!– –> 上面的代码正常工作, executeListener()连续执行,间隔为5 seconds ,启动延迟为10 sec 。 我试过在spring controller中更新触发器, @Controller public class SpringController { @Autowired org.springframework.scheduling.quartz.SchedulerFactoryBean myScheduler; @Autowired org.springframework.scheduling.quartz.SimpleTriggerFactoryBean oldTrigger; @RequestMapping(value=”/reSheduleTrigger.html”,method=RequestMethod.POST) public @ResponseBody String reSheduleTrigger(@RequestParam(value=”triggerInSec”) String triggerInSec ){ System.out.println(“—————– […]

Quartz:如何使用org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin重新加载作业和触发器?

我想在我的小而简单的Web应用程序中使用quartz。 (Quartz 2.1.6和tomcat 7.0.22)。 我想更改触发器cron表达式而不重启我的应用程序。 我将作业放在xml文件quartz-jobs.xml并在quartz.properties设置XMLSchedulingDataProcessorPlugin 问题:当我更改quartz-jobs.xml内容时,石英欺骗文件已更改并重新加载,删除并创建新作业。 我在日志文件中看到它。 但是这个文件的内容很旧(与启动时相同)。 所以我在filesystem新版本的quartz-jobs.xml ,但是quartz接受了该文件的旧版本。 文件系统是普通的ext4,带有默认的setings。 那么,如何从xml文件刷新石英作业和触发器? 这是我的配置: quartz.properties: org.quartz.scheduler.instanceName = SMSScheduler org.quartz.threadPool.threadCount = 1 org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore org.quartz.scheduler.skipUpdateCheck=true org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin org.quartz.plugin.jobInitializer.fileNames = quartz-jobs.xml org.quartz.plugin.jobInitializer.failOnFileNotFound = true org.quartz.plugin.jobInitializer.scanInterval = 30 org.quartz.plugin.jobInitializer.wrapInUserTransaction = false 石英jobs.xml REPORT_GROUP REPORT_TRIGGER_GROUP report-job REPORT_GROUP Create report com.company.quartz.ReportJob every-day-trigger REPORT_TRIGGER_GROUP report-job REPORT_GROUP 0 * * […]