简单的spring任务调度
上周的功能需求要用到定时任务,开始时用csdn上搜索到的也能实现,但是就我目前的项目来说还是略显笨重,我只需要简单点的定时任务就可以了,所以本周又重新简化了下,以下是Java代码:
思路:建一个存储任务相关信息的表,使用spring的任务调度间隔5分钟读取此表,我的任务分为每天、每周、每月的,表里存储的有执行时间,当定时任务读取的执行时间在当前时间的5分钟内就执行此任务。
表:
CREATE TABLE project
(
project_id SERIAL NOT NULL,
project_name VARCHAR(255),
exe_type INTEGER,
time_period VARCHAR(255),
description VARCHAR(255),
last_modified_user VARCHAR(255),
last_modified_time VARCHAR(255),
execute_time VARCHAR(255),
flag INTEGER,
PRIMARY KEY (project_id)
);
applicationContext.xml
<!-- spring自动任务调度器配置 --> <!-- 要调用的工作类 --> <bean id="quartzJob" class="com.sgcc.epri.dcloud.datacheckservice.service.impl.AutoExcuteCheck"></bean> <bean id="jobtask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 调用的类 --> <property name="targetObject"> <ref bean="quartzJob" /> </property> <!-- 调用类中的方法 --> <property name="targetMethod"> <value>autoExcuteCheck</value> </property> <!-- 是否允许任务并发执行。当值为false时,表示必须等到前一个线程处理完毕后才再启一个新的线程 --> <property name="concurrent" value="false" /> </bean> <!-- 触发器配置 时间指定 --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="jobtask"></property> <!-- cron表达式 --> <property name="cronExpression"> <!-- 每隔10秒执行一次 --> <!-- <value>0/10 * * * * ?</value> --> <!-- 每天每隔5分钟执行一次 --> <value>0 0/5 * * * ?</value> <!-- 每天上午8点执行一次 --> <!-- <value>0 0 8 * * ?</value> <value>0 0 0 * * ?</value> --> <!-- 在每天下午16点到下午16:59期间的每1分钟触发 --> <!-- <value>0 * 16 * * ?</value> --> </property> </bean> <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 --> <bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <!-- 触发器列表 --> <ref bean="cronTrigger" /> </list> </property> </bean>
AutoExcuteCheck.javapublic class AutoExcuteCheck { @Autowired private DBQueryService dbQueryService; @Autowired private CheckProcessService checkProcessService; /** * @brief : 读取定时校验库执行定时校验 */ public void autoExcuteCheck() throws ParseException { System.out.println("读取自动校验配置*************************"); Map<String, Object> map_db_info = new HashMap<String, Object>(); map_db_info.put("table_name", ConfAppSet.getConfDBTableName("CHECK_PROJECT")); map_db_info.put("col_name", " * "); map_db_info.put("condition_add", " AND EXE_TYPE = 1 AND FLAG = 1 "); List<Map<String,Object>> list = dbQueryService.getResultList(map_db_info); if (list != null && list.size() > 0) { for (Map<String, Object> map : list) { String time_period = map.get("TIME_PERIOD").toString(); String execute_time = map.get("EXECUTE_TIME").toString(); int exeTime = 0; if (org.apache.commons.lang.StringUtils.isNotEmpty(execute_time)) { String replace = execute_time.replace(":", ""); exeTime = Integer.valueOf(replace); } int beforeFive = DateUtil.getCurrentTimeBeforeFive(); int nowTime = DateUtil.getCurrentTimeNow(); //每天执行的任务 if (org.apache.commons.lang.StringUtils.isNotEmpty(time_period) && time_period.equals("everyday")) { //定时扫描check_project任务表是5分钟扫描一次,所以这里判断执行时间是否在前五分钟范围 if (beforeFive <= exeTime && exeTime < nowTime) { checkProcessService.checkProcess(checkRules); } //每周某天执行的 } else if (org.apache.commons.lang.StringUtils.isNotEmpty(time_period) && time_period.contains("星期")) { String week = DateUtil.getWeek(); if (org.apache.commons.lang.StringUtils.isNotEmpty(week) && week.equals(time_period)) { if (beforeFive <= exeTime && exeTime < nowTime) { checkProcessService.checkProcess(checkRules); } } //每月某天执行的 } else if (org.apache.commons.lang.StringUtils.isNotEmpty(time_period)) { int periodDay = Integer.valueOf(time_period); int todayDay = DateUtil.getTodayDay(); if (periodDay == todayDay) { if (beforeFive <= exeTime && exeTime < nowTime) { checkProcessService.checkProcess(checkRules); } } } } } } }以上就是我的简单的spring任务调度实现
发表吐槽
你肿么看?
既然没有吐槽,那就赶紧抢沙发吧!