1. 程式人生 > >spring boot定時任務中新建執行緒如何做到可控終止

spring boot定時任務中新建執行緒如何做到可控終止

最近遇到這樣的需求,要求是定時的執行任務,但是這些任務能夠根據控制及時的停止。

首先定時任務可以直接使用spring中的schedule註解方式實現。那麼如何控制已經啟動的任務及時停止呢?

下面說一下思路。首先利用spring的schedule註解方式進行定時任務的執行。然後,在每個定時任務中使用新建執行緒的方式進行任務的執行。在新建執行緒的run方法中通過檢測開關的狀態,如果開關開啟,則丟擲interruptException然後通過catch捕獲結束執行緒的執行即可。

下面是詳細的實現。

1、首先在spring boot中新增定時任務。

新增@EnableScheduling註解。

2、新增定時任務

package com.example.demo.task;


import com.example.demo.controller.TaskHelperController;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

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

@Component
public class TestTask {
    @Scheduled(cron = "0/5 * * * * ?")
    public void test() {
        Thread thread = new Thread(new Exetask());
        thread.start();
        System.out.println(thread.getName() + "===============begin" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()));
    }

    class Exetask implements Runnable {
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                try {
                    if (TaskHelperController.stopFlag) {
                        throw new InterruptedException();
                    }
                    Thread.sleep(3000);
                    System.out.println(Thread.currentThread().getName() + "   " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()));
                } catch (InterruptedException e) {
                    System.out.println(Thread.currentThread().getName() + "  stop!!!");
                    break;
                }
            }
        }
    }

}

3、對應的控制邏輯在另一個介面中

package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/taskHelper")
public class TaskHelperController {
    public static boolean stopFlag = false;

    @RequestMapping("/change")
    public String test(boolean flag) {
        TaskHelperController.stopFlag = flag;
        return "ok";
    }
}

4、這裡的開關標誌可以儲存在資料庫,快取等地方。

相關推薦

spring boot定時任務新建執行如何做到終止

最近遇到這樣的需求,要求是定時的執行任務,但是這些任務能夠根據控制及時的停止。 首先定時任務可以直接使用spring中的schedule註解方式實現。那麼如何控制已經啟動的任務及時停止呢? 下面說一下思路。首先利用spring的schedule註解方式進行定時任務的執

Spring Boot介面畫管理Quartz定時任務及多執行併發執行定時任務

工程程式碼示例   : Spring Boot整合持久化Quartz定時任務管理和介面展示 工程地址  : https://github.com/tjfy1992/SpringBootQuartz 執行方法 Spring Boot工程已經集成了伺

Spring Boot 定時任務執行和多執行

Spring Boot 的定時任務: 第一種:把引數配置到.properties檔案中: 程式碼: package com.accord.task; import java.text.SimpleDateFormat; import java.util.Date; im

spring boot-高階話題之 多執行、@EnableScheduling開啟計劃任務的支援(2)

spring通過任務執行器(TaskExecutor)來實現多執行緒和併發程式設計。 ThreadPoolTaskExecutor可實現一個基於執行緒池的TaskExecutor。 實際開發中任務一般是非阻礙的,即非同步的,通過@EnableAsync開啟對非同步任務的支援

Spring-boot使用Quartz實現多執行排程任務

背景:專案的背景還原一下,專案的App需要去呼叫第三方的介面獲取資料。我們要建立很多個任務(Task),每個Task都要去獲取資料,但是每個Task的執行週期和頻率不一樣。所以使用多執行緒來解決。為每一個Task啟動一個執行緒。然後迴圈不停的去獲取資料。剛開始的時候打算自

spring boot.定時任務問題記錄(TaskScheduler/ScheduledExecutorService異常)

context 人員 name bst pool .config implement per not 一、背景 spring boot的定時任務非常簡單,只需要在啟動類中加上@EnableScheduling註解,然後在對應的方法上配置@Scheduled就可以了,系統會自

spring boot 定時任務基於zookeeper的分布式鎖實現

刪除 etl .org stack pub 具體實現 spec 分享 -i 基於ZooKeeper分布式鎖的流程 在zookeeper指定節點(locks)下創建臨時順序節點node_n 獲取locks下所有子節點children 對子節點按節點自增序號從小到大排序

Spring Boot定時任務註解實現

    在部落格專案開發過程中,需要一個任務每間隔一定的時間執行一次。譬如推送訊息,檢查文章訪問情況,清除一定時間前訪問者的id(用於控制文章閱讀數量隨重新整理而一直增長)。用Spring Boot定時執行任務。     首先在啟動類上加入&n

spring boot 定時任務(@EnableScheduling)

ScheduleConfig.java @Configuration public class ScheduleConfig implements SchedulingConfigurer { @Override public void configureTasks

spring單例模式執行安全問題

@RequestMapping(value = "getPsdbData", method = RequestMethod.POST) public Map<String, Object> getPsdbData(String key,HttpServletRequest reques

spring boot定時任務

1.一般的定時任務Timer,Quartz 2.spring boot更加便捷的註解方式啟動定時任務 在啟動類新增 @EnableScheduling 其次新建一個class類 package com.example.demo.test1; import org.

spring boot 定時任務

java使用定時任務無非就那幾種,timer,執行緒池排程,quartz,xxl-job,我就知道這幾種,timer可以基本拋棄,執行緒池排程不太熟悉,xxl-job是分散式的任務排程開源專案,quartz跟spring整合是我們能最常用的,所以在使用springboot之前

Core表示式詳解【spring-boot定時任務使用內容】

Cron表示式是一個字串,字串以5或6個空格隔開,分為6或7個域,每一個域代表一個含義,Cron有如下兩種語法格式:  Seconds Minutes Hours DayofMonth Month DayofWeek Year或  Seconds Minutes Hours

Spring Boot定時任務之傳參

在Spring Boot中我們可以使用@Scheduled註解實現定時任務 import java.text.SimpleDateFormat; import java.util.Date; i

2. Spring Boot 定時任務升級篇(動態修改cron引數)

【文章出自:http://412887952-qq-com.iteye.com/blog/2367537】   需求緣起:在釋出了《Spring Boot定時任務升級篇》之後得到不少反饋,其中有一個反饋就是如何動態修改cron引數呢?那麼我們一起看看具體怎麼實現,先看下

spring quartz 定時任務同時間執行2次的問題

    運用spring   quartz 執行定時任務的時候 同時間 遇到的 執行2次的問題。                任務執行的時候  , 發現   log.info  日誌 輸出了  2次     ,當時沒有 找到 哪裡錯了,  後面發現啟動專案的時候

Springboot 2.0.* 及低版本定時任務@Scheduled多執行配置

1. 首先在springboot啟動類上新增 @EnableScheduling 註解。 import org.spr

Spring Boot (十一): Spring Boot 定時任務

在實際的專案開發工作中,我們經常會遇到需要做一些定時任務的工作,那麼,在 Spring Boot 中是如何實現的呢? 1. 新增依賴 在 pom.xml 檔案中只需引入 spring-boot-starter 的依賴即可: 程式碼清單:spring-boot-scheduler/pom.xml *** &

Spring Boot 定時任務 @Scheduled

專案開發中經常需要執行一些定時任務,比如在每天凌晨,需要從 implala 資料庫拉取產品功能活躍資料,分析處理後存入到 MySQL 資料庫中。類似這樣的需求還有許多,那麼怎麼去實現定時任務呢,有以下幾種實現方式。 Java 定時任務的幾種實現方式 基於 java.util.Timer 定時器,實現類似鬧鐘

SpringBoot系列:Spring Boot定時任務Spring Schedule

Spring Schedule是Spring提供的定時任務框架,相較於Quartz,Schedule更加簡單易用,在中小型應用中,對於大部分需求,Schedule都可以勝任。 一、Spring Schedule使用演示 在SpringBoot使用Spring Schedule非常簡單,因為SpringBoot