目录
1.2.ScheduledTaskController 控制类
1.3.ScheduledTaskUtils 线程实际执行的类
1.4.3.ScheduledTaskController类
1.线程说明
1.1.ScheduledTask 自动执行的线程类
按照配置文件的 时间定时执行
1.2.ScheduledTaskController 控制类
所有的线程要求可被单独触发测试,这里就是和自动执行的方法一眼的功能,但是能被触发的控制类,可被web访问到的http请求
1.3.ScheduledTaskUtils 线程实际执行的类
线程实际执行的方法
1.4.配置文件
application.yml中配置线程执行时间
1.4.示例
1.4.1.ScheduledTask类
线程执行类
在类上配置线程所用注解
线程执行方法
在方法上加上同步注解和线程执行时间注解
同步执行注解:@Async
线程执行时间:@Scheduled(cron = "${demo.corn4}")
@Configuration //1.主要用于标记配置类,兼备Component的效果。
@EnableScheduling // 2.开启定时任务
@EnableAsync
@Slf4j
public class ScheduledTask {
@Autowired
private JdbcTemplate jdbcTemplate;
/**
* 同步待办
* 每1小时执行1次
*/
@Async
@Scheduled(cron = "${demo.corn4}")
public void updateSysOrgUser(){
if (scheduledDiction) {
//同步待办 机构人员同步的 待办人员表中
StudyResourceThread.updateSysOrgUser(jdbcTemplate,providerId);
}
}
}
1.4.2.ScheduledTaskUtils类
线程执行的业务方法
业务方法类中不能注入JdbcTemplate,所以需要从执行类中传过来,方法中执行成功或失败都会写入日志中
/**
* 线程更新 每隔2小时执行一次
* 将信息和机构的中间表 的人 更新到 信息和人的中间表中
* @param jdbcTemplate
* @return
*/
public static Map updateSysOrgUser(JdbcTemplate jdbcTemplate,String providerId){
String startTime = "";//日志表开始时间
String endTime = "";//日志表结束时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date start = new Date();
startTime = sdf.format(start);
Map map = new HashMap();
//查询培训班和机构中间表中 complete=2 是否有值
String orgSql = " SELECT * FROM t_system_notice_org where complete=2 ";
List orgList = jdbcTemplate.queryForList(orgSql);
if(orgList.size()>0){
for(int i=0;i<orgList.size();i++){
Map orgMap = (Map) orgList.get(i);
Long sysId = Long.parseLong(orgMap.get("sys_id").toString());
String orgId = orgMap.get("org_id").toString();
String orgCode = orgMap.get("org_code").toString();
String where = "";
if(!orgId.equals(providerId)){
where+=" and id not in (SELECT user_id FROM t_system_notice_user) ";
}
int num = 0;
// 根据机构编码到用户表中查询用户
String userSql = " select * from t_user where position_code like '%"+orgCode+"%' and position_state = '101401' "+where+" ";
List userList = jdbcTemplate.queryForList(userSql);
if(userList.size()>0){
for(int j=0;j<userList.size();j++){
Map userMap = (Map) userList.get(j);
Long userId = Long.parseLong(userMap.get("id").toString());
//查询 信息和人的关系 是否存在中间表中
String vbSql = " SELECT * FROM t_system_notice_user where sys_id="+sysId+" and user_id="+userId+" ";
List vbList = jdbcTemplate.queryForList(vbSql);
if(vbList.size()==0){
//如果不存在 保存信息和人的关系
String insert=" insert into t_system_notice_user(sys_id,user_id,complete) " +
" values("+sysId+","+userId+",2) ";
int row = jdbcTemplate.update(insert);
if(row>0){
num++;
}
}
}
}else{
String update= " update t_system_notice_org set complete=1 where sys_id="+sysId+" and org_id='"+orgId+"' ";
jdbcTemplate.update(update);
}
if(num>0){
Date end = new Date();
endTime = sdf.format(end);
String log_add = "insert into t_log_info (content,classify,start_time,end_time,num) " +
" values('新增','同步待办机构人员','"+startTime+"','"+endTime+"'," + num + ")";
jdbcTemplate.update(log_add);
String update= " update t_system_notice_org set complete=1 where sys_id="+sysId+" and org_id='"+orgId+"' ";
int row = jdbcTemplate.update(update);
if(row>0){
map.put("flag", true);
map.put("msg", "添加成功");
}
}
}
}
return map;
}
1.4.3.ScheduledTaskController类
可被单独触发测试线程类
和编写接口一样,调用执行线程方法,执行成功后返回请求成功信息
/**
* 同步待办机构中的人员 到待办人员表中
* @param request
*/
@RequestMapping(value = "/updateSysOrgUser", method = RequestMethod.GET)
@ResponseBody
public Map updateSysOrgUser(HttpServletRequest request) {
Map map = new HashMap();
if (!flag) {
return map;
}
StudyResourceThread.updateSysOrgUser(jdbcTemplate,providerId);
map.put("flag", true);
map.put("msg", "同步完成");
return map;
}
1.5.线程运行时间差
2.时间表达式
2.1.每隔字符含义
corn从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份
2.2.常用表达式例子
(1)0 0 2 1 * ? * 表示在每月的1日的凌晨2点调整任务
(2)0 15 10 ? * MON-FRI 表示周一到周五每天上午10:15执行作业
(3)0 15 10 ? 6L 2002-2006 表示2002-2006年的每个月的最后一个星期五上午10:15执行作
(4)0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
(5)0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
(6)0 0 12 ? * WED 表示每个星期三中午12点
(7)0 0 12 * * ? 每天中午12点触发
(8)0 15 10 ? * * 每天上午10:15触发
(9)0 15 10 * * ? 每天上午10:15触发
(10)0 15 10 * * ? * 每天上午10:15触发
(11)0 15 10 * * ? 2005 2005年的每天上午10:15触发
(12)0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发
(13)0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发
(14)0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
(15)0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发
(16)0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
(17)0 15 10 ? * MON-FRI 周一至周五的上午10:15触发
(18)0 15 10 15 * ? 每月15日上午10:15触发
(19)0 15 10 L * ? 每月最后一日的上午10:15触发
(20)0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发
(21)0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发
(22)0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发