美文网首页
Springboot 技术整合--笔记4--定时任务&异步任务

Springboot 技术整合--笔记4--定时任务&异步任务

作者: 牵手生活 | 来源:发表于2019-05-03 15:23 被阅读0次

Springboot整合定时任务Task

涉及到的知识点

  • @EnableScheduling //开启定时任务
  • @Scheduled(fixedRate = 3000) //注解频率
  • cron表达式 //参见:http://cron.qqe2.com/

在application的启动类添加@EnableScheduling注解,开启定时任务,会自动扫描

//开启定时任务
@EnableScheduling
application开启任务注解

定义@Component作为组件和和@Scheduled注解被容器扫描

测试定时任务TestTask.java

@Component
public class TestTask {

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    // 定义每过3秒执行任务
  @Scheduled(fixedRate = 3000)  //每隔3秒执行
//  @Scheduled(cron = "4-40 * * * * ?")  //定时任务--4秒~40秒结束,每分钟重复
    public void reportCurrentTime() {
        System.out.println("现在时间:" + dateFormat.format(new Date()));
    }
}

每隔3秒打印情况

定时任务表达式的简单讲解与应用

springboot的cron不支持年,所有只有6位
cron表达式的自动生成:http://cron.qqe2.com/

cron表达式自动生成

Springboot整合--异步任务

在application的启动类添加@EnableAsync注解,开启异步任务

//开启异步调用方法
@EnableAsync

定义@Component和作为组件和@Async注解被容器扫描

异步任务AsyncTask.java


@Component
public class AsyncTask {
    
    @Async
    public Future<Boolean> doTask11() throws Exception {
        long start = System.currentTimeMillis();
        Thread.sleep(1000);
        long end = System.currentTimeMillis();
        System.out.println("任务1耗时:" + (end - start) + "毫秒");
        return new AsyncResult<>(true);  //表示异步任务完成
    }
    
    @Async
    public Future<Boolean> doTask22() throws Exception {
        long start = System.currentTimeMillis();
        Thread.sleep(700);
        long end = System.currentTimeMillis();
        System.out.println("任务2耗时:" + (end - start) + "毫秒");
        return new AsyncResult<>(true);
    }
    
    @Async
    public Future<Boolean> doTask33() throws Exception {
        long start = System.currentTimeMillis();
        Thread.sleep(600);
        long end = System.currentTimeMillis();
        System.out.println("任务3耗时:" + (end - start) + "毫秒");
        return new AsyncResult<>(true); 
    }
}

调用异步任务的Controller

@RestController
@RequestMapping("tasks")
public class DoTask {
    
    @Autowired
    private AsyncTask asyncTask;  //异步任务注入
    
    @RequestMapping("test1")
    public String test1() throws Exception {
        
        long start = System.currentTimeMillis();
        
        Future<Boolean> a = asyncTask.doTask11(); //调用异步任务11
        Future<Boolean> b = asyncTask.doTask22(); //调用异步任务22
        Future<Boolean> c = asyncTask.doTask33(); //调用异步任务33
        
        while (!a.isDone() || !b.isDone() || !c.isDone()) { //用于判断异步任务是否完成
            if (a.isDone() && b.isDone() && c.isDone()) {
                break;
            }
        }
        
        long end = System.currentTimeMillis();
        
        String times = "任务全部完成,总耗时:" + (end - start) + "毫秒";
        System.out.println(times);
        
        return times;
    }
}

启动项目测试

http://localhost:8080/tasks/test1

会发现是否开启@EnableAsync注解执行时间是不一样

没用注解@EnableAsync任务执行情况
开启异步的结果

异步任务的使用场景

  • 数据清算(如证券交易的清算)
  • 违规处理(如微信号违规分析)
  • 发送短息
  • 发送邮件
  • app推送

相关文章

网友评论

      本文标题:Springboot 技术整合--笔记4--定时任务&异步任务

      本文链接:https://www.haomeiwen.com/subject/sztznqtx.html