标签:INFO ... ExtendTimeTask 调度 任务 ddup bootmvc com 延迟
延迟调度任务
问题
有些时候需要任务调度失败后重试,每次重试时间为 3,6,12 秒这样延迟调度
实现
参考 eureka TimedSupervisorTask
ExtendTimeTask
public class ExtendTimeTask extends TimerTask {
private String name;
private TimeUnit timeUnit;
private long timeOut;
private long maxDelay;
private ScheduledExecutorService scheduledExecutor;
private ExecutorService executor;
private Runnable task;
private AtomicLong delay;
public ExtendTimeTask(String name, TimeUnit timeUnit, int timeOut,
int expand, ScheduledExecutorService scheduledExecutor,
ExecutorService executor, Runnable task) {
this.name = name;
this.timeUnit = timeUnit;
this.timeOut = timeUnit.toMillis(timeOut);
this.maxDelay = timeOut * expand;
this.delay = new AtomicLong(timeOut);
this.scheduledExecutor = scheduledExecutor;
this.executor = executor;
this.task = task;
}
@Override
public void run() {
Future<?> future = null;
try {
future = executor.submit(task);
future.get(timeOut, TimeUnit.MILLISECONDS);
delay.set(timeOut);
log.info(Thread.currentThread().getName() + " 执行成功...");
} catch (TimeoutException e) {
long current = delay.get();
long newDelay = Math.min(maxDelay, current * 2);
delay.compareAndSet(current, newDelay);
log.info(Thread.currentThread().getName() + " 超时重试, delay: {} ...", newDelay);
} catch (Throwable throwable) {
log.error("ExtendTimeTask run task error", throwable);
} finally {
if (future != null) {
//如果 task 未执行,则取消
future.cancel(true);
}
if (!scheduledExecutor.isShutdown()) {
scheduledExecutor.schedule(this, delay.get(), timeUnit);
}
}
}
}
测试
@Slf4j
public class ExtendTimeTaskTest {
ScheduledExecutorService scheduledThreadPoolExecutor = Executors.newSingleThreadScheduledExecutor();
ExecutorService executorService = Executors.newFixedThreadPool(3);
@Test
public void taskTest() throws InterruptedException {
Runnable task = new Runnable() {
@SneakyThrows
@Override
public void run() {
log.info("ExtendTimeTask execute at: {}", LocalDateTime.now()
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
int i = new Random().nextInt(6) + 2;
log.info(Thread.currentThread().getName() + " execute, will sleep: {} ...", i);
int cnt = 1;
while (cnt <= i) {
TimeUnit.SECONDS.sleep(1);
System.out.println("count: " + cnt);
cnt++;
}
}
};
ExtendTimeTask cacheTask = new ExtendTimeTask("测试", TimeUnit.SECONDS, 3,
4, scheduledThreadPoolExecutor, executorService, task);
cacheTask.run();
TimeUnit.SECONDS.sleep(100);
}
}
结果:
INFO com.ddup.bootmvc.ExtendTimeTaskTest - ExtendTimeTask execute at: 2021-09-18 11:24:31
INFO com.ddup.bootmvc.ExtendTimeTaskTest - pool-2-thread-1 execute, will sleep: 6 ...
count: 1
count: 2
11:24:34.848 [main] INFO com.ddup.bootmvc.ExtendTimeTask - main 超时重试, delay: 6 ...
INFO com.ddup.bootmvc.ExtendTimeTaskTest - ExtendTimeTask execute at: 2021-09-18 11:24:40
INFO com.ddup.bootmvc.ExtendTimeTaskTest - pool-2-thread-2 execute, will sleep: 5 ...
count: 1
count: 2
INFO com.ddup.bootmvc.ExtendTimeTask - pool-1-thread-1 超时重试, delay: 12 ...
INFO com.ddup.bootmvc.ExtendTimeTaskTest - ExtendTimeTask execute at: 2021-09-18 11:24:55
INFO com.ddup.bootmvc.ExtendTimeTaskTest - pool-2-thread-3 execute, will sleep: 6 ...
count: 1
count: 2
count: 3
INFO com.ddup.bootmvc.ExtendTimeTask - pool-1-thread-1 超时重试, delay: 12 ...
INFO com.ddup.bootmvc.ExtendTimeTaskTest - ExtendTimeTask execute at: 2021-09-18 11:25:10
INFO com.ddup.bootmvc.ExtendTimeTaskTest - pool-2-thread-1 execute, will sleep: 2 ...
count: 1
count: 2
INFO com.ddup.bootmvc.ExtendTimeTask - pool-1-thread-1 执行成功...
标签:INFO,...,ExtendTimeTask,调度,任务,ddup,bootmvc,com,延迟 来源: https://blog.csdn.net/u013887008/article/details/120427591
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。