第十六节线程模块

目录

1.线程说明

1.1.ScheduledTask 自动执行的线程类

1.2.ScheduledTaskController  控制类

1.3.ScheduledTaskUtils  线程实际执行的类

1.4.配置文件

1.4.示例

1.4.1.ScheduledTask类

1.4.2.ScheduledTaskUtils类

1.4.3.ScheduledTaskController类

1.5.线程运行时间差

​编辑

2.时间表达式

2.1.每隔字符含义

2.2.常用表达式例子


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触发

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

akglobe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值