最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot實現(xiàn)動態(tài)控制定時任務(wù)支持多參數(shù)功能

 更新時間:2019年05月31日 14:18:27   作者:連理枝  
這篇文章主要介紹了SpringBoot實現(xiàn)動態(tài)控制定時任務(wù)-支持多參數(shù)功能,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下

由于工作上的原因,需要進(jìn)行定時任務(wù)的動態(tài)增刪改查,網(wǎng)上大部分資料都是整合quertz框架實現(xiàn)的。本人查閱了一些資料,發(fā)現(xiàn)springBoot本身就支持實現(xiàn)定時任務(wù)的動態(tài)控制。并進(jìn)行改進(jìn),現(xiàn)支持任意多參數(shù)定時任務(wù)配置

實現(xiàn)結(jié)果如下圖所示:

 

后臺測試顯示如下:

 

github 簡單demo地址如下:

springboot-dynamic-task

1.定時任務(wù)的配置類:SchedulingConfig

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
/**
 * @program: simple-demo
 * @description: 定時任務(wù)配置類
 * @author: CaoTing
 * @date: 2019/5/23
 **/
@Configuration
public class SchedulingConfig {
  @Bean
  public TaskScheduler taskScheduler() {
    ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
    // 定時任務(wù)執(zhí)行線程池核心線程數(shù)
    taskScheduler.setPoolSize(4);
    taskScheduler.setRemoveOnCancelPolicy(true);
    taskScheduler.setThreadNamePrefix("TaskSchedulerThreadPool-");
    return taskScheduler;
  }
}

2.定時任務(wù)注冊類:CronTaskRegistrar

這個類包含了新增定時任務(wù),移除定時任務(wù)等等核心功能方法

import com.caotinging.demo.task.ScheduledTask;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.config.CronTask;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
 * @program: simple-demo
 * @description: 添加定時任務(wù)注冊類,用來增加、刪除定時任務(wù)。
 * @author: CaoTing
 * @date: 2019/5/23
 **/
@Component
public class CronTaskRegistrar implements DisposableBean {
  private final Map<Runnable, ScheduledTask> scheduledTasks = new ConcurrentHashMap<>(16);
  @Autowired
  private TaskScheduler taskScheduler;
  public TaskScheduler getScheduler() {
    return this.taskScheduler;
  }
  /**
   * 新增定時任務(wù)
   * @param task
   * @param cronExpression
   */
  public void addCronTask(Runnable task, String cronExpression) {
    addCronTask(new CronTask(task, cronExpression));
  }
  public void addCronTask(CronTask cronTask) {
    if (cronTask != null) {
      Runnable task = cronTask.getRunnable();
      if (this.scheduledTasks.containsKey(task)) {
        removeCronTask(task);
      }
      this.scheduledTasks.put(task, scheduleCronTask(cronTask));
    }
  }
  /**
   * 移除定時任務(wù)
   * @param task
   */
  public void removeCronTask(Runnable task) {
    ScheduledTask scheduledTask = this.scheduledTasks.remove(task);
    if (scheduledTask != null)
      scheduledTask.cancel();
  }
  public ScheduledTask scheduleCronTask(CronTask cronTask) {
    ScheduledTask scheduledTask = new ScheduledTask();
    scheduledTask.future = this.taskScheduler.schedule(cronTask.getRunnable(), cronTask.getTrigger());
    return scheduledTask;
  }
  @Override
  public void destroy() {
    for (ScheduledTask task : this.scheduledTasks.values()) {
      task.cancel();
    }
    this.scheduledTasks.clear();
  }
}

3.定時任務(wù)執(zhí)行類:SchedulingRunnable

import com.caotinging.demo.utils.SpringContextUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ReflectionUtils;
import java.lang.reflect.Method;
import java.util.Objects;
/**
 * @program: simple-demo
 * @description: 定時任務(wù)運行類
 * @author: CaoTing
 * @date: 2019/5/23
 **/
public class SchedulingRunnable implements Runnable {
  private static final Logger logger = LoggerFactory.getLogger(SchedulingRunnable.class);
  private String beanName;
  private String methodName;
  private Object[] params;
  public SchedulingRunnable(String beanName, String methodName) {
    this(beanName, methodName, null);
  }
  public SchedulingRunnable(String beanName, String methodName, Object...params ) {
    this.beanName = beanName;
    this.methodName = methodName;
    this.params = params;
  }
  @Override
  public void run() {
    logger.info("定時任務(wù)開始執(zhí)行 - bean:{},方法:{},參數(shù):{}", beanName, methodName, params);
    long startTime = System.currentTimeMillis();
    try {
      Object target = SpringContextUtils.getBean(beanName);
      Method method = null;
      if (null != params && params.length > 0) {
        Class<?>[] paramCls = new Class[params.length];
        for (int i = 0; i < params.length; i++) {
          paramCls[i] = params[i].getClass();
        }
        method = target.getClass().getDeclaredMethod(methodName, paramCls);
      } else {
        method = target.getClass().getDeclaredMethod(methodName);
      }
      ReflectionUtils.makeAccessible(method);
      if (null != params && params.length > 0) {
        method.invoke(target, params);
      } else {
        method.invoke(target);
      }
    } catch (Exception ex) {
      logger.error(String.format("定時任務(wù)執(zhí)行異常 - bean:%s,方法:%s,參數(shù):%s ", beanName, methodName, params), ex);
    }
    long times = System.currentTimeMillis() - startTime;
    logger.info("定時任務(wù)執(zhí)行結(jié)束 - bean:{},方法:{},參數(shù):{},耗時:{} 毫秒", beanName, methodName, params, times);
  }
  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    SchedulingRunnable that = (SchedulingRunnable) o;
    if (params == null) {
      return beanName.equals(that.beanName) &&
          methodName.equals(that.methodName) &&
          that.params == null;
    }
    return beanName.equals(that.beanName) &&
        methodName.equals(that.methodName) &&
        params.equals(that.params);
  }
  @Override
  public int hashCode() {
    if (params == null) {
      return Objects.hash(beanName, methodName);
    }
    return Objects.hash(beanName, methodName, params);
  }
}

4.定時任務(wù)控制類:ScheduledTask

import java.util.concurrent.ScheduledFuture;
/**
 * @program: simple-demo
 * @description: 定時任務(wù)控制類
 * @author: CaoTing
 * @date: 2019/5/23
 **/
public final class ScheduledTask {
  public volatile ScheduledFuture<?> future;
  /**
   * 取消定時任務(wù)
   */
  public void cancel() {
    ScheduledFuture<?> future = this.future;
    if (future != null) {
      future.cancel(true);
    }
  }
}

5.定時任務(wù)的測試

編寫一個需要用于測試的任務(wù)類

import org.springframework.stereotype.Component;
/**
 * @program: simple-demo
 * @description:
 * @author: CaoTing
 * @date: 2019/5/23
 **/
@Component("demoTask")
public class DemoTask {
  public void taskWithParams(String param1, Integer param2) {
    System.out.println("這是有參示例任務(wù):" + param1 + param2);
  }
  public void taskNoParams() {
    System.out.println("這是無參示例任務(wù)");
  }
}

進(jìn)行單元測試

import com.caotinging.demo.application.DynamicTaskApplication;
import com.caotinging.demo.application.SchedulingRunnable;
import com.caotinging.demo.config.CronTaskRegistrar;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
 * @program: simple-demo
 * @description: 測試定時任務(wù)
 * @author: CaoTing
 * @date: 2019/5/23
 **/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = DynamicTaskApplication.class)
public class TaskTest {
  @Autowired
  CronTaskRegistrar cronTaskRegistrar;
  @Test
  public void testTask() throws InterruptedException {
    SchedulingRunnable task = new SchedulingRunnable("demoTask", "taskNoParams", null);
    cronTaskRegistrar.addCronTask(task, "0/10 * * * * ?");
    // 便于觀察
    Thread.sleep(3000000);
  }
  @Test
  public void testHaveParamsTask() throws InterruptedException {
    SchedulingRunnable task = new SchedulingRunnable("demoTask", "taskWithParams", "haha", 23);
    cronTaskRegistrar.addCronTask(task, "0/10 * * * * ?");
    // 便于觀察
    Thread.sleep(3000000);
  }
}

6.工具類:SpringContextUtils

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
 * @program: simple-demo
 * @description: spring獲取bean工具類
 * @author: CaoTing
 * @date: 2019/5/23
 **/
@Component
public class SpringContextUtils implements ApplicationContextAware {
  private static ApplicationContext applicationContext = null;
  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    if (SpringContextUtils.applicationContext == null) {
      SpringContextUtils.applicationContext = applicationContext;
    }
  }
  //獲取applicationContext
  public static ApplicationContext getApplicationContext() {
    return applicationContext;
  }
  //通過name獲取 Bean.
  public static Object getBean(String name) {
    return getApplicationContext().getBean(name);
  }
  //通過class獲取Bean.
  public static <T> T getBean(Class<T> clazz) {
    return getApplicationContext().getBean(clazz);
  }
  //通過name,以及Clazz返回指定的Bean
  public static <T> T getBean(String name, Class<T> clazz) {
    return getApplicationContext().getBean(name, clazz);
  }
}

7.我的pom依賴

<dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatisplus-spring-boot-starter</artifactId>
      <version>1.0.5</version>
    </dependency>
    <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus</artifactId>
      <version>2.1.9</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid-spring-boot-starter</artifactId>
      <version>1.1.9</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- 數(shù)據(jù)庫-->
    <!--<dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
    </dependency>-->
    <!-- https://mvnrepository.com/artifact/com.hynnet/oracle-driver-ojdbc -->
    <!--<dependency>
      <groupId>com.oracle</groupId>
      <artifactId>ojdbc6</artifactId>
      <version>11.2.0.1.0</version>
    </dependency>-->
    <!-- 單元測試 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>provided</scope>
    </dependency>
    <!--redisTemplate -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.7.3</version>
    </dependency>
    <!-- http連接 restTemplate -->
    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpclient</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpclient-cache</artifactId>
    </dependency>
    <!-- 工具-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.31</version>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
    </dependency>
    <dependency>
      <groupId>commons-lang</groupId>
      <artifactId>commons-lang</artifactId>
      <version>2.6</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.google/guava -->
    <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>10.0.1</version>
    </dependency>
    <!-- pinyin4j -->
    <dependency>
      <groupId>com.belerweb</groupId>
      <artifactId>pinyin4j</artifactId>
      <version>2.5.0</version>
    </dependency>
  </dependencies>

    8.總結(jié)

建議移步github獲取簡單demo上手實踐哦,在本文文首哦。有幫助的話點個贊吧,筆芯。

以上所述是小編給大家介紹的SpringBoot實現(xiàn)動態(tài)控制定時任務(wù)支持多參數(shù)功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • spring獲取bean的源碼解析

    spring獲取bean的源碼解析

    這篇文章主要介紹了spring獲取bean的源碼解析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Java使用wait和notify實現(xiàn)線程之間的通信

    Java使用wait和notify實現(xiàn)線程之間的通信

    Java 線程通信是將多個獨立的線程個體進(jìn)行關(guān)聯(lián)處理,使得線程與線程之間能進(jìn)行相互通信,下面這篇文章主要給大家介紹了關(guān)于Java使用wait和notify實現(xiàn)線程之間通信的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • Java裝飾者模式的示例詳解

    Java裝飾者模式的示例詳解

    裝飾者模式:在不改變原有對象的基礎(chǔ)之上,動態(tài)的將功能附加到對象上,提供了繼承更有彈性的替代方案,也體現(xiàn)了開閉原則。本文將通過示例詳細(xì)講解一下裝飾者模式,需要的可以參考一下
    2022-02-02
  • Spring Boot自定義Banner實現(xiàn)代碼

    Spring Boot自定義Banner實現(xiàn)代碼

    這篇文章主要介紹了Spring Boot自定義Banner實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • MyBatis常見報錯問題及解決方案

    MyBatis常見報錯問題及解決方案

    這篇文章主要介紹了MyBatis常見報錯問題及解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • Java Listener監(jiān)聽器使用規(guī)范詳細(xì)介紹

    Java Listener監(jiān)聽器使用規(guī)范詳細(xì)介紹

    監(jiān)聽器是一個專門用于對其他對象身上發(fā)生的事件或狀態(tài)改變進(jìn)行監(jiān)聽和相應(yīng)處理的對象,當(dāng)被監(jiān)視的對象發(fā)生情況時,立即采取相應(yīng)的行動。監(jiān)聽器其實就是一個實現(xiàn)特定接口的普通java程序,這個程序?qū)iT用于監(jiān)聽另一個java對象的方法調(diào)用或?qū)傩愿淖?/div> 2023-01-01
  • Mybatis中xml的動態(tài)sql實現(xiàn)示例

    Mybatis中xml的動態(tài)sql實現(xiàn)示例

    本文主要介紹了Mybatis中xml的動態(tài)sql實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • SpringBoot中使用Redisson的實現(xiàn)示例

    SpringBoot中使用Redisson的實現(xiàn)示例

    Redission是一個強大的Java庫,用于構(gòu)建和管理分布式系統(tǒng)中的緩存和任務(wù)調(diào)度,本文主要介紹了SpringBoot中使用Redisson的實現(xiàn)示例,感興趣的可以了解一下
    2023-12-12
  • Java SpringMVC實現(xiàn)國際化整合案例分析(i18n)

    Java SpringMVC實現(xiàn)國際化整合案例分析(i18n)

    本篇文章主要介紹了Java SpringMVC實現(xiàn)國際化整合案例分析(i18n),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Java?Float?保留小數(shù)位精度的實現(xiàn)

    Java?Float?保留小數(shù)位精度的實現(xiàn)

    這篇文章主要介紹了Java?Float?保留小數(shù)位精度的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評論

察隅县| 鸡泽县| 南乐县| 阿拉善盟| 那坡县| 堆龙德庆县| 湘潭县| 手机| 青河县| 屯留县| 洛浦县| 明星| 靖西县| 华安县| 鲜城| 南木林县| 辽源市| 千阳县| 淅川县| 如东县| 萨迦县| 桑植县| 青河县| 云梦县| 台北市| 贡觉县| 安吉县| 白朗县| 丰县| 富民县| 黎城县| 安阳市| 八宿县| 满洲里市| 九龙县| 偏关县| 济阳县| 甘洛县| 永宁县| 嘉祥县| 乌苏市|