`

Quartz之JobListener

阅读更多
问题1:我想在一个任务执行后在执行第二个任务怎么办呢
Quartz:使用JobListener(任务监听器可实现)
下面示例中演示了相互传递,请参见注释
Job1Listener.java
public class Job1Listener implements JobListener {

    private static Logger _log = LoggerFactory.getLogger(Job1Listener.class);
    
    public String getName() {
        return "job1_to_job2";
    }

    public void jobToBeExecuted(JobExecutionContext inContext) {
    	//任务监听器执行任务1之前你可以选择的操作
        _log.error("Job1Listener says: Job Is about to be executed.");
        //向任务1传递数据
        inContext.getJobDetail().getJobDataMap().put("username", "天涯");
    }

    public void jobExecutionVetoed(JobExecutionContext inContext) {
        _log.error("Job1Listener says: Job Execution was vetoed.");
    }

    public void jobWasExecuted(JobExecutionContext inContext,JobExecutionException inException) {
        _log.error("Job1Listener says: Job was executed.");
        
        //执行任务2
        JobDetail job2 = newJob(SimpleJob2.class)
            .withIdentity("job2")
            .usingJobData("username", "david") //向任务2传递数据传递可成功接收
            .build();
        
        Trigger trigger = (SimpleTrigger) newTrigger() 
            .withIdentity("job2Trigger")
            .startNow()            
            .build();
        
        //向任务2传递数据,这里不知怎么回事,传递参数在任务2取值为: null
        inContext.getJobDetail().getJobDataMap().put("sex", "男");
        
        try {
            // schedule the job to run!
            inContext.getScheduler().scheduleJob(job2, trigger);
        } catch (SchedulerException e) {
            _log.error("出错了...");
            e.printStackTrace();
        }        
    }
}

ListenerExample.java
Quartz2个人感觉设计相当灵活,脱离了相互依赖,只需要添加监听器相关设置就行了
注意下面代码:
JobListener listener = new Job1Listener();
Matcher<JobKey> matcher = KeyMatcher.keyEquals(job.getKey());
  sched.getListenerManager().addJobListener(listener, matcher); 

这个任务1实现了监听器 joblistener,在这个 joblistener中有四个方法实现,在
public void jobWasExecuted(JobExecutionContext inContext,JobExecutionException inException) {
}

中去执行任务2的操作,以次类推的话,它可执行一个任务集合了
public void run() throws Exception {
    	
        Logger log = LoggerFactory.getLogger(ListenerExample.class);

        SchedulerFactory sf = new StdSchedulerFactory();
        Scheduler sched = sf.getScheduler();

        JobDetail job = newJob(SimpleJob1.class)
            .withIdentity("job1")
            .build();
        
        Trigger trigger = newTrigger() 
            .withIdentity("trigger1")
            .startNow()
            .build();

       
        JobListener listener = new Job1Listener();
        Matcher<JobKey> matcher = KeyMatcher.keyEquals(job.getKey());
        sched.getListenerManager().addJobListener(listener, matcher);    
      
        sched.scheduleJob(job, trigger);      
        sched.start();
      
        try {
          
            Thread.sleep(30L * 1000L);           
        } catch (Exception e) {
        	
        }        
    
        sched.shutdown(true);
        SchedulerMetaData metaData = sched.getMetaData();
        log.error("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");

    }

SimpleJob1.java
public class SimpleJob1 implements Job {

    private static Logger _log = LoggerFactory.getLogger(SimpleJob1.class);
   
    public SimpleJob1() {
    }

    public void execute(JobExecutionContext context)
        throws JobExecutionException {
        JobKey jobKey = context.getJobDetail().getKey();
        String userName = (String)context.getJobDetail().getJobDataMap().get("username");
        _log.error("SimpleJob1 says: " + jobKey + " executing at " + new Date() + ",姓名: " + userName);
    }
}

SimpleJob2.java
public class SimpleJob2 implements Job {

    private static Logger _log = LoggerFactory.getLogger(SimpleJob2.class);

   
    public SimpleJob2() {
    }

   
    public void execute(JobExecutionContext context)
        throws JobExecutionException {
      
        JobKey jobKey = context.getJobDetail().getKey();
        String userName = (String)context.getJobDetail().getJobDataMap().getString("username");
        String sex = (String)context.getJobDetail().getJobDataMap().getString("sex");
        _log.error("SimpleJob1 says: " + jobKey + " executing at " + new Date() + ",英文名: " + userName+",性别: " + sex);
    }

}

输出结果为:
[ERROR] 2011-08-12 03:56:44.750 下午 DefaultQuartzScheduler_Worker-1 [org.quartz.examples.example9.Job1Listener]
Job1Listener says: Job Is about to be executed.

[ERROR] 2011-08-12 03:56:44.765 下午 DefaultQuartzScheduler_Worker-1 [org.quartz.examples.example9.SimpleJob1]
SimpleJob1 says: DEFAULT.job1 executing at Fri Aug 12 15:56:44 CST 2011,姓名: 天涯

[ERROR] 2011-08-12 03:56:44.765 下午 DefaultQuartzScheduler_Worker-1 [org.quartz.examples.example9.Job1Listener]
Job1Listener says: Job was executed.

[ERROR] 2011-08-12 03:56:44.765 下午 DefaultQuartzScheduler_Worker-2 [org.quartz.examples.example9.SimpleJob2]
SimpleJob1 says: DEFAULT.job2 executing at Fri Aug 12 15:56:44 CST 2011,英文名: david,性别: null
分享到:
评论
4 楼 iotwlw 2015-08-13  
//向任务2传递数据,这里不知怎么回事,传递参数在任务2取值为: null 
        inContext.getJobDetail().getJobDataMap().put("sex", "男"); 


这句话是给任务一传参吧
3 楼 h416373073 2014-10-23  
非常感谢bz的分享
2 楼 liuzidong 2011-12-04  
谢谢您的指出, 我也是在学习呀
1 楼 kuro_0505 2011-12-03  
  inContext.getJobDetail().getJobDataMap().put("sex", "男");   这样传参是错误的,这样是全局的,不是放在job的dataMap上。

相关推荐

    Quartz2.2.1之JobListener、Triggerlistener、SchedulerListener实例使用

    Quartz2.2.1之JobListener、Triggerlistener、SchedulerListener实例使用,具体效果与过程看博文 http://blog.csdn.net/evankaka/article/details/45498363

    定时器quartz API文档

    9. **错误处理与回调**:Quartz提供异常处理机制,当Job执行抛出异常时,可以通过实现`org.quartz.JobListener`或`org.quartz.TriggerListener`接口来进行错误处理和回调。 10. **扩展性**:Quartz的灵活性使得它...

    Quartz(作业调度)

    6. **错误处理和日志**:在Quartz中,你可以监听Job的执行情况,通过实现`org.quartz.JobListener`接口,处理Job执行的异常。同时,Quartz内置了日志框架,方便记录任务执行的日志,便于调试和问题排查。 总的来说...

    quartz-all.zip

    为了处理作业执行过程中的异常,我们可以重写`Job.execute(JobExecutionContext context)`方法中的异常处理逻辑,或者配置全局的`org.quartz.JobListener`来监听所有作业的执行情况。 9. **作业执行上下文...

    spring的quartz使用实例

    可以通过实现`org.quartz.JobListener`接口,为Job添加错误处理逻辑。如果Job执行失败,可以通过调整Trigger重新安排执行。 9. **集群支持** Quartz支持集群部署,当在一个集群中配置多个Scheduler时,可以保证...

    Quartz帮助文档

    8. **监听器**:Quartz提供JobListener和TriggerListener,可以监听Job的执行和Trigger的触发事件。你可以使用这些监听器进行日志记录、统计分析或其他定制行为。 9. **并发控制**:Quartz支持并发执行限制,即同一...

    Quartz Job Scheduling Framework 中文版 chm版

    7. **监听器**:Quartz提供JobListener和TriggerListener,可以监控Job的执行状态和Trigger的触发情况,从而实现更精细的日志记录或异常处理。 8. **插件**:Quartz框架允许添加插件以扩展其功能,例如邮件通知插件...

    quartz-1.8.6.jar

    9. **异常处理**:可以通过实现`org.quartz.JobListener`和`org.quartz.TriggerListener`接口来监听Job的执行情况,进行异常处理。 10. **Job持久化**:为了在应用重启后还能恢复Job和Trigger,通常会配置Quartz...

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

    Quartz也提供了`JobListener`和`TriggerListener`,可以对Job的执行结果进行监控,实现定制化的错误处理逻辑。 9. **配置灵活性**:Quartz的配置非常灵活,可以通过XML、Java代码或API进行。这使得我们能够根据需求...

    SpringQuartz的使用文档

    5. `jobListenerNames`:用于指定应监听此任务的`JobListener`的名称。 例如,以下是一个配置`JobDetailBean`的示例: ```xml &lt;bean name="jobDetail" class="org.springframework.scheduling.quartz....

    quartz 定时任务调度

    Quartz提供了一些内置插件,如JobStore(用于存储作业和触发器)、TriggerListener(监听触发器状态变化)和JobListener(监听作业执行)。开发者也可以自定义插件,比如用于日志记录、性能监控或者任务调度策略调整...

    spring3整合quartz1.8和spring3整合quartz2.2两个版本示例

    5. **监听器**:Quartz 2.x 提供了更丰富的监听器功能,可以在 Spring 配置中添加 JobListener 和 TriggerListener。 6. **Cron 表达式**:在定义 Trigger 时,可以使用更灵活的 Cron 表达式,如 `@Scheduled(cron ...

    quartz需要的jar

    8. **监听器**:Quartz提供了JobListener和TriggerListener,可以监听Job和Trigger的生命周期事件,方便进行日志记录、统计分析等操作。 9. **版本兼容性**:不同的Quartz版本可能对Java版本和Spring等其他框架的...

    quartz 项目学习源码

    - 自定义插件扩展,如 JobListener 和 TriggerListener,实现更精细的日志记录和监控。 这个"quartz 项目学习源码"将带你逐步了解 Quartz 的内部机制,通过实际代码加深对 Quartz 的理解和应用。从 Job 和 Trigger...

    Java作业调度之Quartz

    Java作业调度之Quartz Quartz是开源的Java作业调度框架,它允许开发人员安排任务在特定的时间点运行。在企业级应用中,任务调度是一个关键功能,例如定时执行数据备份、发送邮件通知或者定期执行批处理任务。Quartz...

    人物调度Quartz 学习

    Quartz 是一个强大的任务调度框架,它允许开发者创建和安排任务执行,以便在特定时间自动触发。Quartz 的设计灵活性高,可以轻松地融入各种Java应用程序,包括独立应用、应用服务器和Servlet容器。以下是关于Quartz...

    Quartz.net作业调度自定义定时执行任务多任务执行c#

    7. **错误处理和监控**: 你可以设置监听器(`JobListener`和`TriggerListener`)来监控任务的执行状态,捕获异常并采取相应的措施。 在实际应用中,"WebApplication4"可能是你的项目名称,其中包含了实现上述功能的...

    quartz 2.2.2开发包(最新)

    7. **监听器**:Quartz提供了JobListener和TriggerListener,可以监听Job和Trigger的生命周期事件,进行相应的处理。 在`quartz-2.2.2`压缩包中,官方示例通常会包含以下内容: 1. **示例代码**:这些代码展示了...

    spring和quartz的定时器的启动和停止例子

    6. **异常处理**:为确保任务的健壮性,可以在Job类中捕获并处理异常,或者在Spring配置中定义JobListener,监听job的执行状态。 通过以上步骤,我们可以灵活地在Spring应用中使用Quartz实现定时任务的启动和停止。...

    Quartz 定时任务web使用

    - 使用Quartz的`SchedulerListener`和`JobListener`可以监听调度和任务执行的事件。 6. **源码分析** - 深入研究Quartz的源码,有助于理解其内部工作原理,如JobStore的实现(内存、数据库等)、调度算法等,这有...

Global site tag (gtag.js) - Google Analytics