quartz 創建 定時任務寫法。


quartz  2.3.1

package xxxxxxxxxx;


import com.cjy.api.ext.quartz.CjyJobFactory;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;


/**
 * <b> quartz job 工具類</b><br/>
 * <p>通過 {@link JobUtil#scheduleJob(String, Class, String)} 方法, 創建一個定時任務</p>
 *
 * @author Zero
 * @date 2019-07-23 09:20
 */
@Component
public class JobUtil {

    private static Scheduler scheduler;
    private static final Logger LOGGER = LoggerFactory.getLogger(JobUtil.class);

    private static CjyJobFactory JOB_FACTORY;

    private static String DEFAULT_GROUP = "default-quartz";

    @Autowired
    private void setJobFactory(CjyJobFactory jobFactory) {
        JOB_FACTORY = jobFactory;
    }

    private static Scheduler getScheduler() {
        if (scheduler == null) {
            synchronized (JobUtil.class) {
                try {
                    scheduler = StdSchedulerFactory.getDefaultScheduler();
                    scheduler.setJobFactory(JOB_FACTORY);
                } catch (Exception e) {
                    LOGGER.error(e.getMessage(), e);
                }
            }
        }
        return scheduler;
    }

    /**
     * 創建 quartz job.
     *
     * @param jobName job名字
     * @param clazz   對應的 類 字節碼
     * @return jobDetail
     */
    public static JobDetail createJob(String jobName, Class<? extends StatefulJob> clazz) {
        return JobBuilder.newJob(clazz).
                withIdentity(jobName, DEFAULT_GROUP).build();
    }

    /**
     * 創建 cron 觸發器 (quartz)..
     * 關於cron表達式  -- <a>http://cron.qqe2.com/</a>
     *
     * @param triggerName 觸發器名稱
     * @param jobName     job名字 應該與 createJob 里 的第一個參數一致 {@link JobUtil#createJob}
     * @param cron        cron 表達式,
     * @return Trigger cron觸發器
     * @throws Exception 拋出異常
     */
    public static Trigger createCronTrigger(String triggerName, String jobName, String cron) throws Exception {
        return TriggerBuilder.newTrigger()
                .withIdentity(triggerName, DEFAULT_GROUP)
                .forJob(jobName, DEFAULT_GROUP)
                .withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();
    }

    /**
     * 創建 定時任務
     *
     * @param jobName job 名字 (必須全英文)
     * @param cron    cron 表達式
     * @param clazz   ? extend StatefulJob
     * @throws Exception 創建任務異常
     */
    public static void scheduleJob(String jobName,
                                   Class<? extends StatefulJob> clazz,
                                   String cron
    ) throws Exception {
        Scheduler scheduler = getScheduler();

        scheduler.scheduleJob(
                JobUtil.createJob(jobName, clazz),
                JobUtil.createCronTrigger(jobName + "Trigger",
                        jobName, cron)
        );
        scheduler.start();
    }


}

 

quartz 1.8.6

package xxxx;

import com.cjy.province.core.pojo.req.BaseUnicomReq;
import com.cjy.province.service.BasicInterfacesService;
import com.cjy.province.service.BasicInterfacesServiceImpl;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;


public class JobUtil {

    private static final Logger LOG = LoggerFactory.getLogger(JobUtil.class);

    private static final BasicInterfacesService basicInterfacesService = new BasicInterfacesServiceImpl();
    private static Scheduler scheduler;


    /**
     * 創建 quartz job.
     *
     * @param jobName job名字
     * @param clazz   對應的 類 字節碼
     * @return jobDetail
     */
    public static JobDetail createJob(String jobName, Class<? extends StatefulJob> clazz) {
        JobDetail jobDetail = new JobDetail();
        jobDetail.setName(jobName);
        jobDetail.setJobClass(clazz);
        jobDetail.setGroup("UnicomApi");
        return jobDetail;
    }

    /**
     * 創建 cron 觸發器 (quartz)..
     * 關於cron表達式  -- <a>http://cron.qqe2.com/</a>
     *
     * @param triggerName 觸發器名稱
     * @param jobName     job名字 應該與 createJob 里 的第一個參數一致 {@link JobUtil#createJob}
     * @param cron        cron 表達式,
     * @return Trigger cron觸發器
     * @throws Exception 拋出異常
     */
    public static Trigger createCronTrigger(String triggerName, String jobName, String cron) throws Exception {
        CronTrigger trigger = new CronTrigger();
        trigger.setName(triggerName);
        trigger.setJobName(jobName);
        trigger.setCronExpression(cron);
        trigger.setJobGroup("UnicomApi");

        // 延遲一分鍾執行..
        // trigger.setStartTime(new Date(new Date().getTime() + 60000));

        return trigger;
    }

    /**
     * 創建 線程...
     *
     * @return 線程...
     */
    @SuppressWarnings("unchecked")
    public Thread createThread(final BaseUnicomReq req, final String tableName, final String types, final boolean isScenicReq) {

        return new Thread() {
            @Override
            public void run() {
                // 獲取最 景區實時 最新的一條數據..
                Map<String, String> map = basicInterfacesService.getLastMesTimeV2(tableName, types);

                boolean isRequestAble = basicInterfacesService.nextRequestAllow(map, types);

                while (isRequestAble) {

                    if (isScenicReq) {
                        // 如果是景區數據請求..


                    } else {

                        req.doExecuteGetData();
                        basicInterfacesService.getNextRequestTime(map, types);
                        isRequestAble = basicInterfacesService.nextRequestAllow(map, types);
                    }
                }
            }
        };

    }


    public static List<Thread> startThreadList(Thread... threads) {
        List<Thread> threadList = new ArrayList<>();
        if (threads != null) {
            for (Thread t : threads) {
                if (t != null) {
                    threadList.add(t);
                    t.start();
                }
            }
        }
        return threadList;
    }

    /**
     * 開啟多個線程,並且使它們阻塞在主線程.
     *
     * @param threads 線程數組..
     * @throws Exception 異常信息
     */
    public static void startThreadListAndBlock(Thread... threads) throws Exception {
        List<Thread> threadList = startThreadList(threads);

        if (threadList != null && threadList.size() > 0) {
            for (Thread t : threadList) {
                if (t != null) {
                    t.join();
                }
            }
        }

    }

    /**
     * 根據景區-縣編碼的對應關系...返回 市 的 編碼 treeSet....
     *
     * @param scenicMap 景區編碼 - 縣 編碼
     * @return treeSet
     */
    public static TreeSet<String> createCitySet(Map<String, String> scenicMap) {
        TreeSet<String> set = new TreeSet<>();
        if (scenicMap != null) {
            for (String val : scenicMap.values()) {
                val = "V0" + val.substring(0, 4) + "00";
                set.add(val);
            }
        }
        return set;
    }

    /**
     * 根據景區-縣編碼的對應關系...返回 所有的 縣域 編碼 treeSet....
     *
     * @param scenicMap 景區編碼 - 縣 編碼
     * @return treeSet
     */
    public static TreeSet<String> createCountySet(Map<String, String> scenicMap) {
        TreeSet<String> set = new TreeSet<>();
        if (scenicMap != null) {
            //val = "V0" + val.substring(0, 4) + "00";
            set.addAll(scenicMap.values());
        }
        return set;
    }


    /**
     * 創建 定時任務
     *
     * @param jobName job 名字 (必須全英文)
     * @param cron    cron 表達式
     * @param clazz   ? extend StatefulJob
     * @throws Exception 創建任務異常
     */
    public static void scheduleJob(String jobName,
                                   Class<? extends StatefulJob> clazz,
                                   String cron
    ) throws Exception {
        Scheduler scheduler = getScheduler();
        scheduler.scheduleJob(
                JobUtil.createJob(jobName, clazz),
                JobUtil.createCronTrigger(jobName + "Trigger",
                        jobName, cron)
        );
    }

    

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM