Spring boot基于ScheduledFuture实现定时任务
一、背景
接上一篇,完成存储过程的动态生成后,需要构建定时任务执行存储过程
二、环境
1.此随笔内容基于springboot项目
2.数据库为mysql5.7.9版本
3.jdk版本为1.8
三、内容
1、定义接口和接口参数bean;
1)在上一篇博客bean的基础上把接口配置参数bean修改一下,添加一个配置参数值和排序字段;在添加一个监测项的bean,想查看其他的bean信息,请移步
@Entity
@Table(name="monitor_warn_item")
publicclassMonitorWarnItem{
@Id
privateStringid;
privateStringproName;//名称
privateStringrule;
privateStringsend_content;
privateStringrecommend_value;//建议值
privateStringstandard_value;//标准值
privateIntegerfre_num;
privateStringfrequency;
privateStringstatus;
privateStringwarnType;
privateStringwarn_date_num;//监测频次
//此处省略get、set…
}
@Entity
@Table(name="qt_interface_parameter")
publicclassQtInterfaceParameter{
@Id
privateStringid;
@Column(name="inter_id")
privateStringinterId;
privateStringname;//参数名称
privateStringexplain_info;//参数描述
privateStringtype;//输入输出类型
privateStringparaType;//参数类型
privateIntegerparaLen;
privateIntegerparaValue;//参数值
privateIntegerorder_num;//排序字段
//此处省略get、set…
}
2、定义ScheduledFuture定时任务
1)添加接口
publicinterfaceTestService{
ResultInfoinitMonitor(StringId);
//省略之前的...
}
2)编写实现类
@Service
publicclassTestServiceImplimplementsTestService{
@Autowired
privateMonitorWarnItemRepositorymonitorWarnItemRepository
@Autowired
privateThreadPoolTaskSchedulerthreadPoolTaskScheduler;
@Bean
publicThreadPoolTaskSchedulerthreadPoolTaskScheduler(){
returnnewThreadPoolTaskScheduler();
}
List
3)构建任务处理线程类
publicclassQuartzTaskServiceimplementsRunnable{
privateJdbcTemplatejdbcTemplate;
privateStringproName;
privateListmaplist;
privateMonitorWarnItemitem;
publicQuartzTaskService(StringproName,Listmaplist,JdbcTemplatejdbcTemplate,MonitorWarnItemitem){
this.proName=proName;
this.maplist=maplist;
this.jdbcTemplate=jdbcTemplate;
this.item=item;
}
protectedvoidexecuteInternal()throwsJobExecutionException{
SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");
StringBufferbf=newStringBuffer();
bf.append("call");
bf.append(proName);
bf.append("(");
inti=1;
for(Stringmap:maplist){
if(i==maplist.size()){//最后一位
bf.append("'"+map+"')");
}else{
bf.append("'"+map+"',");
}
i++;
}
jdbcTemplate.batchUpdate(bf.toString());
System.out.println("执行了过程:"+proName+"当前参数顺序:"+bf.toString()+"当前时间"+sdf.format(newDate()));
}
@Override
publicvoidrun(){
try{
executeInternal();//调用执行
}catch(JobExecutionExceptione){
e.printStackTrace();
}
}
4)此处是用的List保存的任务信息,在项目重启之后这个东西就没了,也就是说定时任务就全丢了,so,这里考虑使用数据库来持久化保存调度任务信息,或者在项目启动的时候写一个配置来调用启动定时任务
@Component
@Order(1)
publicclassStartTaskimplementsCommandLineRunner{
@Autowired
privateTestServicetestService;
publicStringsetTask(){
Calendarcale=null;
cale=Calendar.getInstance();
intyear=cale.get(Calendar.YEAR);
MonitorWarnItemitemList=testService.QueryByStatus("1");//根据状态查询需要启动的监测项
if(itemList.size()>0){//存在需要启动的检测项
For(MonitorWarnItemqt:itemList)
testService.initMonitor(qt);//启动任务列表和消息
}
return"";
}
@Override
publicvoidrun(String...args)throwsException{
setTask();
}
}
5)最后附上一个我使用的返回处理类
publicclassResultInfo{ privateIntegerresult; privateStringmsg; privateTrows; privateinttotal; //省略其他处理 }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。