美文网首页
Spring 随笔整理 注解

Spring 随笔整理 注解

作者: 莽夫_b1e1 | 来源:发表于2022-11-28 14:09 被阅读0次

Spring 随笔整理 注解

@Scheduled

Annotation @EnableScheduling用来开启Spring 的schedule task执行的能力,一般作用于配置类。该annotation会寻找spring container中的使用@Scheduled声明的bean。
@EnableScheduling (一般做Application 启动类上使用 或者 在class 上面是用 //表示开启定时任务)
@Scheduled支持多种类型的计划任务:

cron:设置定时格式;

zone:设置时区;

fixedDelay和fixedDelayString: 在上次任务执行完成后延迟多长时间执行;

fixedRate和fixedRateString:上一个任务开始执行后多长时间执行;

initialDelay 和initialDelayString:表示第一个延迟执行时间。

下面是Spring boot中使用schedule的示例。
Main class:

@SpringBootApplication
@EnableScheduling // 启动定时任务

public class ScheduleApplicationWithAnnotation {
    private static final Logger log = LoggerFactory.getLogger(ScheduleApplicationWithAnnotation.class);

    public static void main(String[] args) {
        log.info("Start ScheduleApplicationWithAnnotation.. ");
        SpringApplication.run(ScheduleApplicationWithAnnotation.class, args);
    }

}

Scheduler class:

@Component
public class ScheduleDemo {
    private static final Logger log = Logger.getLogger(ScheduleDemo.class);

    /**
     * 每次方法执行完毕后,等待5s再执行此方法。
     *  同时只能有个线程运行此方法
     */
    @Scheduled(fixedDelay=5000)
    public void fixedDelay() {
        try {
            // 执行方法需要10s
            Thread.sleep(1000 * 10);
        } catch (InterruptedException e) {
        }
        log.info("fixedDelay--");
    }

    /**
     * 每隔5s调用一次此方法,无论之前的方法是否执行完毕
     *  同时可能有N个线程执行此方法
     *  
     */
    @Scheduled(fixedRate=5000)
    public void fixedRate() {
        try {
            // 执行方法需要10s
            Thread.sleep(1000 * 10);
        } catch (InterruptedException e) {
        }
        log.info("fixedRate--");
    }

    /***
     * initialDelay: 第一次调用此方法前的等待时间
     * 
     */ 
    @Scheduled(initialDelay=1000, fixedRate=5000)
    public void initialDelayAndfixedRate() {
        log.info("initialDelayAndfixedRate--");
    }

    /**
     * 支持cron语法:
     * 每个参数的意义分别是: second, minute, hour, day of month, month, day of week
     * 
     * 如下:周一至周五,每隔5s执行一次方法
     */
    @Scheduled(cron="*/5 * * * * SUN-MON")
    public void cron() {
        log.info("cron--");
    }
}

下面是一个实际的例子。

Configuration class:

@Configuration
@EnableScheduling
@AutoConfigureAfter({DataSourceConfiguration.class, ServoMetricsAutoConfiguration.class})
public class MethodMonitorAutoConfiguration {
    @Bean
    public MethodMetricLogJob methodMetricLogJob(MonitorInMemoryCache monitorInMemoryCache, MethodMetricNaming methodMetricNaming){
        MethodAvgMetricReader reader = new MethodAvgMetricReader(monitorInMemoryCache.getMonitorRegistry(), methodMetricNaming);
        return new MethodMetricLogJob(reader);
    }
}
Job class:

@Slf4j
@AllArgsConstructor
public class MethodMetricLogJob {

    private final MetricReader metricReader;

    @Scheduled(fixedRate = PeriodWindow.DEFAULT_PERIOD)
    public void retrieveMetrics4MethodInvoke(){
        Runnable runnable = ()->{
            Iterable<Metric<?>> metrics = metricReader.findAll();
            for (Metric<?> metric : metrics) {
                log.info(metric.toString());
            }
        };
        new Thread(runnable, "MethodMetricLog").start();
    }
}

相关文章

网友评论

      本文标题:Spring 随笔整理 注解

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