推广

SpringBoot 整合定时任务与线程池

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

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://0291.com.cn/post/57664.html

相关文章

抖音号怎么运营?掌握这25个技巧

抖音号怎么运营?掌握这25个技巧

本文转载自:运营公举小磊磊(公众号ID:gongjulei) 作者:孟德航 作为一个从事了三年内容运营的互联网人,这个时间说长不长说短也不短。 从最基础的编辑再到内容营销,这一路走来,我认为在做内容运营离不开以下两点: 1、持续输出高质量的内容 2、内容紧跟热点话题 20...

企业网站SEO推广要做好哪些事情。

企业网站SEO推广要做好哪些事情。

如果要做用低价做好网络营销,那么seo肯定是不能缺少的一环,特别的对于有seo技术的人来说,seo就是低成本换取高收益的一种方式,随着搜索引擎算法的不断调整,如今的seo学问变得越来越复杂,但是很多中小企业还是通过seo获取到流量和客户,seo作为一种廉价的营销方式,让很多公司都有了不错的业绩,那么...

网站关键词布局的方法。

网站关键词布局的方法。

这里是获客学社,每天与你共享获客之道,让获客更简略做SEO优化的各位,是否常常都在为关键词布局而烦恼?信任刚触摸SEO的应该都遇到这种状况其实许多SEO都是以自己的片面思想来挑选关键词,也不注重关键词剖析,要么便是挑选的都是广泛的竞赛力大的关键词,所以,最终导致网站呈现这样的问题。...

作为一个SEOer应该把搜索引擎用到什么地步。

作为一个SEOer应该把搜索引擎用到什么地步。

从业者,不懂高级搜索指令也。但我会耍小聪明,下边让我把我所常用的搜索引擎搜索经验一一扒出来。 一.鉴别别人所发段子的原创与抄袭 作为一个SEO就是一个辨认真伪的高手,专抓那些抄袭别人段子还不保留人家版权的,更有甚者直言那是自己原创的人。今天我就去糗事百科上不断刷新“最新”那个页面,然后...

十年推广,两年创业:从独角兽跌落神坛,经验得失都在这里了!

十年推广,两年创业:从独角兽跌落神坛,经验得失都在这里了!

从独角兽到跌落神坛,从疯狂扩张到收缩求存。这两年,我的创业公司推广史你得来看看。   O2O概念是从前年开始火起来的,无论是传统公司还是互联网公司,带上“O2O”这个词就大有故事可讲,但从去年下半年开始,很多公司日子变得难过,倒闭、裁员、被收购等成了跟随O2O企业的字...

B站推广的审核机制是什么的,为什么会存在审核不通过的 ...

B站推广的审核机制是什么的,为什么会存在审核不通过的 ...

视频已经被发布,且没有限流,但是每次都会被拒绝,显示审核不通过。B站的推广是有什么隐形条件么?比如某种类型的不可以推广?...

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

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