DynamicTask.java 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package com.genersoft.iot.vmp.conf;
  2. import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask;
  3. import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd.CatalogResponseMessageHandler;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
  9. import org.springframework.stereotype.Component;
  10. import java.util.Date;
  11. import java.util.Map;
  12. import java.util.Set;
  13. import java.util.concurrent.ConcurrentHashMap;
  14. import java.util.concurrent.ScheduledFuture;
  15. /**
  16. * 动态定时任务
  17. */
  18. @Component
  19. public class DynamicTask {
  20. private Logger logger = LoggerFactory.getLogger(DynamicTask.class);
  21. @Autowired
  22. private ThreadPoolTaskScheduler threadPoolTaskScheduler;
  23. private Map<String, ScheduledFuture<?>> futureMap = new ConcurrentHashMap<>();
  24. private Map<String, Runnable> runnableMap = new ConcurrentHashMap<>();
  25. @Bean
  26. public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
  27. ThreadPoolTaskScheduler schedulerPool = new ThreadPoolTaskScheduler();
  28. schedulerPool.setPoolSize(300);
  29. schedulerPool.setWaitForTasksToCompleteOnShutdown(true);
  30. schedulerPool.setAwaitTerminationSeconds(10);
  31. return schedulerPool;
  32. }
  33. /**
  34. * 循环执行的任务
  35. * @param key 任务ID
  36. * @param task 任务
  37. * @param cycleForCatalog 间隔 毫秒
  38. * @return
  39. */
  40. public void startCron(String key, Runnable task, int cycleForCatalog) {
  41. ScheduledFuture future = futureMap.get(key);
  42. if (future != null) {
  43. if (future.isCancelled()) {
  44. logger.debug("任务【{}】已存在但是关闭状态!!!", key);
  45. } else {
  46. logger.debug("任务【{}】已存在且已启动!!!", key);
  47. return;
  48. }
  49. }
  50. // scheduleWithFixedDelay 必须等待上一个任务结束才开始计时period, cycleForCatalog表示执行的间隔
  51. future = threadPoolTaskScheduler.scheduleAtFixedRate(task, cycleForCatalog);
  52. if (future != null){
  53. futureMap.put(key, future);
  54. runnableMap.put(key, task);
  55. logger.debug("任务【{}】启动成功!!!", key);
  56. }else {
  57. logger.debug("任务【{}】启动失败!!!", key);
  58. }
  59. }
  60. /**
  61. * 延时任务
  62. * @param key 任务ID
  63. * @param task 任务
  64. * @param delay 延时 /毫秒
  65. * @return
  66. */
  67. public void startDelay(String key, Runnable task, int delay) {
  68. stop(key);
  69. Date starTime = new Date(System.currentTimeMillis() + delay);
  70. ScheduledFuture future = futureMap.get(key);
  71. if (future != null) {
  72. if (future.isCancelled()) {
  73. logger.debug("任务【{}】已存在但是关闭状态!!!", key);
  74. } else {
  75. logger.debug("任务【{}】已存在且已启动!!!", key);
  76. return;
  77. }
  78. }
  79. // scheduleWithFixedDelay 必须等待上一个任务结束才开始计时period, cycleForCatalog表示执行的间隔
  80. future = threadPoolTaskScheduler.schedule(task, starTime);
  81. if (future != null){
  82. futureMap.put(key, future);
  83. runnableMap.put(key, task);
  84. logger.debug("任务【{}】启动成功!!!", key);
  85. }else {
  86. logger.debug("任务【{}】启动失败!!!", key);
  87. }
  88. }
  89. public void stop(String key) {
  90. if (futureMap.get(key) != null && !futureMap.get(key).isCancelled()) {
  91. futureMap.get(key).cancel(true);
  92. Runnable runnable = runnableMap.get(key);
  93. if (runnable instanceof ISubscribeTask) {
  94. ISubscribeTask subscribeTask = (ISubscribeTask) runnable;
  95. subscribeTask.stop();
  96. }
  97. }
  98. }
  99. public boolean contains(String key) {
  100. return futureMap.get(key) != null;
  101. }
  102. public Set<String> getAllKeys() {
  103. return futureMap.keySet();
  104. }
  105. public Runnable get(String key) {
  106. return runnableMap.get(key);
  107. }
  108. }