zoukankan      html  css  js  c++  java
  • 在springMVC框架中集成quartz作业调度器

    1、首先需要导入这几个jar包,如下图:

    其中log4j,quartz,slf4j-api,slf4j-log4j12我是在项目中都引用了

    2、引用完jar包后,新建一个作业调度类,执行作业调度逻辑,如下:

    package com.net.quartz;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.List;
    import org.apache.log4j.Logger;
    import org.springframework.beans.factory.annotation.Autowired;
    
    import com.net.entity.record.CountRecord;
    import com.net.entity.user.Users;
    import com.net.service.CountRecordService;
    import com.net.service.UserService;
    
    /**
     * 每日刷新会员分享数额作业
     * 每日刷新会员有效天数
     * @author zhangdi
     *
     */
    public class RefreshCountRecord {
        private Logger log = Logger.getLogger(RefreshCountRecord.class);
        @Autowired
        private CountRecordService cRecordService;//权限服务
        @Autowired
        private UserService userService;//用户会员天数更新以及用户会员降级操作
        
        //调用的方法  
        public void execute(){
            Date d = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
            String dateNowStr = sdf.format(d);
            //需要做的事情
            /*
             * *************************************************
             * *************************************************
             * **这里执行会员降级与会员有效天数减一操作**
             * *************************************************
             * *************************************************
             */
            log.info("=========***update userLevel by vipDay START***===============");
            //将vip天数为0的用户的用户等级降为0
            boolean updateUserLeverToNormal = userService.updateUserLevelByVipDays(0, 0);
            log.info(dateNowStr+"=========update userLevel to 0 by vipDay===============>"+updateUserLeverToNormal);
            log.info(dateNowStr+"=========***update userLevel by vipDay END***===============");
            log.info(dateNowStr+"=========***VIP vipDay-1 START***===============");
            List<Users> userLevelOne = userService.findUserByUserLevel(1);
            List<Users> userLevelTwo = userService.findUserByUserLevel(2);
            List<Users> userLevelThree = userService.findUserByUserLevel(3);
            //开始执行vip天数减一
            reduceVipDay(userLevelOne);
            reduceVipDay(userLevelTwo);
            reduceVipDay(userLevelThree);
            log.info(dateNowStr+"=========***VIP vipDay-1 END***===============");
            
            /*
             * *************************************************
             * *************************************************
             * ****这里执行会员记录操作,执行在会员降级之后
             * *************************************************
             * *************************************************
             */
            //设置是否刷新成功
            boolean isRefresh = false;
            //查询出所有会员的限制记录1代表会员0代表非会员
            List<CountRecord> countRecords = cRecordService.findCountRecordsByIsVip(1);
            if(countRecords.size()==0){
                log.info("============="+dateNowStr+"===>not found vip record!!!==========");
                System.out.println(dateNowStr+"发现没有会员记录");
            }else{            
                for (CountRecord c : countRecords) {
                    c.setAdverCount(200);
                    c.setContactsCount(200);
                    c.setShareCount(200);
                    c.setIsVip(1);
                    isRefresh = cRecordService.updateCountRecordByUserId(c);
                }
                log.info("============="+dateNowStr+"===>refresh vip count to 200=================>"+isRefresh);
                System.out.println(dateNowStr+"刷新会员权限数额为200=================>"+isRefresh);
            }       
        }  
        /**
         * 执行用户vip天数减一
         * @param list
         */
        private void reduceVipDay(List<Users> list){
            int oldVipDays = 0;
            int nowVipDays = 0;
            for (Users users : list) {
                oldVipDays = users.getVipDays();
                nowVipDays = oldVipDays-1;
                boolean isSuccess =userService.updateVipDaysById(users.getId(), nowVipDays);
                log.info("=========update=="+users.getUserName()+"vipDays=======>"+isSuccess);
            }
        }
    }

    3在applicationContext.xml中配置,如下:

        <!--  使用quartz框架做简单的作业调度(定时器)-->
        <!--要调度的对象-->
        <!-- 刷新数据库中会员每日添加记录的上限 -->  
        <bean id="jobBean" class="com.net.quartz.RefreshCountRecord" />
         <!-- 定义调用对象和调用对象的方法 --> 
        <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
            <property name="targetObject" ref="jobBean" />  
            <property name="targetMethod" value="execute" />  
            <!--将并发设置为false-->  
            <property name="concurrent" value="false" />  
        </bean>  
        <!-- 定义触发时间 -->
        <bean id="trigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">  
                <property name="jobDetail" ref="jobDetail" />  
                        <!--表达式,我的是每天凌晨1点执行一次-->  
                       <property name="cronExpression" value="0 0 1 * * ?" />
                       <!-- <property name="cronExpression" value="0/10 * * * * ?" /> -->
        </bean>
          
        <!--  总管理类如果将lazy-init='false'那么容器启动就会执行调度程序   -->  
        <bean id="startQuertz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false" >  
                <property name="triggers">  
                    <list>  
                        <!--作业调度器,list下可加入其他的调度器-->  
                    <ref bean="trigger" />
                    </list>  
            </property>  
        </bean>  

    至此,一个简单的作业调度就设置完毕。

    常用的定时表达式表:

    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分每分触发 
    0 0/5 14 * * ?         每天下午的 2点到2点59分(整点开始,每隔5分触发)  
    0 0/5 14,18 * * ?        每天下午的 18点到18点59分(整点开始,每隔5分触发)

    0 0-5 14 * * ?            每天下午的 2点到2点05分每分触发 
    0 10,44 14 ? 3 WED        3月分每周三下午的 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           每月的第三周的星期五开始触发 
    0 0 12 1/5 * ?            每月的第一个中午开始每隔5天触发一次 
    0 11 11 11 11 ?           每年的11月11号 11点11分触发(光棍节)

  • 相关阅读:
    JavaScript中的Date对象
    补零函数和随机数函数
    设置与获取自定义属性
    eval()
    获取DOM元素样式
    do{}while() 循环
    ++ 运算符
    switch 语句
    git
    webpack
  • 原文地址:https://www.cnblogs.com/zhangdiIT/p/6749047.html
Copyright © 2011-2022 走看看