SpringBoot implementa tarefas assíncronas e tarefas de temporização

Plataforma do autor:

| CSDN: blog.csdn.net/qq_41153943

| Pepitas: juejin.cn/user/651387…

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

| GitHub: github.com/JiangXia-10…

| Conta pública do WeChat: 1024 notas

Este artigo tem cerca de 6339 palavras e o tempo estimado de leitura é de 15 minutos

prefácio

Na grande maioria das aplicações java, muitos cenários são interagidos de forma síncrona, então uma vez que há um terceiro interagindo, é muito provável que haja um problema de atraso na interação, então você deve considerar o uso de Multithreading, mas depois do Spring3 ele tem tarefas assíncronas integradas para usarmos.

tarefa assíncrona

Para usar assincronia no springboot, basta usar as anotações @EnableAysnc e @Aysnc:

A anotação @EnableAsync indica a ativação do suporte para tarefas assíncronas;

A anotação @Async é usada para declarar uma ou mais tarefas assíncronas, que podem ser adicionadas a um método ou classe e adicionadas a uma classe para indicar que toda a classe é operada usando esse conjunto de encadeamentos customizado;

Casos de Uso

Na classe de inicialização de springboot, adicione a anotação @EnableAsync para indicar que o suporte a tarefas assíncronas está ativado:

@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
复制代码

O resultado da operação é o seguinte:

foto

foto

O console executa o salto de página primeiro e a saída após 10 segundos Desejo a todos um feliz ano do tigre, indicando que o método é executado de forma assíncrona!

tarefa cronometrada

Em muitos cenários de aplicativos reais, algumas tarefas cronometradas precisam ser usadas. Como relatórios de log, e-mails agendados, avisos agendados, etc. No entanto, o Spring também nos fornece uma maneira de executar o agendamento de tarefas de forma assíncrona, fornecendo as interfaces TaskExecutor e TaskScheduler. As tarefas agendadas aqui usam principalmente as duas anotações @EnableScheduling e @Scheduled:

A anotação @EnableScheduling também é usada na classe principal do SpringBootApplication para indicar que as tarefas agendadas estão habilitadas

A anotação @Scheduled indica como usar tarefas agendadas. Existem principalmente 8 parâmetros ou atributos aqui.

Seu código fonte é o seguinte:

@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 expressão cron:

[秒] [分] [小时] [日] [月] [周] [年] //但是这里的年不是必须的域,可以省略[年],则一共6个域
second,minute,hour,day of month,month,day of week
复制代码
campo mesada
curingas permitidos
É necessário?
Segundo
0-59
, -* / sim
apontar 0-59 , -* / sim
Hora 0-23 , -* / sim
data 1-31 , -* ? / LW  sim
mês 1-12 , -* / sim
Semana 0-7 ou SUN-SAT  , -* ? / EU # sim
Ano
1970-2099 , - * / não

ilustrar

1. * significa todos os valores. Por exemplo: configurar * no campo minuto significa que ele será acionado a cada minuto.

2. ? significa não especificar um valor. O cenário usado é que você não precisa se preocupar com o valor desse campo definido atualmente. Por exemplo: para acionar uma operação no dia 10 de cada mês, mas não importa que dia da semana seja, então o campo que precisa ser definido como “?” é definido especificamente como 0 0 0 10 * ?

3. - Indica o intervalo. Por exemplo, definir "10-12" na hora significa que ela será acionada às 10, 11 e 12 horas.

4. , significa especificar vários valores, por exemplo, definir "MON, WED, FRI" no campo da semana significa acionar na segunda, quarta e sexta-feira

5. / é usado para acionamento incremental. Por exemplo, definir "5/15" acima do segundo significa que, a partir de 5 segundos, o gatilho será acionado a cada 15 segundos (5,20,35,50). Defina '1/3' no campo do dia para iniciar no primeiro dia de cada mês e acionar a cada três dias.

6. L significa o último significado. Na configuração do campo dia, significa o último dia do mês atual (conforme o mês atual, se for fevereiro, também será baseado no fato de ser um ano bissexto [bissexto]), e na semana campo, significa sábado, o que equivale a "7" ou "SAT". Se um número for adicionado antes de "L", significa o último dos dados. Por exemplo, definir o formato "6L" no campo da semana significa "a última sexta-feira deste mês"

7. W significa o dia útil mais próximo da data especificada (segunda a sexta) Por exemplo, definir "15W" no campo dia significa acionar no dia útil mais próximo do dia 15 de cada mês. Se o dia 15 for um sábado, encontre o acionador na sexta-feira (14) mais próxima, se o dia 15 cair em um fim de semana, encontre a próxima segunda-feira (16) para acionar. Se o dia 15 for um dia útil (segunda-feira até a semana 5), ​​será acionado nesse dia. Se o formato especificado for "1W", significa acionamento no dia útil mais próximo após o dia 1º de cada mês. Se o dia 1 for um sábado, será acionado na próxima segunda-feira do dia 3. (Nota, apenas números específicos podem ser definidos antes de "W", o intervalo "-" não é permitido).

8. # número de série (indica o número de semanas de cada mês), por exemplo, definir "6#3" no campo da semana significa o terceiro sábado de cada mês. Observe que se você especificar "#5", é exatamente quinta semana Se não houver sábado, a configuração não será acionada (perfeito para Dia das Mães e Dia dos Pais); Dica: 'L' e 'W' podem ser usados ​​em combinação. Se for definido "LW" no campo dia, significa acionamento no último dia útil deste mês; a configuração do campo semana não diferencia maiúsculas de minúsculas se forem usadas letras em inglês, ou seja, MON é o mesmo que seg.

exemplo

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

2. zona

Fuso horário, o que significa receber um java.util.TimeZone#ID. expressões cron serão analisadas com base neste fuso horário. O padrão é uma string vazia, ou seja, o fuso horário onde o servidor está localizado. Por exemplo, o fuso horário que geralmente usamos é Asia/Shanghai. Geralmente deixamos este campo em branco.

3. atraso fixo

Quanto tempo para executar após o último ponto de tempo de execução.

4. FixedDelayString

Tem o mesmo significado que fixedDelay, mas na forma de uma string. A única diferença é o suporte para espaços reservados.

5. taxa fixa

Quanto tempo para executar após o último ponto de tempo de execução.

6. FixedRateString

Tem o mesmo significado que 5. fixedRate, apenas na forma de uma string. A única diferença é o suporte para espaços reservados.

7. atraso inicial

Quanto tempo para executar após o primeiro atraso.

8. InitialDelayString

Mesmo significado de initialDelay, mas na forma de uma string. A única diferença é o suporte para espaços reservados.

O caso

Da mesma forma, a anotação @EnableScheduling deve ser usada primeiro na classe principal

@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"));
    }

}
复制代码

A hora é agora, 16:17:

foto

resultado da operação:


foto

Resumir

Tarefas são muito comuns em cenários de desenvolvimento.A combinação de tarefas assíncronas e tarefas cronometradas pode alcançar muitas funções, e o spring forneceu funções sobre tarefas cronometradas e tarefas assíncronas, o que pode simplificar muito nosso desenvolvimento.

Endereço de Origem:

github.com/JiangXia-10…

Bem-vindo ao download, estrela!

Por fim, desejo a todos um feliz ano novo, um próspero ano do tigre, um próspero ano novo, trabalho tranquilo e salário em dobro! !

sugestão relacionada

Acho que você gosta

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