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,List maplist,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; //省略其他处理 }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。