ミリ秒単位で正確な、またはcronを使用したシンプルなタイミングタスクスケジューリング

package com.graborderboot.order.config;

import com.graborderboot.order.config.thread.IntegralEventExecutorRejectHandler;
import com.graborderboot.order.config.thread.ThreadExceptionHandle;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

/**
 * 线程池 配置
 *
 * @author
 * @date 2021/1/5 09:18
 */
@Configuration
@EnableAsync
public class ExecutorConfig {
    
    

    static {
    
    
        Thread.setDefaultUncaughtExceptionHandler(ThreadExceptionHandle.INSTANCE);
    }

    /**
     * 默认的线程池
     *
     * @return
     */
    @Bean
    @Primary
    @Qualifier("defaultExecutor")
    public Executor defaultExecutor() {
    
    
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(4);/*核心线程数*/
        executor.setMaxPoolSize(8);/*最大线程数*/
        executor.setQueueCapacity(30000);/*队列大小*/
        executor.setKeepAliveSeconds(60);/* 某线程空闲超过1分钟,就回收该线程*/
        executor.setAllowCoreThreadTimeOut(true);   // KeepAliveSeconds 设置也作用于【核心线程数】
        executor.setThreadNamePrefix("defaultExecutor-");
        //executor.setThreadFactory(traceableThreadFactory);
        //executor.setRejectedExecutionHandler(new MyRejectedExecutionHandler());
        //executor.setThreadPriority();
        //executor.setDaemon();
        executor.setAwaitTerminationSeconds(5);
        executor.setWaitForTasksToCompleteOnShutdown(true);
        executor.initialize();
        return executor;
    }

    @Bean
    @Qualifier("fixedRateExecutor")
    public Executor fixedRateExecutor() {
    
    
        return Executors.newScheduledThreadPool(100);
    }

    /**
     * 积分事件发日志
     *
     * @author
     * @date 2021/1/5 19:57
     * @param
     * @return java.util.concurrent.Executor
     **/
    @Bean
    @Qualifier("integralEventExecutorLog")
    public Executor tradeEventExecutorLog() {
    
    
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(7);/*核心线程数*/
        executor.setMaxPoolSize(7);/*最大线程数*/
        executor.setQueueCapacity(7000);/*队列大小*/
        executor.setKeepAliveSeconds(10);/* 某线程空闲超过7秒,就回收该线程*/
        executor.setAllowCoreThreadTimeOut(false);   // KeepAliveSeconds 设置也作用于【核心线程数】
        executor.setThreadNamePrefix("integralEventExecutorLog-");
        executor.setRejectedExecutionHandler(new IntegralEventExecutorRejectHandler());
        executor.setWaitForTasksToCompleteOnShutdown(true);
        executor.setAwaitTerminationSeconds(5);
        executor.initialize();
        return executor;
    }
}

/*
 * Copyright 2021 Wicrenet, Inc. All rights reserved.
 */
package com.graborderboot.order.schedule;

import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSON;
import com.graborderboot.order.chche.OrderScheduleCache;
import com.graborderboot.order.entity.UserModel;
import com.graborderboot.order.service.OrderService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.LocalDateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.concurrent.Executor;

//抢单线程
@Configuration
@EnableScheduling
@Slf4j
//public class OrderSchedule {
    
    
public class OrderSchedule implements SchedulingConfigurer {
    
    

    private volatile boolean            isOpen = true;                  //是否开启抢单线程。true为开启
    @Autowired
    private          OrderScheduleCache orderScheduleCache;
    @Autowired
    private          OrderService       orderService;
    @Autowired
    @Qualifier("fixedRateExecutor")
    public Executor taskExecutor;
    //每50毫秒秒执行一次
//    @Scheduled(fixedRate = 500)
//    public void testScheduler() {
    
    
//        if (isOpen) {
    
    
//            List<UserModel> users = this.orderService.getUsefulUsers();
//            log.info("执行动态定时任务运行中!: {},获取到的有效用户===>:{}", LocalDateTime.now().toString(), JSON.toJSON(users));
//            if (CollUtil.isNotEmpty(users)) {
    
    
//                users.parallelStream().forEach(item -> this.orderService.getOrder(item));
//            }
//        } else {
    
    
//            log.info("执行动态定时任务已停止!");
//        }
//    }

    @Scheduled(cron = "0/5 * * * * ?") //5秒
    private void getToken() {
    
    
        if (isOpen) {
    
    
            log.info("开始刷新失效token");
            this.orderService.refreshToken();
        }
    }

    //    @Override
//    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    
    
//        taskRegistrar.addTriggerTask(
//                () -> {
    
    
//                    if (isOpen) {
    
    
//                        log.info("执行动态定时任务运行中!: " + LocalDateTime.now().toLocalTime());
//                        List<UserModel> users = this.orderService.getUsefulUsers();
//                        log.info("获取到的用户===>" + JSON.toJSON(users));
//                        if (CollUtil.isNotEmpty(users)) {
    
    
//                            users.parallelStream().forEach(item -> this.orderService.getOrder(item));
//                        }
//                    } else {
    
    
//                        log.info("执行动态定时任务已停止!");
//                    }
//                },
//                triggerContext -> {
    
    
//                    String cron = orderScheduleCache.get("1");
//                    if (StringUtils.isEmpty(cron)) {
    
    
//                        cron = "0/10 * * * * ?";
//                        log.error("定时任务周期未配置!!!,默认为" + cron);
//                    } else {
    
    
//                        log.info("定时任务周期配置设置为 cron = " + cron);
//                    }
//                    return new CronTrigger(cron).nextExecutionTime(triggerContext);
//                }
//        );
//    }
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    
    
        taskRegistrar.setScheduler(this.taskExecutor);
        taskRegistrar.addTriggerTask(
                () -> {
    
    
                    if (isOpen) {
    
    
                        List<UserModel> users = this.orderService.getUsefulUsers();
                        log.info("执行动态定时任务运行中!: {},获取到的有效用户===>:{}", LocalDateTime.now().toString(), JSON.toJSON(users));
                        if (CollUtil.isNotEmpty(users)) {
    
    
                            users.parallelStream().forEach(item -> this.orderService.getOrder(item));
                        }
                    } else {
    
    
                        log.info("执行动态定时任务已停止!");
                    }
                },
                triggerContext -> {
    
    
                    Calendar nextExecutionTime = new GregorianCalendar();
                    Date lastActualExecutionTime = triggerContext.lastActualExecutionTime();
                    nextExecutionTime.setTime(lastActualExecutionTime != null ? lastActualExecutionTime : new Date());
                    String fixedRate = orderScheduleCache.getFixedRate("1");
                    if (StringUtils.isEmpty(fixedRate)) {
    
    
                        fixedRate = "3000";
                        log.error("定时任务周期未配置!!!,fixedRate默认为{}毫秒", fixedRate);
                    } else {
    
    
                        log.info("定时任务周期配置设置为 fixedRate={}毫秒", fixedRate);
                    }
                    nextExecutionTime.add(Calendar.MILLISECOND, Integer.parseInt(fixedRate));
                    return nextExecutionTime.getTime();
                }
        );
    }

    /**
     * 关闭
     */
    public synchronized void close() {
    
    
        this.isOpen = false;
    }

    /**
     * 开启
     */
    public synchronized void open() {
    
    
        this.isOpen = true;
    }

}

おすすめ

転載: blog.csdn.net/qq_40250122/article/details/112664705