oracle怎樣定時觸發_從零搭建定時任務框架
阿新 • • 發佈:2021-01-02
技術標籤:oracle怎樣定時觸發
IT牛哥與你分享
最近專案上需要接入很多外圍系統介面,需要一個定時任務框架,以前的舊框架是用xml配置的方式,而且是需要部署到web容器上,每次停任務或者更改任務的執行頻率,都需要重啟應用,對於生產環境來說,這個是比較致命的!所以打算重新搭建一個定時任務框架。下面從需求、技術選型與實現、部署幾個方面給大家分享一下搭建的過程。
定時任務框架總覽圖
需求
- 功能需求
- 啟動、停止、配置執行頻率:這個是最基本的需求,主要是滿足任務按需啟停或者更改執行的頻率,不需要對工程進行啟停。
- 日誌:主要記錄任務的呼叫情況、呼叫開始與結束時間等資訊,便於查詢問題。
- 監控與告警:對記錄日誌進行監控,針對呼叫異常的任務及時簡訊或郵件告警。
- restful介面文件自動生成與線上呼叫:對開發的restful api可以自動生成介面文件,並且可以線上呼叫。
- 非功能需求
- 更改配置不需要重啟。
- 部署簡單。
技術選型
經過一番考慮,最終選擇使用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("歡迎使用,這是一個定時任務框架!"); }}
在資料庫表中配置執行頻率
任務資料庫配置圖
執行啟動類,定時任務就可以運行了!
部署
mvn install打成jar包上傳到伺服器指定目錄,執行java -jar jar包就可以了。
感興趣的朋友可以關注我或者給我留言,大家共同學習,共同進步!