quartz 每月一次_入门Java开源任务调度框架-Quartz(后篇)

论坛 期权论坛     
选择匿名的用户   2021-5-22 14:50   139   0
<div>
<p></p>
<div style="text-align:center;">
  <img alt="84d0cf770d82d442b7af735ea7d8dc30.png" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-a38e9b4b1cf51268b31801eb73379a0f.png">
</div>
<h2>1) 读前须知</h2>
<p>本文是《入门Java开源任务调度框架-Quartz(前篇)》的后续文章,是对前篇的补充,请结合前篇阅读!</p>
<h2>2)关于JobDataMap数据获取的补充</h2>
<p>在前篇中,我们讲述了<code>JobDataMap</code>的数据获取方式,尽管后面通过使用<code>getMergeJobDataMap</code>方法使得数据获取简单了很多,但是我们还有另一种选择,那就是在<code>Job</code>的实现类中定义对应于<code>JobDetail</code>和<code>Trigger</code>中<code>JobDataMap</code>的键名的字段,并且提供对应的setXXX方法。这里为了简化代码我们使用lombok生成get和set方法,先在pom文件中引入lombok(你也可以手动生成方法):</p>
<div class="blockcode">
  <pre class="blockcode"><code>&lt;dependency&gt;
            &lt;groupId&gt;org.projectlombok&lt;/groupId&gt;
            &lt;artifactId&gt;lombok&lt;/artifactId&gt;
            &lt;version&gt;1.18.12&lt;/version&gt;
        &lt;/dependency&gt;</code></pre>
</div>
<p><b>!使用lombok前记得先在Idea中安装lombok插件支持,同时开启到设置中开启lombok注解支持!</b></p>
<p>然后<code>QuartzJob</code>做如下改变即可,运行结果和之前是一致的。</p>
<div class="blockcode">
  <pre class="blockcode"><code>&#64;Data // 生成get和set方法
&#64;Slf4j // 使用lombok自动获取日志对象log
public class QuartzJob implements Job {<!-- -->
    private String message;
    private Integer number;
    public void execute(JobExecutionContext jobExecutionContext)
            throws JobExecutionException {<!-- -->
        log.info(message);
        log.info(number);
    }
}</code></pre>
</div>
<h2>3)SimpleTrigger触发器</h2>
<p>之前我们简单通过<code>TriggerBuilder</code>创建了一个<code>SimpleTrigger</code>,通过查看<code>TriggerBuilder</code>的代码我们可以知道更多属性设置:</p>
<div class="blockcode">
  <pre class="blockcode"><code>public class TriggerBuilder&lt;T extends Trigger&gt; {<!-- -->
    private TriggerKey key;  // 前面介绍过
    private String description;  // Trigger的描述
    private Date startTime &#61; new Date();  // 任务开始时间,不设置默认立即开始
    private Date endTime; // 结束时间
    private int priority &#61; Trigger.DEFAULT_PRIORITY; // 任务优先级
    private String calendarName;  // 日历名称
    private JobKey jobKey;  // 前面介绍过
    private JobDataMap jobDataMap &#61; new JobDataMap(); // 用于携带数据

    private ScheduleBuilder&lt;?&gt; scheduleBuilder &#61; null; // 调度规则
}</code></pre>
</div>
<p>基本上通过名称我们也能知道大概怎么使用,这里就不给出示例了。</p>
<p>下面来看最重要的调度规则的构建器,我们创建<code>SimpleTrigger</code>的时候使用的是<code>SimpleSchedulerBuilder</code>:</p>
<div class="blockcode">
  <pre class="blockcode"><code>public class SimpleScheduleBuilder extends ScheduleBuilder&lt;SimpleTrigger&gt; {<!-- -->
    private long interval &#61; 0; // 执行的时间间隔
    private int repeatCount &#61; 0; // 任务执行的次数
    private int misfireInstruction &#61; SimpleTrigger.MISFIRE_INSTRUCTION_SMART_POLICY; // 任务未正常执行时的处理策略
}</code></pre>
</div>
<p><code>SimpleSchedulerBuilder</code>使用静态方法返回实例,相关的设置方法基本都以with、repeat开头,知道了属性的含义之后调用也是很简单了。</p>
<p>最后关于<code>TriggerBuilder</code>和<code>SimpleSchedulerBuilder</code>还有需要注意的地方:</p>
<ul><li>重复的次数可以是0到<code>SimpleTrigger.REPEAT_INDEFINITELY</code></li><li>重复的执行间隔必须是大于等于0的正整数</li><li>如果指定了<code>endTime</code>参数,则重复执行的参数会被覆盖。</li></ul>
<h2>4)CronTrigger触发器</h2>
<p>接下来介绍另一个使用频度很高的触发器<code>CronTrigger</code>,它是基于日历(<code>Calendar</code>)的,不用像<code>SimpleTrigger</code>那样精确指定调度的<b>时间间隔</b>和<b>执行次数</b>,而是通过cron表达式描述运行规则,所以要想使用<code>CronTrigger</code>,我们还得知道cron表达式是什么?怎么表示?。</p>
<h3>4.1)什么是corn表达式</h3>
<p>cron表达式广泛应用于Linux和Unix系统中,cron表达式被分成了7段,分别对应【秒】【分】【时】【日】【月】【周】【年】,每段用<b>英文半角空格隔开</b>,每段的编写规则如表所示:</p>
<p></p>
<div style="text-align:center;">
  <img alt="fd9de53cbd4a66c38fa6d64c18b0bfc3.png" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-6fef0edfe8702eca1c16b417a16992e6.png">
</div>
<p>下面对表中出现的一些特殊字符进行解释:</p>
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP