首页 > 其他分享 >定时任务与异步

定时任务与异步

时间:2023-06-26 16:02:15浏览次数:34  
标签:异步 任务 线程 org import 定时 public

一、定时任务

1、基本概念

按照指定时间执行的程序。

2、使用场景

数据分析
数据清理
系统服务监控

二、同步和异步

1、基本概念

  • 同步调用

程序按照代码顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行;

  • 异步调用

顺序执行时,不等待异步调用的代码块返回结果就执行后面的程序。

2、使用场景

短信通知
邮件发送
批量数据入缓存

三、定时器应用

1、定时器执行规则注解

@Scheduled(fixedRate = 5000) :上一次开始执行时间点之后5秒再执行
@Scheduled(fixedDelay = 5000) :上一次执行完毕时间点之后5秒再执行
@Scheduled(initialDelay=1000, fixedRate=5000) :第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次
@Scheduled(cron="/5") :通过cron表达式定义规则

2、定义时间打印定时器

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * 时间定时任务
 */
@Component
public class TimeTask {
    Logger LOG = LoggerFactory.getLogger(TimeTask.class.getName()) ;
    private static final SimpleDateFormat format =
            new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;
    /**
     * 每3秒打印一次系统时间
     */
    @Scheduled(fixedDelay = 3000)
    public void systemDate (){
        LOG.info("当前时间::::"+format.format(new Date()));
    }
}

3、启动类开启定时器注解

@EnableScheduling   // 启用定时任务
@SpringBootApplication
public class TaskApplication {
    public static void main(String[] args) {
        SpringApplication.run(TaskApplication.class,args) ;
    }
}

四、异步任务应用

1、编写异步任务类

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
@Component
public class AsyncTask {
    private static final Logger LOGGER = LoggerFactory.getLogger(AsyncTask.class) ;
    /*
     * [ asyncTask1-2] com.boot.task.config.AsyncTask : ======异步任务结束1======
     * [ asyncTask1-1] com.boot.task.config.AsyncTask : ======异步任务结束0======
     */
    // 只配置了一个 asyncExecutor1 不指定也会默认使用
    @Async
    public void asyncTask0 () {
        try{
            Thread.sleep(5000);
        }catch (Exception e){
            e.printStackTrace();
        }
        LOGGER.info("======异步任务结束0======");
    }
    @Async("asyncExecutor1")
    public void asyncTask1 () {
        try{
            Thread.sleep(5000);
        }catch (Exception e){
            e.printStackTrace();
        }
        LOGGER.info("======异步任务结束1======");
    }
}

2、指定异步任务执行的线程池

这里可以不指定,指定执行的线城池,可以更加方便的监控和管理异步任务的执行。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
/**
 * 定义异步任务执行的线程池
 */
@Configuration
public class TaskPoolConfig {
    @Bean("asyncExecutor1")
    public Executor taskExecutor1 () {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 核心线程数10:线程池创建时候初始化的线程数
        executor.setCorePoolSize(10);
        // 最大线程数20:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
        executor.setMaxPoolSize(20);
        // 缓冲队列200:用来缓冲执行任务的队列
        executor.setQueueCapacity(200);
        // 允许线程的空闲时间60秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
        executor.setKeepAliveSeconds(60);
        // 线程池名的前缀:设置好了之后可以方便定位处理任务所在的线程池
        executor.setThreadNamePrefix("asyncTask1-");
        /*
        线程池对拒绝任务的处理策略:这里采用了CallerRunsPolicy策略,
        当线程池没有处理能力的时候,该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;
        如果执行程序已关闭,则会丢弃该任务
         */
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean
        executor.setWaitForTasksToCompleteOnShutdown(true);
        // 设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住。
        executor.setAwaitTerminationSeconds(600);
        return executor;
    }
}

3、启动类添加异步注解

@EnableAsync        // 启用异步任务
@SpringBootApplication
public class TaskApplication {
    public static void main(String[] args) {
        SpringApplication.run(TaskApplication.class,args) ;
    }
}

4、异步调用的测试接口

@RestController
public class TaskController {
    @Resource
    private AsyncTask asyncTask ;
    @RequestMapping("/asyncTask")
    public String asyncTask (){
        asyncTask.asyncTask0();
        asyncTask.asyncTask1();
        return "success" ;
    }
}

参考源码https://gitee.com/cicadasmile/spring-boot-base/tree/master/node04-boot-task

标签:异步,任务,线程,org,import,定时,public
From: https://www.cnblogs.com/wdswgj/p/17505865.html

相关文章

  • 定时任务相关命令
    目录定时任务相关命令1、日志目录:var/log/cron*2、定期执行程序的命令:crontab[-uuser]{-l|-r|-e}3、定时任务时间格式说明:f1f2f3f4f5program4、crontab服务管理定时任务相关命令Linux下的任务调度分为两类,系统任务调度和用户任务调度系统任务调度就是系统周......
  • Spring Boot - 异步任务
    SpringBoot-异步任务前言有时候,前端可能提交了一个耗时任务,如果后端接收到请求后,直接执行该耗时任务,那么前端需要等待很久一段时间才能接受到响应。如果该耗时任务是通过浏览器直接进行请求,那么浏览器页面会一直处于转圈等待状态。一个简单的例子如下所示:@RestController@R......
  • Microsoft Message Queuing(MSMQ)是由微软开发的一种消息队列服务,用于在分布式应用程序
    MicrosoftMessageQueuing(MSMQ)是由微软开发的一种消息队列服务,用于在分布式应用程序之间进行异步通信。它提供了一种可靠的方式来在不同的应用程序之间发送消息,并确保消息的可靠传递。MSMQ基于消息队列的原理,应用程序可以将消息发送到队列中,然后其他应用程序可以从队列中接收这......
  • celery笔记七之周期/定时任务及crontab定义
    本文首发于公众号:Hunter后端原文链接:celery笔记七之周期/定时任务及crontab定义periodictask,即为周期,或者定时任务,比如说每天晚上零点零分需要运行一遍某个函数,或者每隔半小时运行一遍该函数,都是这种任务的范畴。在第一篇笔记的时候我们就介绍过celery的组件构成,其中有一......
  • 死信 与 死信交换机【Spring Cloud - 服务异步通信】
    什么是死信?当一个队列中的消息满足下列情况之一时,可以称为死信(deadletter):- 消费者使用basic.reject或basic.nack声明消费失败,并且消息的requeue参数设置为false- 消息是一个过期消息,超时无人消费- 要投递的队列消息慢了,无法投递 什么是死信交换......
  • 异步注解@Async使用自定义线程池
    1.@Async注解@Async是java中一个注解,其作用就是加上该注解的类或方法能够异步执行任务,该注解添加到方法上时,表示该方法是异步方法,添加到类上时,表示该类中的所有方法都是异步方法。该注解的代码为:可以看出其是作用在类和方法上,能够在运行时被获取到。当在使用@Async时,如果不指......
  • 同步调用和异步调用
    一、同步调用同步调用的调用链:调用者需要等待服务提供者响应,如果调用链过长则响应时间等于每次调用的时间之和调用链中的每个服务在等待响应过程中,不能释放请求占用的资源,高并发场景下会极度浪费系统资源如果服务提供者出现问题,所有调用方都会跟着出问题,如同多米......
  • 【源码阅读】5. Broker Load 导入任务的执行流程
    load_stmt::=KW_LOADKW_LABELjob_label:labelLPARENdata_desc_list:dataDescListRPARENopt_broker:brokeropt_properties:properties{:RESULT=newLoadStmt(label,dataDescList,broker,properties);:}|KW_LOADKW_LAB......
  • 【源码阅读】4. Stream Load 导入任务的执行流程
     FE起手路由在访问curl--location-trusted-uroot:-Ttest.csv-H"column_separator:,"http://127.0.0.1:8030/api/demo/example_tbl/_stream_load时,FE如下操作:● 检查用户名密码● 检查权限● 随机选择一个BE,Redirect到这个BE上 BE_stream_load的handler......
  • MaskFormer:将语义分割和实例分割作为同一任务进行训练
    前言 本文介绍了FacebookAIResearch在21年发布的一种超越这些限制的实例分割方法MaskFormer。本文转载自DeepHubIMBA作者|HannaMergui仅用于学术分享,若侵权请联系删除欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。CV......