Quartz入门实例2-根据SimpleScheduleBuilder配置不同的SimpleTrigger触发器

Job代码:

package cn.zto.job;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SimpleJob
  implements Job
{
  public void execute(JobExecutionContext context)
    throws JobExecutionException
  {
	//通过上下文获取
    JobKey jobKey = context.getJobDetail().getKey();

    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");  
    System.out.println("SimpleJob类 :"+ jobKey + " 在 " + dateFormat.format(new Date())+" 时运行");
  }
}


SimpleTriggerExample.java

package cn.zto.app;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.DateBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;

import cn.zto.job.SimpleJob;

public class SimpleTriggerExample
{
  public void run()
    throws Exception
  {
    System.out.println("------- 初始化 -------------------");

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

    System.out.println("------- 初始化完成 --------");

    System.out.println("------- 向Scheduler加入Job ----------------");
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");  
    //设置任务触发的时间,时间为下方15的倍数  会在任意时间段的  15S 30S 45S 60S 开始会触发一次
    Date startTime = DateBuilder.nextGivenSecondDate(null, 15);

    JobDetail job = JobBuilder.newJob(SimpleJob.class).withIdentity("job1", "group1").build();

    SimpleTrigger trigger = (SimpleTrigger)TriggerBuilder.newTrigger()
    		.withIdentity("trigger1", "group1")
    		.startAt(startTime)
    		.build();
    
    Date ft = sched.scheduleJob(job, trigger);
    System.out.println(job.getKey() + " 将会在: " + dateFormat.format(ft) + "时运行,"
    		+ "重复: " + trigger.getRepeatCount() + " 次, " //获取重复的次数
    		+ "每 " + trigger.getRepeatInterval() / 1000L + " s 重复一次");

    job = JobBuilder.newJob(SimpleJob.class).withIdentity("job2", "group1").build();

    trigger = (SimpleTrigger)TriggerBuilder.newTrigger()
    		.withIdentity("trigger2", "group1")
    		.startAt(startTime)
    		//设置一个用于触发的时间
    		.withSchedule(SimpleScheduleBuilder//SimpleScheduleBuilder是简单调用触发器,它只能指定触发的间隔时间和执行次数;
	    				.simpleSchedule()//创建一个SimpleScheduleBuilder
	    				.withIntervalInSeconds(10)//指定一个重复间隔,以毫秒为单位。
	    				.withRepeatCount(10))//指定反复的次数
    		.build();

    ft = sched.scheduleJob(job, trigger);
    System.out.println(job.getKey() + " 将会在: " + dateFormat.format(ft) + "时运行,"
    		+ "重复: " + trigger.getRepeatCount() + " 次, "
    		+ "每 " + trigger.getRepeatInterval() / 1000L + " s 重复一次");

    trigger = (SimpleTrigger)TriggerBuilder.newTrigger()
    		//将触发器放入  group2 里面
    		.withIdentity("trigger2", "group2")
    		.startAt(startTime)
    		.withSchedule(SimpleScheduleBuilder
	    				.simpleSchedule()
	    				.withIntervalInSeconds(10)
	    				.withRepeatCount(2))
    		.forJob(job)
    		.build();

    ft = sched.scheduleJob(trigger);
    System.out.println(job.getKey() + " 也会在: " + dateFormat.format(ft) + "时运行,"
    		+ "重复: " + trigger.getRepeatCount() + " 次, "
    		+ "每 " + trigger.getRepeatInterval() / 1000L + " s 重复一次");

    job = JobBuilder.newJob(SimpleJob.class).withIdentity("job3", "group1").build();

    trigger = (SimpleTrigger)TriggerBuilder.newTrigger()
    		.withIdentity("trigger3", "group1")
    		.startAt(startTime)
    		.withSchedule(SimpleScheduleBuilder
    					.simpleSchedule()
    					.withIntervalInSeconds(10)
    					.withRepeatCount(5))
    		.build();

    ft = sched.scheduleJob(job, trigger);
    System.out.println(job.getKey() + " 将会在: " + dateFormat.format(ft) + "时运行,"
    		+ "重复: " + trigger.getRepeatCount() + " 次, "
    		+ "每 " + trigger.getRepeatInterval() / 1000L + " s 重复一次");

    job = JobBuilder.newJob(SimpleJob.class).withIdentity("job4", "group1").build();

    
    System.out.println("当前时间为:"+dateFormat.format(new Date()));
    trigger = (SimpleTrigger)TriggerBuilder.newTrigger()
    		.withIdentity("trigger4", "group1")
    		//设定时间为5分钟后运行
    		.startAt(DateBuilder.futureDate(5, DateBuilder.IntervalUnit.MINUTE))
    		.build();

    ft = sched.scheduleJob(job, trigger);
    System.out.println(job.getKey() + " 将会在: " + dateFormat.format(ft) + "时运行,"
    		+ "重复: " + trigger.getRepeatCount() + " 次, "
    		+ "每 " + trigger.getRepeatInterval() / 1000L + " s 重复一次");

    job = JobBuilder.newJob(SimpleJob.class).withIdentity("job5", "group1").build();

    trigger = (SimpleTrigger)TriggerBuilder.newTrigger()
    		.withIdentity("trigger5", "group1")
    		.startAt(startTime)
    		.withSchedule(SimpleScheduleBuilder
    					.simpleSchedule()
    					.withIntervalInSeconds(40)
    					//触发器会一直重复执行下去
    					.repeatForever())
    		.build();

    ft = sched.scheduleJob(job, trigger);
    System.out.println(job.getKey() + " 将会在: " + dateFormat.format(ft) + "时运行,"
    		+ "重复: " + trigger.getRepeatCount() + " 次, "
    		+ "每 " + trigger.getRepeatInterval() / 1000L + " s 重复一次");

    System.out.println("------- 开始Scheduler ----------------");

    sched.start();

    System.out.println("------- Scheduler调用job结束 -----------------");

    job = JobBuilder.newJob(SimpleJob.class).withIdentity("job6", "group1").build();

    trigger = (SimpleTrigger)TriggerBuilder.newTrigger()
    		.withIdentity("trigger6", "group1")
    		.startAt(startTime)
    		.withSchedule(SimpleScheduleBuilder
    					.simpleSchedule()
    					.withIntervalInMinutes(1)
    					.withRepeatCount(20))
    		.build();

    ft = sched.scheduleJob(job, trigger);
    System.out.println(job.getKey() + " 将会在: " + dateFormat.format(ft) + "时运行,"
    		+ "重复: " + trigger.getRepeatCount() + " 次, "
    		+ "每 " + trigger.getRepeatInterval() / 1000L + " s 重复一次");

    job = JobBuilder.newJob(SimpleJob.class).withIdentity("job7", "group1")
    		.storeDurably()//该job没有触发器,该方法将durability设置为true
    		.build();
    //添加一个没有出发器的job
    sched.addJob(job, true);

    System.out.println("手动触发job7...");
    //jobKey用来唯一的标识一个JobDetail
    //执行Job
    sched.triggerJob(JobKey.jobKey("job7", "group1"));

    System.out.println("------- 等待10S... --------------");
    try
    {
      Thread.sleep(10000L);
    }
    catch (Exception e)
    {
    }

    System.out.println("------- 改变触发器6 --------------------");
    trigger = (SimpleTrigger)TriggerBuilder.newTrigger()
    		.withIdentity("trigger10", "group1")
    		.startAt(startTime)
    		.withSchedule(SimpleScheduleBuilder
    				.simpleSchedule()
    				.withIntervalInMinutes(1)
    				.withRepeatCount(20))
    		.build();
    //根据触发器获取指定的Job然后更改此Job的触发器
    //新的触发器不需要旧的触发器的名称相同
    ft = sched.rescheduleJob(new TriggerKey("trigger6","group1")//获取TriggerKey(用来标识唯一的Trigger)
    		, trigger);
    System.out.println("job6 重新在 " + dateFormat.format(ft)+ "时运行 ,"
    		+ "重复: " + trigger.getRepeatCount() + " 次, "
    		+ "每 " + trigger.getRepeatInterval() / 1000L + " s 重复一次");

    System.out.println("------- 等待5分钟... ------------");
    try
    {
      Thread.sleep(300000L);
    }
    catch (Exception e)
    {
    }

    System.out.println("------- 关闭Scheduler ---------------------");

    sched.shutdown(true);

    System.out.println("------- 关闭完成 -----------------");

    SchedulerMetaData metaData = sched.getMetaData();
    System.out.println("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");
  }

  public static void main(String[] args)
    throws Exception
  {
    SimpleTriggerExample example = new SimpleTriggerExample();
    example.run();
  }
}


运行结果:

------- 初始化 -------------------
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
------- 初始化完成 --------
------- 向Scheduler加入Job ----------------
group1.job1 将会在: 2014年07月31日 13时51分45秒时运行,重复: 0 次, 每 0 s 重复一次
group1.job2 将会在: 2014年07月31日 13时51分45秒时运行,重复: 10 次, 每 10 s 重复一次
group1.job2 也会在: 2014年07月31日 13时51分45秒时运行,重复: 2 次, 每 10 s 重复一次
group1.job3 将会在: 2014年07月31日 13时51分45秒时运行,重复: 5 次, 每 10 s 重复一次
当前时间为:2014年07月31日 13时51分41秒
group1.job4 将会在: 2014年07月31日 13时56分41秒时运行,重复: 0 次, 每 0 s 重复一次
group1.job5 将会在: 2014年07月31日 13时51分45秒时运行,重复: -1 次, 每 40 s 重复一次
------- 开始Scheduler ----------------
------- Scheduler调用job结束 -----------------
group1.job6 将会在: 2014年07月31日 13时51分45秒时运行,重复: 20 次, 每 60 s 重复一次
手动触发job7...
------- 等待10S... --------------
SimpleJob类 :group1.job7 在 2014年07月31日 13时51分41秒 时运行
SimpleJob类 :group1.job1 在 2014年07月31日 13时51分45秒 时运行
SimpleJob类 :group1.job2 在 2014年07月31日 13时51分45秒 时运行
SimpleJob类 :group1.job3 在 2014年07月31日 13时51分45秒 时运行
SimpleJob类 :group1.job5 在 2014年07月31日 13时51分45秒 时运行
SimpleJob类 :group1.job6 在 2014年07月31日 13时51分45秒 时运行
SimpleJob类 :group1.job2 在 2014年07月31日 13时51分45秒 时运行
------- 改变触发器6 --------------------
job6 重新在 2014年07月31日 13时51分45秒时运行 ,重复: 20 次, 每 60 s 重复一次
------- 等待5分钟... ------------
SimpleJob类 :group1.job6 在 2014年07月31日 13时51分51秒 时运行
SimpleJob类 :group1.job2 在 2014年07月31日 13时51分55秒 时运行
SimpleJob类 :group1.job3 在 2014年07月31日 13时51分55秒 时运行
SimpleJob类 :group1.job2 在 2014年07月31日 13时51分55秒 时运行
SimpleJob类 :group1.job2 在 2014年07月31日 13时52分05秒 时运行
SimpleJob类 :group1.job3 在 2014年07月31日 13时52分05秒 时运行
SimpleJob类 :group1.job2 在 2014年07月31日 13时52分05秒 时运行
SimpleJob类 :group1.job2 在 2014年07月31日 13时52分15秒 时运行
SimpleJob类 :group1.job3 在 2014年07月31日 13时52分15秒 时运行
SimpleJob类 :group1.job2 在 2014年07月31日 13时52分25秒 时运行
SimpleJob类 :group1.job3 在 2014年07月31日 13时52分25秒 时运行
SimpleJob类 :group1.job5 在 2014年07月31日 13时52分25秒 时运行
SimpleJob类 :group1.job2 在 2014年07月31日 13时52分35秒 时运行
SimpleJob类 :group1.job3 在 2014年07月31日 13时52分35秒 时运行
SimpleJob类 :group1.job6 在 2014年07月31日 13时52分45秒 时运行
SimpleJob类 :group1.job2 在 2014年07月31日 13时52分45秒 时运行
SimpleJob类 :group1.job2 在 2014年07月31日 13时52分55秒 时运行
SimpleJob类 :group1.job2 在 2014年07月31日 13时53分05秒 时运行
SimpleJob类 :group1.job5 在 2014年07月31日 13时53分05秒 时运行
SimpleJob类 :group1.job2 在 2014年07月31日 13时53分15秒 时运行
SimpleJob类 :group1.job2 在 2014年07月31日 13时53分25秒 时运行
SimpleJob类 :group1.job6 在 2014年07月31日 13时53分45秒 时运行
SimpleJob类 :group1.job5 在 2014年07月31日 13时53分45秒 时运行
SimpleJob类 :group1.job5 在 2014年07月31日 13时54分25秒 时运行
SimpleJob类 :group1.job6 在 2014年07月31日 13时54分45秒 时运行
SimpleJob类 :group1.job5 在 2014年07月31日 13时55分05秒 时运行
SimpleJob类 :group1.job6 在 2014年07月31日 13时55分45秒 时运行
SimpleJob类 :group1.job5 在 2014年07月31日 13时55分45秒 时运行
SimpleJob类 :group1.job5 在 2014年07月31日 13时56分25秒 时运行
SimpleJob类 :group1.job4 在 2014年07月31日 13时56分41秒 时运行
SimpleJob类 :group1.job6 在 2014年07月31日 13时56分45秒 时运行
------- 关闭Scheduler ---------------------
------- 关闭完成 -----------------
Executed 38 jobs.



  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码定义了一个 `toString()` 方法,返回一个字符串,其包含了当前对象的各个属性值,并按照一定的协议格式进行了拼接。 具体解释如下: 1. 创建一个 StringBuilder 对象 `builder` ,用于存储生成的字符串。 ```java StringBuilder builder = new StringBuilder(); ``` 2. 在 `builder` 中添加协议头部信息。 ```java builder.append(PROTOCOL_HEADER); ``` 3. 将当前对象中的 `frameNumber` 属性值拼接到 `builder` 中,并在其后添加协议分隔符。 ```java builder.append(frameNumber).append(PROTOCOL_SEPARATOR); ``` 4. 将当前对象中的 `systemState` 属性值拼接到 `builder` 中,并在其后添加协议分隔符。 ```java builder.append(systemState).append(PROTOCOL_SEPARATOR); ``` 5. 将当前对象中的 `northProgress` 属性值拼接到 `builder` 中,并在其后添加协议分隔符。 ```java builder.append(northProgress).append(PROTOCOL_SEPARATOR); ``` 6. 将当前对象中的 `headingAngle` 属性值拼接到 `builder` 中,并在其后添加协议分隔符。 ```java builder.append(headingAngle).append(PROTOCOL_SEPARATOR); ``` 7. 将当前对象中的 `pitchAngle` 属性值拼接到 `builder` 中,并在其后添加协议分隔符。 ```java builder.append(pitchAngle).append(PROTOCOL_SEPARATOR); ``` 8. 将当前对象中的 `rollAngle` 属性值拼接到 `builder` 中,并在其后添加协议分隔符。 ```java builder.append(rollAngle).append(PROTOCOL_SEPARATOR); ``` 9. 将当前对象中的 `realTimeData` 属性值拼接到 `builder` 中,并在其后添加协议换行符。 ```java builder.append(realTimeData).append(PROTOCOL_NEWLINE); ``` 10. 返回 `builder` 对象中拼接好的字符串。 ```java return builder.toString(); ``` 以上就是每一句代码的具体解释。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值