1. 程式人生 > 其它 >oracle怎樣定時觸發_從零搭建定時任務框架

oracle怎樣定時觸發_從零搭建定時任務框架

技術標籤:oracle怎樣定時觸發

IT牛哥與你分享

最近專案上需要接入很多外圍系統介面,需要一個定時任務框架,以前的舊框架是用xml配置的方式,而且是需要部署到web容器上,每次停任務或者更改任務的執行頻率,都需要重啟應用,對於生產環境來說,這個是比較致命的!所以打算重新搭建一個定時任務框架。下面從需求、技術選型與實現、部署幾個方面給大家分享一下搭建的過程。

42095fa55cf301eebc0a7b8885b2972d.png

定時任務框架總覽圖

需求

  • 功能需求
  1. 啟動、停止、配置執行頻率:這個是最基本的需求,主要是滿足任務按需啟停或者更改執行的頻率,不需要對工程進行啟停。
  2. 日誌:主要記錄任務的呼叫情況、呼叫開始與結束時間等資訊,便於查詢問題。
  3. 監控與告警:對記錄日誌進行監控,針對呼叫異常的任務及時簡訊或郵件告警。
  4. restful介面文件自動生成與線上呼叫:對開發的restful api可以自動生成介面文件,並且可以線上呼叫。
  • 非功能需求
  1. 更改配置不需要重啟。
  2. 部署簡單。

技術選型

經過一番考慮,最終選擇使用springboot+quartz+mybatis+oracle+swagger+maven來搭建這個框架。

  • springboot:①開源、輕量級框架②簡化spring框架的搭建與開發過程③內嵌tomcat④不生成程式碼、不配置xml
  • quartz:①開源作業排程框架②包含排程器監聽、作業和觸發器監聽③使用簡單,JOB介面就一個execute方法
  • mybatis:①mapper中可以生成一些基本的方法,sql在xml中可配置②主要是感覺hibernate和jpa不好用
  • oracle:①使用者提供,所以沒有②了
  • swagger:①用於生成、描述、呼叫和視覺化restful風格的服務②介面文件的線上自動生成③功能測試
  • maven:①專案管理工具,管理jar包

實現

  • 工程結構樹狀圖
job_schedule_demo│      ├─src│  ├─main│  │  ├─java│  │  │  └─com│  │  │      └─demo│  │  │          └─schedule│  │  │              │  JobScheduleApp.java│  │  │              │  │  │  │              ├─base│  │  │              │      BaseTask.java│  │  │              │      JobFactory.java│  │  │              │      MybatisJavaTypeResolver.java│  │  │              │      QuartzManager.java│  │  │              │      SwaggerConfiguration.java│  │  │              │      │  │  │              ├─common│  │  │              │      Constants.java│  │  │              │      │  │  │              ├─controller│  │  │              │      JobConfigController.java│  │  │              │      │  │  │              ├─entity│  │  │              │      TJobRunningLog.java│  │  │              │      TJobRunningLogCriteria.java│  │  │              │      TJobsConfig.java│  │  │              │      TJobsConfigCriteria.java│  │  │              │      │  │  │              ├─job│  │  │              │      HelloWorldJob.java│  │  │              │      │  │  │              ├─listener│  │  │              │      ScheduleJobInitListener.java│  │  │              │      │  │  │              ├─mapper│  │  │              │      TJobRunningLogMapper.java│  │  │              │      TJobRunningLogMapper.xml│  │  │              │      TJobsConfigMapper.java│  │  │              │      TJobsConfigMapper.xml│  │  │              │      │  │  │              ├─service│  │  │              │  │  JobService.java│  │  │              │  │  │  │  │              │  └─ipml│  │  │              │          JobServiceImpl.java│  │  │              │          │  │  │              └─utils│  │  └─resources│  │      │  application.yml│  │      │  │  │      └─mybatis│  │              gencfg-mybatis-oracle.xml│  │              mybatis-config.xml│  │              │  └─test│      └─java└─target
  • 啟動類
@[email protected]("com.demo.schedule.mapper")public class JobScheduleApp {public static void main(String[] args) {SpringApplication.run(JobScheduleApp.class, args);}}
  • 監聽器
@[email protected](value = 1)public class ScheduleJobInitListener implements CommandLineRunner {private static Logger logger = LoggerFactory.getLogger(ScheduleJobInitListener.class);    @Autowired    JobService jobService;    @Override    public void run(String... arg0) throws Exception {        try {        jobService.initSchedule();        } catch (Exception e) {        logger.error("ScheduleJobInitListener Exception", e);        }    }}
  • 初始化有效的任務
/** *  * @Title: initSchedule * @Description: 初始化所有有效job * @throws SchedulerException     * @throws */@Overridepublic void initSchedule() throws SchedulerException {TJobsConfigCriteria example = new TJobsConfigCriteria();TJobsConfigCriteria.Criteria criteria = example.createCriteria();criteria.andJobStatusEqualTo(Constants.JObSTATUS_MAPPING.get("RUNNING"));criteria.andJobGroupEqualTo("DEMO");List jobList = tjobsconfigMapper.selectByExample(example);for (TJobsConfig job : jobList) {if (Constants.JObSTATUS_MAPPING.get("RUNNING").equals(job.getJobStatus())) {logger.info("will add job:{}", job.getJobName());quartzManager.addJob(job);}}}

這個地方使用了quartz的新增任務

/**     * 新增任務     *      * @param job     * @throws SchedulerException     */        @SuppressWarnings("unchecked")    public void addJob(TJobsConfig job) {        try {            // 建立jobDetail例項,繫結Job實現類            // 指明job的名稱,所在組的名稱,以及繫結job類            Class extends Job> jobClass = (Class extends Job>) (Class.forName(job.getBeanClass()).newInstance()                    .getClass());            JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(job.getJobName(), job.getJobGroup())// 任務名稱和組構成任務key                    .build();            // 定義排程觸發規則            // 使用cornTrigger規則            Trigger trigger = TriggerBuilder.newTrigger().withIdentity(job.getJobName(), job.getJobGroup())// 觸發器key                    .startAt(DateBuilder.futureDate(1, IntervalUnit.SECOND))                    .withSchedule(CronScheduleBuilder.cronSchedule(job.getCronExpression())).startNow().build();            // 把作業和觸發器註冊到任務排程中            scheduler.scheduleJob(jobDetail, trigger);            // 啟動            if (!scheduler.isShutdown()) {                scheduler.start();            }        } catch (Exception e) {        log.error("新增任務 異常", e);        }    }
  • 配置用來測試的任務HelloWorldJob

BaseTask中實現了Job介面的execute方法,分別記錄了任務執行前後的日誌,所有的任務繼承BaseTask。

@DisallowConcurrentExecution //作業不併發@Componentpublic class HelloWorldJob extends BaseTask{    public void perform()  {       System.out.println("歡迎使用,這是一個定時任務框架!");    }}

在資料庫表中配置執行頻率

08c1bef7aaa4dfd1dcb24774584cc78d.png

任務資料庫配置圖

執行啟動類,定時任務就可以運行了!

部署

mvn install打成jar包上傳到伺服器指定目錄,執行java -jar jar包就可以了。

感興趣的朋友可以關注我或者給我留言,大家共同學習,共同進步!