推广

SpringBoot 整合定时任务与线程池

iseeyu2年前 (2024-02-21)推广121

image-20210510100234397.png

现在定时任务的题已经解决了,但还需要排除周六和周日。解决的思路为执行定时任务时,判断当前是否为周六或周日,不是则正常执行,反之则跳过此次任务。

添加判断代码

package com.lx.dca.okr.batch.task;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.annotation.Schedules;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
* 定时提醒类
* @author wangcp
* @date 2021/05/08 18:04
**/
@Component
public class TimingRemindTask {

//    @Schedules({@Scheduled(cron = "0 15 11,14,16 * * ? "),@Scheduled(cron = "0 0 18 * * ? ")})
    @Schedules({@Scheduled(cron = "0 0/1 * * * ?  "),@Scheduled(cron = "0 40,45,50,55 9 * * ? ")})
    public void remindTask(){
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 不为周末时进行执行
        if(this.isWeekends(date)){
            System.out.println("执行定时任务了,执行时间为:" + sdf.format(date));
        }
    }


    /**
    * 根据传入时间进行判断,若为周六日则返回false,否则返回true
    * @author wangcp
    * @date 2021/05/10 10:24
     * @param date
    * @return boolean
    */
    private boolean isWeekends(Date date){
        Calendar instance = Calendar.getInstance();
        instance.setTime(date);
        if(instance.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || instance.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY){
            return false;
        }
        return true;
    }

}

添加线程池

线程池配置类

有关线程池不做详细介绍,前面有专门介绍线程池的文章。

package com.lx.dca.okr.batch.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.TaskExecutor;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;

/**
* 线程池配置类
* @author wangcp
* @date 2021/05/08 17:56
**/
@Data
@EnableAsync
@Configuration
@ConfigurationProperties(prefix = "poolconfig")
public class ThreadPoolConfig {
    /**
     * 线程池维护线程的最少数量,即使没有任务需要执行,也会一直存活
     */
    private int corePoolSize;

    /**
     * 线程池维护线程的最大数量
     */
    private int maxPoolSize;

    /**
     * 缓存队列(阻塞队列)当核心线程数达到最大时,新任务会放在队列中排队等待执行
     */
    private int queueCapacity;

    /**
     * 允许的空闲时间,当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量=corePoolSize
     */
    private int keepAlive;

    @Bean
    public TaskExecutor taskExecutor(){
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //设置核心线程数
        executor.setCorePoolSize(corePoolSize);
        // 设置最大线程数
        executor.setMaxPoolSize(maxPoolSize);
        // 设置队列容量
        executor.setQueueCapacity(queueCapacity);
        // 设置允许的空闲时间(秒)
        executor.setKeepAliveSeconds(keepAlive);
        // 设置默认线程名称
        executor.setThreadNamePrefix("thread-");
        // 设置拒绝策略rejection-policy:当pool已经达到max size的时候,如何处理新任务
        // CALL_RUNS:不在新线程中执行任务,二十由调用者所在的线程来执行
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 等待所有任务结束后在关闭线程池
        executor.setWaitForTasksToCompleteOnShutdown(true);
        return executor;
    }
}

任务接口与实现类

TaskService

package com.lx.dca.okr.batch.service;

public interface TaskService {
    void executeRemindMessage() throws InterruptedException;
}

TaskServiceImpl

package com.lx.dca.okr.batch.service.impl;

import com.lx.dca.okr.batch.service.TaskService;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
* 定时任务执行类
* @author wangcp
* @date 2021/05/10 10:42
**/
@Service
public class TaskServiceImpl implements TaskService {

    @Async("taskExecutor")
    @Override
    public void executeRemindMessage() throws InterruptedException {
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("当前运行线的程名称:" + Thread.currentThread().getName() + " ,执行定时任务了,执行时间为:" + sdf.format(date));
        Thread.sleep(1500);
    }
}

执行结果如下:

image-20210510110433844.png

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/57664.html

相关文章

几分钟释放的能量达到太阳总能量的万亿倍,六千光年内寸草不生

宇宙中随时都可能上演各种猛烈事件,猛烈到超乎我们的想象。拿我们的太阳来说,太阳每时每刻都在不停地“爆炸”,其实爆炸都发生在核心,我们很难直观地感受到。但氢弹的威力我们都深有体会,而太阳就相当于无数个氢弹同时爆炸。太阳每秒钟释放的能量足够全人类使用大约70万年之久!但是照射到...

淘宝开店上传图片怎么传(淘宝店上传宝贝图片步骤)

淘宝开店上传图片怎么传(淘宝店上传宝贝图片步骤)

先进入到店铺的后台,找到图片空间选项并点击进入,在这里,新建一个文件夹并命名。再打开新建的文件夹,点击右上角的上传,选择要上传的图片,点击确定就行。...

新消费品牌成熟期和衰退期的营销策略(品牌营销策略)

新消费品牌成熟期和衰退期的营销策略(品牌营销策略)

当你的主要目标市场都已经占领完毕,并且已经感觉到增长乏力了,你就进入到成熟期了。 成熟期的特点 1、 销售额最大,但销售额增长放缓,利润增长放缓。 2、 市场竞争变得异常激烈,价格战压力大。 3、 新品牌新产品层出不穷。 成熟期的主要任务 1、 通过丰富的产品线,牢牢占据你...

前三页关键词排名快速冲首页的方法

前三页关键词排名快速冲首页的方法

很多站长相信都遇到过这样的问题,排名进入了前三页,以为网站可以很快就出现效果了,然而过了很长一段时间,排名也进入不了首页,这是最让人纠结的时候,不知道自己到底哪做的还不够,今天就和大家说说,前三页的关键词排名快速冲首页的方法: 第一种:关键词的互点。这一招是很久很久的招式了,但是屡试不爽,很...

如何网络推广为你出招解决网站跳出率高问题

如何网络表示每个网站多少都会有点跳出率,但能理解,因为毕竟网站不可能得到所有人的满意,稍微有点跳出率的网站还算正常,但跳出率高的网站就说明你的网站真的存在一些问题,所以就需要优化人员进行更精准的分析原因,解决问题,从而获得更多的流量和客户。那么如何网络推广网站跳出率高到底...

跟“华为”学习销售渠道建设,企业做大不是梦

跟“华为”学习销售渠道建设,企业做大不是梦

在经济日益严峻的大环境下,企业要想生存,并取得辉煌的成绩,除了产品、人才这两个众所周知的要素以外,成了第三个必不可少的上升通道。可以看到,随着市场竞争的日益激烈,如何吸引并激励更多的合作伙伴更好地销售自己的产品,成为众多供应商渠道管理的一个重要课题。作为国内较早建立渠道营销...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片