quartz任务调度器,有个很忧伤的限制,就是提交的任务只能指定Job class类型,具体job的实例实例化有quartz来创建,且任务每次执行都会创建一个job实例,在某些场景下,我们可能需要传递一个job实例(比如job的属性有其他方式注入),那么直接使用quartz则不太能满足,我们需要借助dataMap来传递自己的实例.例如:
CronScheduleBuilder sb = CronScheduleBuilder.cronSchedule(cronExpression); Trigger trigger = TriggerBuilder.newTrigger().withIdentity(key, GROUP).withSchedule(sb).build(); //如果任务已经在执行,则返回 if(scheduler.checkExists(trigger.getKey())){ return true; } Class<MyJob> jobClass = MyJob.class; JobDetail job = JobBuilder.newJob(jobClass).withIdentity(key, GROUP).build(); scheduler.scheduleJob(job, trigger);
其中MyJob就是我们自己的Job类,他实现了Job接口..接下来我们使用一种变通的方式来使用quartz.:
1. JobExecutor接口: 所有的可执行任务,都需要实现这个接口 .
public interface JobExecutor { public void execute(); }
2. JobProxy类:当任务调度时,充当代理层,间接的执行JobExecutor实例方法.
public class JobProxy implements Job { private static Logger log = Logger.getLogger(JobProxy.class); @Override public void execute(JobExecutionContext context) throws JobExecutionException { JobExecutor executor = (JobExecutor)context.getJobDetail().getJobDataMap().get(Utils.WORKER_CALLER); if(executor == null){ return; } try{ executor.execute();//调用自定义的JobExecutor实例,此实例通过dataMap传递 }catch(Exception e){ e.printStackTrace(); } } }
3. JobScheduler类:任务的调度与取消
public class JobScheduler { private Scheduler scheduler; private static final String GROUP = "_default-group_"; public JobScheduler() throws Exception{ scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.start(); } public boolean schedule(String key,String cronExpression,JobExecutor executor){ try { CronScheduleBuilder sb = CronScheduleBuilder.cronSchedule(cronExpression); Trigger trigger = TriggerBuilder.newTrigger().withIdentity(key, GROUP).withSchedule(sb).build(); //如果任务已经在执行,则返回 if(scheduler.checkExists(trigger.getKey())){ return true; } Class<JobProxy> jobClass = JobProxy.class; JobDetail job = JobBuilder.newJob(jobClass).withIdentity(key, GROUP).build(); job.getJobDataMap().put(Utils.WORKER_ID, key); //for get job.getJobDataMap().put(Utils.WORKER_CALLER, executor); //for get scheduler.scheduleJob(job, trigger); // 任务调度列表 return true; } catch (Exception e) { e.printStackTrace(); } return false; } public boolean unschedule(String key){ try { TriggerKey tk = new TriggerKey(key, GROUP); if (scheduler.checkExists(tk)) { scheduler.unscheduleJob(tk); } return true; } catch (Exception e) { e.printStackTrace(); } return false; } }
并没有特别神秘的地方,只是借助了dataMap来保存JobDeTetail的实例.
相关推荐
在"Quartz.net作业调度自定义定时执行任务多任务执行c#"这个主题中,我们将深入探讨如何使用Quartz.NET来实现自定义的定时任务,以及如何处理多任务执行。 首先,我们需要理解Quartz.NET的基本概念。在Quartz.NET中...
Quartz是一款开源的作业调度框架,它允许开发者创建和安排任务执行。在Java应用程序中,Quartz能够帮助我们在特定的时间点或按照预设的周期执行某些功能,如数据收集、日志清理等。当我们需要终止某个正在运行的任务...
6. **监控与管理**:为了实现动态配置,我们需要对任务执行状态进行实时监控。Quartz提供了API接口和JMX支持,可以获取Job和Trigger的状态,以及进行暂停、恢复、删除等操作。 7. **持久化存储**:Quartz支持多种...
在这个例子中,`cronExpression`定义了任务的执行频率,`targetObject`和`targetMethod`指定了任务执行的具体对象和方法。 当遇到Spring定时器执行两次的问题时,可能的原因有以下几点: 1. **多实例问题**:如果...
3. **配置触发器**:使用`CronScheduleBuilder`可以方便地设置任务执行的时间规则。例如,每日定时执行一次: ```csharp IScheduler sched = new StdSchedulerFactory().GetScheduler(); JobDetailImpl jb1 = new ...
标题中的“spring2.0 Quartz 执行每天定时任务 普通普是执行任务”涉及到的是在Spring 2.0框架中使用Quartz库来创建并执行每天定时任务的场景。Quartz是一款强大的开源作业调度框架,它可以用来按计划执行各种任务,...
Java定时执行多任务是软件开发中的常见需求,用于在特定时间点或按固定频率执行某项操作,例如数据同步、日志清理等。Java提供了一些内置的定时工具,如`java.util.Timer`和`java.util.concurrent....
使用Spring Quartz执行定时任务
在实际项目中,有时我们需要判断一个Quartz任务是否正在运行,以便进行相应的操作,如避免重复执行或者进行状态监控。本文将详细介绍如何在Quartz中实现这一功能。 首先,理解Quartz的工作原理是关键。Quartz通过...
### quartz 动态执行定时任务 #### 背景与概念 在许多现代应用程序中,特别是在企业级应用中,往往需要实现对某些任务的周期性调度执行,例如定期备份数据库、定时发送邮件通知等。Quartz 是一个开源的作业调度...
在多应用服务器负载均衡环境下,Spring Quartz定时任务的重复执行问题是一个常见的挑战。Spring Quartz是一个强大的、开源的作业调度框架,允许开发者定义和执行复杂的定时任务。然而,当多个服务器实例并行运行时,...
System.out.println("定时任务执行:" + new Date()); // 在这里编写你的业务逻辑 } @Override public void execute(JobExecutionContext context) throws JobExecutionException { this.executeTask(); } }...
在“quartz 调用两次任务”这个问题中,我们可能遇到了一个常见问题,即同一个 Quartz 任务被错误地触发执行了两次。 在 Quartz 中,任务(Job)是通过实现 `org.quartz.Job` 接口的类来创建的,而调度则是通过 `...
总的来说,Quartz任务调度器与Spring的整合使得我们能够在应用中轻松地实现定时任务的管理,而无需关心任务执行的具体细节。它为开发者提供了一套强大的工具,帮助我们在项目中实现定时任务的自动化,提高系统的运行...
System.out.println("任务执行了"); } } ``` 然后,我们需要定义 Trigger,它是调度任务何时执行的规则。Quartz 提供了多种 Trigger 类型,如 SimpleTrigger(一次性执行)和 CronTrigger(基于 cron 表达式执行...
5. 日志文件或日志处理代码:用于记录任务执行情况和错误信息。 综上所述,通过ASP.NET结合Quartz.NET和TopShelf,我们可以构建一个强大且易于维护的定时任务调度系统,满足各种时间驱动业务的需求。无论是简单的...
在使用Quartz时,Log4j可以用来记录任务执行的详细信息,帮助我们了解任务执行状态和可能出现的问题。 `dom4j-1.6.jar`是一个用于XML处理的Java库,Quartz可能用它来解析配置文件,比如`quartz.properties`,该文件...
我们要实现定时执行某个方法时,就可以在job目录中加入自己的方法类,但要实现GCJobInterface接口,重写execute 方法即可
通过分析和实践,你可以掌握如何创建动态任务,如何根据业务需求调整任务执行策略,以及如何进行错误处理和监控。这将对你的Java开发事业,特别是在构建有定时任务需求的系统时,提供极大的帮助。
6. **日志记录**:任务执行过程中的信息会被记录下来,包括成功、失败、警告等,有助于进行问题追踪和分析。 7. **错误预警**:当任务出现异常时,系统可以发送预警通知,如邮件、短信等,及时提醒管理员处理。 8....