`
QING____
  • 浏览: 2250731 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Quartz任务执行

    博客分类:
  • JAVA
 
阅读更多

    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作业调度自定义定时执行任务多任务执行c#"这个主题中,我们将深入探讨如何使用Quartz.NET来实现自定义的定时任务,以及如何处理多任务执行。 首先,我们需要理解Quartz.NET的基本概念。在Quartz.NET中...

    Quartz调度、终止执行的任务

    Quartz是一款开源的作业调度框架,它允许开发者创建和安排任务执行。在Java应用程序中,Quartz能够帮助我们在特定的时间点或按照预设的周期执行某些功能,如数据收集、日志清理等。当我们需要终止某个正在运行的任务...

    定时任务quartz实现分组串行并行动态配置

    6. **监控与管理**:为了实现动态配置,我们需要对任务执行状态进行实时监控。Quartz提供了API接口和JMX支持,可以获取Job和Trigger的状态,以及进行暂停、恢复、删除等操作。 7. **持久化存储**:Quartz支持多种...

    spring java 定时器 执行两次 quartz

    在这个例子中,`cronExpression`定义了任务的执行频率,`targetObject`和`targetMethod`指定了任务执行的具体对象和方法。 当遇到Spring定时器执行两次的问题时,可能的原因有以下几点: 1. **多实例问题**:如果...

    C# Quartz.Net定时任务操作明细、完整过程

    3. **配置触发器**:使用`CronScheduleBuilder`可以方便地设置任务执行的时间规则。例如,每日定时执行一次: ```csharp IScheduler sched = new StdSchedulerFactory().GetScheduler(); JobDetailImpl jb1 = new ...

    spring2.0 Quartz 执行每天定时任务 普通普是执行任务

    标题中的“spring2.0 Quartz 执行每天定时任务 普通普是执行任务”涉及到的是在Spring 2.0框架中使用Quartz库来创建并执行每天定时任务的场景。Quartz是一款强大的开源作业调度框架,它可以用来按计划执行各种任务,...

    java定时执行多任务和quartz定时执行多任务

    Java定时执行多任务是软件开发中的常见需求,用于在特定时间点或按固定频率执行某项操作,例如数据同步、日志清理等。Java提供了一些内置的定时工具,如`java.util.Timer`和`java.util.concurrent....

    Spring Quartz执行定时任务.

    使用Spring Quartz执行定时任务

    Quartz如何实现判断某个任务是否正在运行,在项目中用到的,已经测试过了

    在实际项目中,有时我们需要判断一个Quartz任务是否正在运行,以便进行相应的操作,如避免重复执行或者进行状态监控。本文将详细介绍如何在Quartz中实现这一功能。 首先,理解Quartz的工作原理是关键。Quartz通过...

    quartz 动态执行定时任务

    ### quartz 动态执行定时任务 #### 背景与概念 在许多现代应用程序中,特别是在企业级应用中,往往需要实现对某些任务的周期性调度执行,例如定期备份数据库、定时发送邮件通知等。Quartz 是一个开源的作业调度...

    完美解决多应用服务器负载均衡环境下spring quartz同一定时任务重复执行问题

    在多应用服务器负载均衡环境下,Spring Quartz定时任务的重复执行问题是一个常见的挑战。Spring Quartz是一个强大的、开源的作业调度框架,允许开发者定义和执行复杂的定时任务。然而,当多个服务器实例并行运行时,...

    spring注解Quartz定时执行功能

    System.out.println("定时任务执行:" + new Date()); // 在这里编写你的业务逻辑 } @Override public void execute(JobExecutionContext context) throws JobExecutionException { this.executeTask(); } }...

    quartz 调用两次任务

    在“quartz 调用两次任务”这个问题中,我们可能遇到了一个常见问题,即同一个 Quartz 任务被错误地触发执行了两次。 在 Quartz 中,任务(Job)是通过实现 `org.quartz.Job` 接口的类来创建的,而调度则是通过 `...

    Quartz任务调度器

    总的来说,Quartz任务调度器与Spring的整合使得我们能够在应用中轻松地实现定时任务的管理,而无需关心任务执行的具体细节。它为开发者提供了一套强大的工具,帮助我们在项目中实现定时任务的自动化,提高系统的运行...

    quartz 实现按天、按周、按月定时任务的简单demo

    System.out.println("任务执行了"); } } ``` 然后,我们需要定义 Trigger,它是调度任务何时执行的规则。Quartz 提供了多种 Trigger 类型,如 SimpleTrigger(一次性执行)和 CronTrigger(基于 cron 表达式执行...

    ASP.NET使用Quartz.NET实现定时任务调度

    5. 日志文件或日志处理代码:用于记录任务执行情况和错误信息。 综上所述,通过ASP.NET结合Quartz.NET和TopShelf,我们可以构建一个强大且易于维护的定时任务调度系统,满足各种时间驱动业务的需求。无论是简单的...

    使用Quartz执行定时任务

    在使用Quartz时,Log4j可以用来记录任务执行的详细信息,帮助我们了解任务执行状态和可能出现的问题。 `dom4j-1.6.jar`是一个用于XML处理的Java库,Quartz可能用它来解析配置文件,比如`quartz.properties`,该文件...

    quartz自动执行一定时

    我们要实现定时执行某个方法时,就可以在job目录中加入自己的方法类,但要实现GCJobInterface接口,重写execute 方法即可

    quartz动态任务管理

    通过分析和实践,你可以掌握如何创建动态任务,如何根据业务需求调整任务执行策略,以及如何进行错误处理和监控。这将对你的Java开发事业,特别是在构建有定时任务需求的系统时,提供极大的帮助。

    .net Quartz 任务调度平台源码

    6. **日志记录**:任务执行过程中的信息会被记录下来,包括成功、失败、警告等,有助于进行问题追踪和分析。 7. **错误预警**:当任务出现异常时,系统可以发送预警通知,如邮件、短信等,及时提醒管理员处理。 8....

Global site tag (gtag.js) - Google Analytics