在ssm项目里面实现定时任务从数据库获取定时时间
1.创建定时时间表
2.创建定时任务类
package com.tencent.tusi.test.quartzTest;import com.tencent.tusi.business.entity.TSystemUsers;
import com.tencent.tusi.business.service.TSystemUsersService;
import org.springframework.beans.factory.annotation.Autowired;import static com.tencent.tusi.currency.utils.DateUtil.now;public class InsertUserAfterTenSecond {@Autowiredpublic TSystemUsersService tSystemUsersService;public void insertRecord(){TSystemUsers user=new TSystemUsers();user.setcUserName("汤师爷");user.setcPassWord("984646");user.setcAddress("m78");user.setcPhone("11000");user.setcSex("女");user.setcDepartmentId(2);user.setRegisterTime(now());int i = tSystemUsersService.insertUser(user);if(i>0){System.out.println("===========================插入了一条===========================");}}}
这个任务类的功能是插入一条数据。
2.在配置文件里面配置任务类
<bean id="insertUserAfterTenSecond2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><property name="targetObject"><bean class="com.tencent.tusi.test.quartzTest.InsertUserAfterTenSecond"/></property><property name="targetMethod" value="insertRecord"/><!--不并发调度--><property name="concurrent" value="false"/></bean>
3.定义定时时间
<bean id="inertUserTrigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"><property name="jobDetail" ref="insertUserAfterTenSecond2"/><!--定时时间,10秒一次,cron表达式--><property name="cronExpression" value="*/10 * * * * ?"/></bean>
因为xml文件无法实现直接从数据库读时间,所以先任意配置cron表达式,后面用数据库里面的时间替换掉就行。
4.从数据库获取配置时间
<bean id="insertByDatabaseTime" class="com.tencent.tusi.test.quartzTest.InsertUserByDatabaseTime" lazy-init="false" init-method="init"><property name="scheduler" ref="quartzSchedulerFactoryBean"/></bean>
lazy-init=“false” 表示立即加载。即在spring容器启东是就加载。method=“init” 是指定获取数据库定时时间的启动方法。class路径是获取数据库定时时间的类路径,scheduler属性是打开调度器。
调度工厂
<bean id="quartzSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <!-- <property name="autoStartup" value="true"/> --><!-- 自动启动 --><!-- <property name="startupDelay" value="15" /> --><property name="triggers"> <list> <ref bean="inertUserTrigger2"/></list></property><property name="taskExecutor" ref="executor" /></bean>
5.更改时间为数据库时间
package com.tencent.tusi.test.quartzTest;import com.tencent.tusi.business.entity.TQuartzTestTime;
import com.tencent.tusi.business.service.TQuartzTestTimeService;
import com.tencent.tusi.currency.utils.DateUtil;
import org.apache.commons.lang.StringUtils;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;import java.sql.Time;public class InsertUserByDatabaseTime {private Scheduler scheduler;@Autowiredprivate TQuartzTestTimeService tQuartzTestTimeService;public void init(){TQuartzTestTime tQuartzTestTime = tQuartzTestTimeService.getAllTQuartzTestTime(2);Time getTime= null;String cronTime = "";if(tQuartzTestTime!=null){//拿到数据库里面的定时时间getTime = tQuartzTestTime.getExecuteTime();}if(getTime!=null){//将数据库里面的定时时间转换为cron表达式cronTime = DateUtil.getCronByTime(getTime);}if(StringUtils.isNotBlank(cronTime)){TriggerKey triggerKey = TriggerKey.triggerKey("inertUserTrigger2");
//try {
// CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);// String oldTime = cronTrigger.getCronExpression();
// System.out.println("旧时间"+oldTime);TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();triggerBuilder.withIdentity("inertUserTrigger2");//任务开始时间triggerBuilder.startNow();//触发器时间triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cronTime));//创建trigger对象CronTrigger cronTrigger = (CronTrigger) triggerBuilder.build();//修改触发时间scheduler.rescheduleJob(triggerKey,cronTrigger);} catch (SchedulerException e) {e.printStackTrace();}}}public Scheduler getScheduler() {return scheduler;}public void setScheduler(Scheduler scheduler) {this.scheduler = scheduler;}
}
这个定时任务实现的功能是在每天的14:45和15:10插入一条数据