package com.leo;

import java.text.ParseException;
import java.util.Date;

import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;

import com.leo.services.MyJob;

public class TestQuartz {
	
	/**
	 * 1.8.6版本
	 * @param time
	 * @throws SchedulerException
	 * @throws InterruptedException
	 * @throws ParseException
	 */
	public void runJob(String time,String i) throws SchedulerException, InterruptedException, ParseException {
		// 首先，必需要取得一个Scheduler的引用
		SchedulerFactory sf = new StdSchedulerFactory();
		Scheduler scheduler = sf.getScheduler();
		//第一个是任务的名称，第二个是组名，第三个就是实际当任务需要执行的回调类。  
		//JobBuilder无构造函数，所以只能通过JobBuilder的静态方法newJob(Class<? extends Job> jobClass)生成JobBuilder实例  
        //withIdentity(String name,String group)参数用来定义jobKey，如果不设置，也会自动生成一个独一无二的jobKey用来区分不同的job 
		JobDetail jobDetail =new JobDetail("job"+i, "group1",MyJob.class);
		// 触发器  
        CronTrigger trigger = new CronTrigger("trigger"+i, "group1");// 触发器名,触发器组  
        trigger.setCronExpression(time);// 触发器时间设定  
		
        Date date = trigger.getNextFireTime();
        System.out.println("next time:"+date);
		//use TriggerBuilder to instantiate an actual Trigger  
        //withIdentity(String name,String group)参数用来定义TriggerKey，如果不设置，也会自动生成一个独一无二的TriggerKey用来区分不同的trigger  

        // Tell quartz to schedule the job using our trigger  
        scheduler.scheduleJob(jobDetail, trigger);  
          
        // Start up the scheduler  
        scheduler.start(); 
        
        
		// 当前主线程睡眠2秒
//		System.out.println(Thread.currentThread().getName());
//		Thread.sleep(5 * 1000);
//		System.out.println("shut down");
		
//		scheduler.pauseTrigger("job1", "group1");// 停止触发器  
//		scheduler.unscheduleJob("job1", "group1");// 移除触发器
//		scheduler.deleteJob("job1", "group1");// 删除任务
//		trigger.setCronExpression("0/5 * * * * ?");// 触发器时间设定  
		// 重启触发器  
//        scheduler.resumeTrigger("trigger1", "group1");  
//        // 启动  
//        if (!scheduler.isShutdown()){  
//        	scheduler.start();  
//        }  
	}

	/**
	 * 
	 * @param time
	 * @throws SchedulerException 
	 * @throws InterruptedException 
	 */
	/*public void runJob2(String time) throws SchedulerException, InterruptedException{
		// 首先，必需要取得一个Scheduler的引用
		SchedulerFactory sf = new StdSchedulerFactory();
		Scheduler sched = sf.getScheduler();
		// 创建作业  
		JobKey jobKey = new JobKey("templateJob" , "template");
        JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity(jobKey).build();  
//      定义调度触发规则  
//      简单的时间，使用simpleTrigger规则  间隔1s重复8次
//		Trigger trigger = TriggerBuilder
//				.newTrigger()
//				.withIdentity("simpleTrigger", "triggerGroup")
//				.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1).withRepeatCount(8))
//				.forJob(jobDetail).startNow().build();
//      复杂的时间，使用cornTrigger规则  每天10点42分  
		Trigger trigger = TriggerBuilder
				.newTrigger()
				.withIdentity("cronTrigger", "triggerGroup")
				.withSchedule(CronScheduleBuilder.cronSchedule(time))
				.startNow().build();

		// 把作业和触发器注册到任务调度中
		sched.scheduleJob(jobDetail, trigger);
		// 启动调度
		sched.start();
		// 当前主线程睡眠2秒
		System.out.println(Thread.currentThread().getName());
		Thread.sleep(3 * 1000);
		System.out.println("shut down");
		sched.shutdown();
		// 启动  
        if (sched.isShutdown()){  
        	sched = sf.getScheduler();
        	sched.scheduleJob(jobDetail, trigger);
        	sched.start();  
        	System.out.println("restart");
        }  
	}*/
	/**
     * main(这里用一句话描述这个方法的作用)
     * 
     * @param args
     */
    public static void main(String[] args) {
    	
    	TestQuartz q = new TestQuartz();
			try {
				System.out.println(new Date());
				q.runJob("0/5 * * * /* ?","1");
			} catch (Exception e) {
				e.printStackTrace();
			} 
    }
    
    public void cc(){
    	/*对于CornExpress讲解如下： 
    	字段   允许值   允许的特殊字符    
    	秒    0-59    , - * /    
    	分    0-59    , - * /    
    	小时    0-23    , - * /    
    	日期    1-31    , - * ? / L W C    
    	月份    1-12 或者 JAN-DEC    , - * /    
    	星期    1-7 或者 SUN-SAT    , - * ? / L C #    
    	年（可选）    留空, 1970-2099    , - * /    
    	  
    	表达式   意义    
    	"0 0 12 * * ?"    每天中午12点触发    
    	"0 15 10 ? * *"    每天上午10:15触发    
    	"0 15 10 * * ?"    每天上午10:15触发    
    	"0 15 10 * * ? *"    每天上午10:15触发    
    	"0 15 10 * * ? 2005"    2005年的每天上午10:15触发    
    	"0 * 14 * * ?"    在每天下午2点到下午2:59期间的每1分钟触发    
    	"0 0/5 14 * * ?"    在每天下午2点到下午2:55期间的每5分钟触发     
    	"0 0/5 14,18 * * ?"    在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发     
    	"0 0-5 14 * * ?"    在每天下午2点到下午2:05期间的每1分钟触发    
    	"0 10,44 14 ? 3 WED"    每年三月的星期三的下午2:10和2:44触发    
    	"0 15 10 ? * MON-FRI"    周一至周五的上午10:15触发    
    	"0 15 10 15 * ?"    每月15日上午10:15触发    
    	"0 15 10 L * ?"    每月最后一日的上午10:15触发    
    	"0 15 10 ? * 6L"    每月的最后一个星期五上午10:15触发      
    	"0 15 10 ? * 6L 2002-2005"    2002年至2005年的每月的最后一个星期五上午10:15触发    
    	"0 15 10 ? * 6#3"    每月的第三个星期五上午10:15触发     
    	  
    	特殊字符   意义    
    	*    表示所有值；    
    	?    表示未说明的值，即不关心它为何值；    
    	-    表示一个指定的范围；    
    	,    表示附加一个可能值；    
    	/    符号前表示开始时间，符号后表示每次递增的值；    
    	L("last")    ("last") "L" 用在day-of-month字段意思是 "这个月最后一天"；用在 day-of-week字段, 它简单意思是 "7" or "SAT"。 如果在day-of-week字段里和数字联合使用，它的意思就是 "这个月的最后一个星期几" – 例如： "6L" means "这个月的最后一个星期五". 当我们用“L”时，不指明一个列表值或者范围是很重要的，不然的话，我们会得到一些意想不到的结果。    
    	W("weekday")    只能用在day-of-month字段。用来描叙最接近指定天的工作日（周一到周五）。例如：在day-of-month字段用“15W”指“最接近这个月第15天的工作日”，即如果这个月第15天是周六，那么触发器将会在这个月第14天即周五触发；如果这个月第15天是周日，那么触发器将会在这个月第16天即周一触发；如果这个月第15天是周二，那么就在触发器这天触发。注意一点：这个用法只会在当前月计算值，不会越过当前月。“W”字符仅能在day-of-month指明一天，不能是一个范围或列表。也可以用“LW”来指定这个月的最后一个工作日。     
    	#    只能用在day-of-week字段。用来指定这个月的第几个周几。例：在day-of-week字段用"6#3"指这个月第3个周五（6指周五，3指第3个）。如果指定的日期不存在，触发器就不会触发。     
    	C    指和calendar联系后计算过的值。例：在day-of-month 字段用“5C”指在这个月第5天或之后包括calendar的第一天；在day-of-week字段用“1C”指在这周日或之后包括calendar的第一天  
    	*/
    }

}
