Qutarz动态多任务定时功能实现

废话不多说直接上源码
有不懂的或错误的地方可以下方留言

import com.jctl.cloud.common.utils.SpringContextHolder;
import com.jctl.cloud.manager.console.NodeConsole;
import com.jctl.cloud.manager.node.entity.Node;
import com.jctl.cloud.manager.node.service.NodeService;
import com.jctl.cloud.manager.timingstrategy.entity.NodeCollectionCycle;
import com.jctl.cloud.manager.timingstrategy.service.NodeCollectionCycleService;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;

import java.util.Iterator;
import java.util.List;
/** * @author gent * @used 多任务动态定时 * @date 2017年2月27日 */
public class QutarzUtil {
    private static NodeService nodeService = SpringContextHolder.getBean(NodeService.class);
    private static NodeCollectionCycleService nodeCollectionCycleService = SpringContextHolder.getBean(NodeCollectionCycleService.class);
    private static SchedulerFactory schedulerFactory = new StdSchedulerFactory();

    public static List<NodeCollectionCycle> getNclList(){
        NodeCollectionCycle nodeCollectionCycle = new NodeCollectionCycle();
        List<NodeCollectionCycle> list = nodeCollectionCycleService.findList(nodeCollectionCycle);
        return  list;
    }

    /** * 初始化定时器 * * @throws Exception */
    public static void initJobTrigger() throws Exception {
        List<NodeCollectionCycle> list = getNclList();
        //开始搞事情
        Scheduler scheduler = schedulerFactory.getScheduler();
        JobDetail jobDetail = null;
        CronTrigger cronTrigger = null;
        Iterator ite = list.iterator();
        while (ite.hasNext()) {
            //任务对象
            NodeCollectionCycle nodeCollectionCycle = (NodeCollectionCycle) ite.next();
            Node node = nodeService.getByNodeNum(nodeCollectionCycle.getNodeId());
            //定时表达式
            String cronExpression = nodeCollectionCycle.getCycleTime();

            if (node.getDelFlag().equals("1")){
                /** * 循环策略 */
                //循环任务标识为"0"
                jobDetail = new JobDetail(node.getId() + "0", Scheduler.DEFAULT_GROUP, NodeConsole.class);
                cronTrigger = new CronTrigger(node.getId() + "0", Scheduler.DEFAULT_GROUP);
                //为触发器设置定时表达式
                cronTrigger.setCronExpression(cronExpression);
                //启动新增定时器任务
                scheduler.scheduleJob(jobDetail, cronTrigger);
                /** * 开关策略 * * 关闭:2 开启:1 */

                if (node.getOpenFlag()!="" && node.getOpenFlag() != null) {
                    if (node.getOpenFlag().equals("0")) {
                        cronExpression = nodeCollectionCycle.getCycleOn();
                        jobDetail = new JobDetail(node.getId() + "1", Scheduler.DEFAULT_GROUP, NodeConsole.class);
                        cronTrigger = new CronTrigger(node.getId() + "1", Scheduler.DEFAULT_GROUP);
                        //为触发器设置定时表达式
                        cronTrigger.setCronExpression(cronExpression);
                        //启动新增定时器任务
                        scheduler.scheduleJob(jobDetail, cronTrigger);
                    } else if (node.getOpenFlag().equals("1")) {
                        cronExpression = nodeCollectionCycle.getCycleOff();
                        jobDetail = new JobDetail(node.getId() + "2", Scheduler.DEFAULT_GROUP, NodeConsole.class);
                        cronTrigger = new CronTrigger(node.getId() + "2", Scheduler.DEFAULT_GROUP);
                        //为触发器设置定时表达式
                        cronTrigger.setCronExpression(cronExpression);
                        //启动新增定时器任务
                        scheduler.scheduleJob(jobDetail, cronTrigger);
                    }
                }
            }
        }
        //初始化任务只需要执行一次,执行一次后移除初始化触发器
        scheduler.unscheduleJob("InitTrigger", Scheduler.DEFAULT_GROUP);
    }

    public static void start() {
        try {
            Scheduler scheduler = schedulerFactory.getScheduler();
            if (scheduler.isStarted()) {
                List<Node> nodeList = nodeService.findList(new Node());
                Iterator ite = nodeList.iterator();
                while (ite.hasNext()){
                    Node node = (Node)ite.next();
                    scheduler.deleteJob(node.getId()+"0",scheduler.DEFAULT_GROUP);
                    scheduler.deleteJob(node.getId()+"1",scheduler.DEFAULT_GROUP);
                    scheduler.deleteJob(node.getId()+"2",scheduler.DEFAULT_GROUP);
                }
                scheduler.standby();
            }
            initJobTrigger();
            scheduler.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void shutdown(){
        try{
            Scheduler scheduler = schedulerFactory.getScheduler();
            if (scheduler.isStarted()){
                scheduler.shutdown();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }


    /** * 将时间字符串转换成qutarz可识别的通配符字符串 * * @param time 时间 * @param weeks 周*,此处为可变参数可传入多个值 * @return qutarz统配符字符串 */
    public static String dateConvertQutarzFormate(String time, String[] weeks) {
        if (!time.equals(null) || !time.equals("")) {
            String[] t = time.split(":");
            String hour = t[0] + " ";
            String min = t[1] + " ";
            if (min.toCharArray()[0] == 0) {
                min = min.toCharArray()[1]+"";
            }
            StringBuffer sb = new StringBuffer();
            sb.append("* ");
            sb.append(min);
            sb.append(hour);
            sb.append("* ");
            if (!weeks.equals(null) || !weeks.equals("")) for (int i = 0; i <= weeks.length - 1; i++) {
                sb.append(weeks[i]);
                if (i == weeks.length - 1) {
                    sb.append(" ");
                } else {
                    sb.append(",");
                }
            }
            else {
                sb.append("*");
            }

            sb.append("?");
            return sb.toString();
        }
        return null;

    }

    /** * 将普通日期格式转换成qutarz通配符 * @param time * @return */
    public static String dateConvertQutarzFormate(String time) {
        if (!time.equals(null) || !time.equals("")) {
            String[] t = time.split(":");
            String hour = t[0] + " ";
            String min = t[1] + " ";
            StringBuffer sb = new StringBuffer();
            sb.append("* ");
            sb.append(min);
            sb.append(hour);
            sb.append("* ");
            sb.append("* ");
            sb.append("?");
            return sb.toString();
        }
        return null;

    }

    /** * 将qutarz通配符字符串转换成通用日期格式 例如 :0 50 17 * * 1,2,3 ? * * @param qutarzStr 要转换的qutarz通配符字符串 * @return 通用日期字符串 周一,周二,周三/17:50 */
    public static String qutarzStrConvertDate(String qutarzStr) {
        String[] strings = qutarzStr.split(" ");
        StringBuffer date = new StringBuffer();
        String weeks = strings[5];
        String[] week = weeks.split(",");
        for (int i = 0; i < week.length; i++) {
            date.append("周");
            date.append(week[i]);
            if (i != week.length - 1) {
                date.append(",");
            } else {
                break;
            }
        }
        date.append("/");
        date.append(strings[2] + ":");
        date.append(strings[1]);
        return date.toString();
    }

    /** * 将qutarz通配符字符串转换成time时间 xx:xx:xx * @param qutarzStr * @return */
    public static String qutarzStrConvertTime(String qutarzStr) {
        StringBuffer sb = new StringBuffer();
        String[] strs = qutarzStr.split(" ");
        sb.append(strs[2]);
        sb.append(":");
        sb.append(strs[1]);
        sb.append(":");
        sb.append("00");
        return sb.toString();
    }

}

转载于:https://my.oschina.net/u/3206691/blog/1607165

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值