zoukankan      html  css  js  c++  java
  • Quartz任务监听器

    在Quartz框架提供了JobListener接口,可在任务执行前、任务被拒绝及任务执行完成后实现对任务的拦截,该接口的声明如下:

    public interface JobListener {
    
    
        /**返回监听器名*/
        String getName();
    
        /**任务执行前对任务拦截*/
        void jobToBeExecuted(JobExecutionContext context);
        
        /**任务被否决对任务拦截*/
        void jobExecutionVetoed(JobExecutionContext context);
         
        /**任务执行完成对任务进行拦截*/
        void jobWasExecuted(JobExecutionContext context,JobExecutionException jobException);
    
    }

    下面简单实现了一个JobListener监听任务执行时间

    public class SimpleJobListener implements JobListener {
        
        private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        
        @Override
        public String getName() {
            return getClass().getSimpleName();
        }
    
        /**
         * 任务执行前被调用[任务执行加入任务提交时间]
         * */
        public void jobToBeExecuted(JobExecutionContext context) {
            String job = context.getJobDetail().getJobClass().getSimpleName();
            JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
            long start = System.currentTimeMillis();
            String date = SDF.format(new Date());
            jobDataMap.put("time", start);
            jobDataMap.put("date", date);
            System.out.println("[" + job + "]在[" + date + "]加入Quartz~~");
        }
    
        @Override
        public void jobExecutionVetoed(JobExecutionContext context) {
            String job = context.getJobDetail().getJobClass().getSimpleName();
            System.out.println("[" + job + "]在[" + SDF.format(new Date()) + "]被Quartz否决~~");
        }
    
        @Override
        public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {
            String job = context.getJobDetail().getJobClass().getSimpleName();
            JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
            long start = jobDataMap.getLong("time");
            String date = jobDataMap.getString("date");
            System.out.println("[" + job + "]在[" + date + "]添加,[" + SDF.format(new Date()) + 
                    "]执行完成,耗时[" + (System.currentTimeMillis() - start) + "] ms");
        }
    
    }

    任务执行前加入JobListener

    public class SchedulerDemo {
    
    	private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	
    	private static SchedulerFactory schedulerFactory ;
    	
    	static {
    		try {
    			Properties props = new Properties();
    			props.load(SchedulerDemo.class.getResourceAsStream("quartz.properties"));
    			schedulerFactory = new StdSchedulerFactory(props);
    		} catch (Exception e) {
    			System.out.println("[StdSchedulerFactory] init error");
    		}
    	}
    	
    	public static class HelloQuartzJob implements Job {
    
    		@Override
    		public void execute(JobExecutionContext context) throws JobExecutionException {
    			System.out.println("Hello Quartz! - executing its Job at [" + SDF.format(new Date()) + "] by [" + context.getTrigger().getDescription() + "]");
    		}
    		
    	}
    	
    	public String formatJobName(Trigger trigger , String name) {
    		return trigger.getClass().getSimpleName() + "_" + name + "_" + System.currentTimeMillis();
    	}
    	
    	public String formatTriggerName(Class<? extends Trigger> clazz) {
    		return clazz.getSimpleName() + "_" + System.currentTimeMillis();
    	}
    	
    	public void addJobListenerToJob(Scheduler scheduler, JobListener listener, Matcher<JobKey> matcher) throws Exception {
    		scheduler.getListenerManager().addJobListener(listener, matcher);
    	}
    	
    	/**
    	 * JobDetail的构造通过JobBuilder构建,JobBuilder在内部调用JobDetail的实现类JobDetailImpl
    	 * */
    	public void run(Trigger trigger) throws SchedulerException {
    		try {
    			Scheduler scheduler = schedulerFactory.getScheduler();
    			String jobName = formatJobName(trigger,"HelloQuartz");
    			String jobGroup = "demo";
    			JobDetail jobDetail = JobBuilder.newJob(HelloQuartzJob.class)
    											.withIdentity(jobName, jobGroup)
    											.build();
    			/**添加监听器*/
    			Matcher<JobKey> matcher = KeyMatcher.keyEquals(new JobKey(jobName,jobGroup));
    			addJobListenerToJob(scheduler, new SimpleJobListener(), matcher);
    			scheduler.scheduleJob(jobDetail, trigger);
    			scheduler.start();
    		} catch (Exception e) {
    			System.out.println("Quartz运行异常[" + e.getMessage() + "]");
    		}
    		
    	}
    	
    	/**
    	 * Trigger的构造通过TriggerBuilder创建
    	 * */
    	public Trigger getSimpleTrigger() {
    		SimpleTrigger simpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger()
    																	.withIdentity(formatTriggerName(SimpleTrigger.class), "demo")
    																	.withDescription("SimpleTrigger")
    																	.startNow()
    																	.withSchedule(SimpleScheduleBuilder.simpleSchedule()
    																									   .withIntervalInSeconds(10)
    																									   .withRepeatCount(5))
    																	.build();
    		return simpleTrigger;
    		
    	}
    	
    
    	public static void main(String []args) throws SchedulerException {
    		SchedulerDemo schedulerDemo = new SchedulerDemo();
    		schedulerDemo.run(schedulerDemo.getSimpleTrigger());
    	}
    	
    }
    

      

  • 相关阅读:
    spark的map和mapPartitions
    scala 语法速查
    spark 在yarn模式下提交作业
    spark的wordcount
    spark安装
    hadoop mapreduce求解有序TopN(高效模式)
    hadoop 自定义OutputFormat
    ONI无法启动: Uh oh! Unable to launch Neovim...
    Macbook外接显示器模糊解决方法
    macOS: sudo : Operation not permitted
  • 原文地址:https://www.cnblogs.com/hanfight/p/4803416.html
Copyright © 2011-2022 走看看