SpringBoot implementa tareas asincrónicas y tareas de temporización

Plataforma de autor:

| CSDN: blog.csdn.net/qq_41153943

| Pepitas: juejin.cn/user/651387…

| Zhihu: www.zhihu.com/people/1024…

| GitHub: github.com/JiangXia-10…

| Cuenta pública de WeChat: 1024 notas

Este artículo tiene unas 6339 palabras y el tiempo estimado de lectura es de 15 minutos.

prefacio

En la gran mayoría de las aplicaciones java, muchos escenarios se interactúan de manera síncrona, por lo que una vez que hay un tercero interactuando, es muy probable que haya un problema de retraso en la interacción, entonces hay que considerar usar Multithreading, pero después de Spring3 tiene tareas asincrónicas integradas para que las usemos.

tarea asincrónica

Para usar asincronía en springboot, solo necesita usar las anotaciones @EnableAysnc y @Aysnc:

La anotación @EnableAsync indica la habilitación de la compatibilidad con tareas asincrónicas;

La anotación @Async se usa para declarar una o más tareas asincrónicas, que se pueden agregar a un método o clase y agregar a una clase para indicar que toda la clase se opera con este grupo de subprocesos personalizado;

Casos de uso

En la clase de inicio de springboot, agregue la anotación @EnableAsync para indicar que la compatibilidad con tareas asincrónicas está habilitada:

@SpringBootApplication
@EnableConfigurationProperties
@EnableAsync
public class Main {
    public static final Logger logger = LoggerFactory.getLogger(Main.class);
    public static void main(String[] args) {
        logger.info("Spring Boot Beginning ...");
        SpringApplication.run(Main.class, args);
    }
}
复制代码
Service类的方法上添加@async注解:
@Servicepublic class AsyncService {    @Async //@Async注解来声明一个或多个异步任务,可以加在方法或者类上,加在类上表示这整个类都是使用这个自定义线程池进行操作    public void aysncService(){        System.out.println("今天是大年初一!"+System.currentTimeMillis());        try {            Thread.sleep(10000);        }catch (Exception e){            e.printStackTrace();        }        System.out.println("祝大家虎年大吉!"+System.currentTimeMillis());    }}
controller:
@RestControllerpublic class AsyncController {    @Autowired    AsyncService asyncService;    @GetMapping("/async")    public String asyncmethod1(){        asyncService.aysncService();        return "async success"+System.currentTimeMillis();    }}
地址栏输入:
http://localhost:8081/share/async
复制代码

El resultado de la operación es el siguiente:

imagen

imagen

La consola ejecuta el salto de página primero y luego de 10 segundos les deseo a todos un feliz año del tigre, lo que indica que el método se ejecuta de forma asíncrona.

tarea cronometrada

En muchos escenarios de aplicaciones reales, es necesario utilizar algunas tareas cronometradas. Tales como informes de registro, correos electrónicos programados, advertencias programadas, etc. Sin embargo, Spring también nos proporciona una forma de ejecutar la programación de tareas de forma asincrónica, proporcionando interfaces TaskExecutor y TaskScheduler. Las tareas programadas aquí utilizan principalmente las dos anotaciones @EnableScheduling y @Scheduled:

La anotación @EnableScheduling también se usa en la clase principal de SpringBootApplication para indicar que las tareas programadas están habilitadas.

La anotación @Scheduled indica cómo usar las tareas programadas. Hay principalmente 8 parámetros o atributos aquí.

Su código fuente es el siguiente:

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
    /**
     * A cron-like expression, extending the usual UN*X definition to include
     * triggers on the second as well as minute, hour, day of month, month
     * and day of week.  e.g. {@code "0 * * * * MON-FRI"} means once per minute on
     * weekdays (at the top of the minute - the 0th second).
     * @return an expression that can be parsed to a cron schedule
     * @see org.springframework.scheduling.support.CronSequenceGenerator
     */
    String cron() default "";
    /**
     * A time zone for which the cron expression will be resolved. By default, this
     * attribute is the empty String (i.e. the server's local time zone will be used).
     * @return a zone id accepted by {@link java.util.TimeZone#getTimeZone(String)},
     * or an empty String to indicate the server's default time zone
     * @since 4.0
     * @see org.springframework.scheduling.support.CronTrigger#CronTrigger(String, java.util.TimeZone)
     * @see java.util.TimeZone
     */
    String zone() default "";
    /**
     * Execute the annotated method with a fixed period in milliseconds between the
     * end of the last invocation and the start of the next.
     * @return the delay in milliseconds
     */
    long fixedDelay() default -1;
    /**
     * Execute the annotated method with a fixed period in milliseconds between the
     * end of the last invocation and the start of the next.
     * @return the delay in milliseconds as a String value, e.g. a placeholder
     * @since 3.2.2
     */
    String fixedDelayString() default "";
    /**
     * Execute the annotated method with a fixed period in milliseconds between
     * invocations.
     * @return the period in milliseconds
     */
    long fixedRate() default -1;

    /**
     * Execute the annotated method with a fixed period in milliseconds between
     * invocations.
     * @return the period in milliseconds as a String value, e.g. a placeholder
     * @since 3.2.2
     */
    String fixedRateString() default "";
    /**
     * Number of milliseconds to delay before the first execution of a
     * {@link #fixedRate()} or {@link #fixedDelay()} task.
     * @return the initial delay in milliseconds
     * @since 3.2
     */
    long initialDelay() default -1;
    String initialDelayString() default "";
}
复制代码

1. atributo cron

formato de expresión cron:

[秒] [分] [小时] [日] [月] [周] [年] //但是这里的年不是必须的域,可以省略[年],则一共6个域
second,minute,hour,day of month,month,day of week
复制代码
campo prestación
se permiten comodines
¿Es obligatorio?
Segundo
0-59
, -* /
punto 0-59 , -* /
Hora 0-23 , -* /
fecha 1-31 , -* ? / LW 
mes 1-12 , -* /
Semana 0-7 o DOM-SAB  , -* ? / L#
Año
1970-2099 , - * / No

ilustrar

1. * significa todos los valores. Por ejemplo: establecer * en el campo de minutos significa que se activará cada minuto.

2. ?significa no especificar un valor. El escenario utilizado es que no necesita preocuparse por el valor de este campo establecido actualmente. Por ejemplo: para activar una operación el día 10 de cada mes, pero no importa qué día de la semana sea, por lo que el campo que debe establecerse como "?" se establece específicamente en 0 0 0 10 *?

3.- Indica el intervalo. Por ejemplo, establecer "10-12" en la hora significa que se activará a las 10, 11 y 12 en punto.

4. , significa especificar múltiples valores, por ejemplo, establecer "LUN, MIÉRCOLES, VIERNES" en el campo de la semana significa activar los lunes, miércoles y viernes

5. / se utiliza para la activación incremental. Por ejemplo, configurar "5/15" por encima del segundo significa que a partir de 5 segundos, el gatillo se activará cada 15 segundos (5,20,35,50). Establezca '1/3' en el campo de día para que comience el 1 de cada mes y se active cada tres días.

6. L significa el último significado. En la configuración del campo de día, significa el último día del mes actual (según el mes actual, si es febrero, también se basará en si es un año bisiesto [bisiesto]), y en la semana campo, significa sábado, que es equivalente a "7" o "SAT". Si se añade un número antes de "L", significa el último de los datos. Por ejemplo, establecer el formato "6L" en el campo de la semana significa "el último viernes de este mes"

7. W significa el día hábil más cercano a la fecha especificada (de lunes a viernes).Por ejemplo, establecer "15W" en el campo de día significa que se activará el día hábil más cercano al día 15 de cada mes. Si el día 15 es sábado, busque el desencadenante el viernes más cercano (14), si el 15 cae en fin de semana, busque el siguiente lunes (16) para desencadenar Si el 15 es un día laborable (lunes a la semana 5), ​​se activará ese día. Si el formato especificado es "1W", significa que se activa el día hábil más cercano después del 1 de cada mes. Si el día 1 es sábado, se activará el próximo lunes del día 3. (Nota, solo se pueden configurar números específicos antes de "W", el intervalo "-" no está permitido).

8、# 序号(表示每月的第几个周几),例如在周字段上设置”6#3”表示在每月的第三个周六.注意如果指定”#5”,正好第五周没有周六,则不会触发该配置(用在母亲节和父亲节再合适不过了) ;小提示:’L’和 ‘W’可以一组合使用。如果在日字段上设置”LW”,则表示在本月的最后一个工作日触发;周字段的设置,若使用英文字母是不区分大小写的,即MON与mon相同。

举例

cron = "*/10 * * * * ?" //每隔10秒执行一次:
cron = "* * * * * 0-7" //周一到周天每天每时每分每秒都执行一次
cron = "0-4 * * * * 0-7" //周一到周天每天每时每分1-5秒每秒都执行一次
复制代码

2. zone

时区,表示接收一个java.util.TimeZone#ID。cron表达式会基于该时区解析。默认是一个空字符串,即取服务器所在地的时区。比如我们一般使用的时区Asia/Shanghai。该字段我们一般留空。

3. fixedDelay

上一次执行完毕时间点之后多长时间再执行。

4. fixedDelayString

与 fixedDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。

5. fixedRate

上一次开始执行时间点之后多长时间再执行。

6. fixedRateString

与 5. fixedRate 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。

7. initialDelay

第一次延迟多长时间后再执行。

8. initialDelayString

与 initialDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。

案例

同样的首先主类上要使用@EnableScheduling注解

@EnableScheduling //开启定时任务注解
public class SpringbootdemoApplication {
    private static final Logger logger = LoggerFactory.getLogger(SpringbootdemoApplication.class);
    public static void main(String[] args) {
        logger.info("===============项目启动了===============");
        SpringApplication.run(SpringbootdemoApplication.class, args);
        logger.info("===============启动成功了===============");
    }
}
复制代码
@RestController
public class SceduleController {

    @GetMapping("/say")
    @Scheduled(fixedDelay = 10000, initialDelay = 5000/*容器启动后延迟5秒后在执行一次定时器,以后每10秒再执行一次定时器*/)
    public String say(){
        System.out.println("你好"+System.currentTimeMillis());
        return "你好"+System.currentTimeMillis();
    }

    @GetMapping("/happynewyear")
    @Scheduled(cron = "0 18 16 * * ?"/*每天16点18执行一次*/)
    public String sayhappynewyear(){
        System.out.println("虎年大吉"+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        return "虎年大吉"+LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }

}
复制代码

现在时间是,16:17:

imagen

运行结果:


imagen

总结

任务是开发场景中很常见的,结合异步任务和定时任务能够实现很多的功能,而spring已经提供了关于定时任务和异步任务的功能,能够大大简化我们的开发。

源码地址:

github.com/JiangXia-10…

欢迎下载、Star!

最后祝大家新年快乐,虎年大吉,新的一年旺旺旺,工作顺利,薪资翻倍!!

相关推荐

Supongo que te gusta

Origin blog.csdn.net/qq_41153943/article/details/124944826
Recomendado
Clasificación