Quartz 实现定时任务调度

作者: Ivon_Ma | 来源:发表于2017-08-04 20:26 被阅读75次

    1.需求

    • 生日祝福短信
    • 信用卡催还款
    • 邮箱生日祝福
    • ….

    2.什么是Quartz

    Quartz是一个开源的作业调用框架,完全由Java编写,可用于J2SE和J2EE应用。它提供了巨大的灵活性而不牺牲简单性。可以为执行一个作业而创建简单或复杂的调度。

    3.快速入门

    Maven坐标

    <dependency>
      <groupId>org.quartz-scheduler</groupId>
      <artifactId>quartz</artifactId>
      <version>2.2.1</version>
    </dependency>
    

    核心类:

    Job:自定义

    ​ 在类编写需要执行的内容。类名与回调函数名都可以自定义。

    JobDetail:MethodInvokingJobDetailFactoryBean

    ​ 定义调用哪个任务的哪个方法

    Trigger:CronTriggerFactoryBean

    ​ 代表一个调度参数的配置

    Scheduler:SchedulerFactoryBean

    ​ 程序的入口。代表一个调度容器,其中可以注册多个JobDetail和Trigger。当两者组合,就可以被Scheduler容器调度了。

    配置:以Spring环境为例

    <!-- 1 定义一个任务类 :job-->
        <bean id="jobBean" class="cn.itcast.jx.quartz.JobTest"></bean>
        <!-- 2 任务类描述 -->
        <bean id="jobDetails" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
            <!-- 定义目标对象 -->
            <property name="targetObject" ref="jobBean"></property>
            <!-- 定义目标方法 -->
            <property name="targetMethod" value="execute"></property>
        </bean>
        <!-- 3 触发器  -->
        <bean id="jobTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
            <!-- 执行哪个任务 -->
            <property name="jobDetail" ref="jobDetails"></property>
            <!-- 定义何时执行execute方法。注意:value为cron表达式,下述意为每10秒执行一次 -->
            <property name="cronExpression" value="0/10 * * * * ?"></property>
        </bean>
        <!-- 4 总调度容器:Quartz执行的入口 -->
        <bean id="startQuartz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
            <property name="triggers">
                <list>
                    <ref bean="jobTrigger"/>
                    <!-- 配置多个触发器 -->
                </list>
            </property>
        </bean>
    
    • 如果有多个任务类,则配置多个jobBean,jobDetails及jobTrigger,并在调度容器中依次使用<ref>标签进行配置。

    简单实现:Job自定义任务类

    public class JobTest {
        public void execute(){
            System.out.println("执行了调度:"+new Date());
        }
    }
    

    关于CRON表达式

    从左至右,支持 秒分时日月周年 七个域,域之间由空格分开

    具体使用介绍可参见:http://www.cnblogs.com/junrong624/p/4239517.html

    4.应用案例:

    需求:对当天船期到期的厂家发送提醒邮件

    package cn.itcast.jx.quartz;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.List;
    
    import cn.itcast.jx.domain.Contract;
    import cn.itcast.jx.service.ContractService;
    import cn.itcast.jx.util.MailUtil;
    public class ShipTimeJob {
        private ContractService contractService;
        public void setContractService(ContractService contractService) {
            this.contractService = contractService;
        }
        //发送电子邮件
        public void sendMail(){
            //1 查询今天船期到期的订单
            //写法一
            //String hql = "from Contract where to_char(shipTime,'yyyy-mm-dd') = to_char(sysdate,'yyyy-mm-dd')";
            //List<Contract> list = contractService.find(hql, Contract.class, null);
            //写法二:注意SimpleDateFormat中有大小写区分,MM代表月,mm代表分钟
            String time =new SimpleDateFormat("yyyy-MM-dd").format(new Date()); 
            String hql = "from Contract where to_char(shipTime,'yyyy-mm-dd')=?";
            List<Contract> list = contractService.find(hql, Contract.class, new String[]{time});
            //2 遍历到期订单,给厂家发送电子邮件
            for(final Contract c:list){
                new Thread(new Runnable() {         
                    @Override
                    public void run() {
                        try {
                            MailUtil.sendMail("xxxx@qq.com", "本日船期到期货物提醒", "你的合同为"+c.getContractNo()+"的这批货今日需要出货");
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
            }
        }   
    }
    

    相关文章

      网友评论

        本文标题:Quartz 实现定时任务调度

        本文链接:https://www.haomeiwen.com/subject/hmublxtx.html