我需要某种服务,该服务将以1秒的间隔同时运行1分钟,同时运行一些任务。
如果其中一项任务失败,我想停止该服务,并且每一个运行有该任务的任务都带有某种指示错误的指示器,否则,如果在一分钟后一切都顺利,则该服务将停止并指示所有故障好。
例如,我有两个功能:
Runnable task1 = ()->{
int num = Math.rand(1,100);
if (num < 5){
throw new Exception("something went wrong with this task,terminate");
}
}
Runnable task2 = ()->{
int num = Math.rand(1,100)
return num < 50;
}
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
task1schedule = scheduledExecutorService.scheduleAtFixedRate(task1, 1, 60, TimeUnit.SECONDS);
task2schedule = scheduledExecutorService.scheduleAtFixedRate(task2, 1, 60, TimeUnit.SECONDS);
if (!task1schedule || !task2schedule) scheduledExecutorService.shutdown();
关于如何解决这个问题并使之尽可能通用的任何想法?
您只需要添加其他任务,其任务就是监视所有其他正在运行的任务,并且当任何被监视的任务失败时,它们都需要设置一个刺客可以检查的信号量(标志)。
ScheduledExecutorService executor = (ScheduledExecutorService) Executors.newScheduledThreadPool(2);
// INSTANTIATE THE REMOTE-FILE-MONITOR:
RemoteFileMonitor monitor = new RemoteFileMonitor(remotesource, localtarget);
// THIS TimerTask PERIODICALLY TRIGGERS THE RemoteFileMonitor:
TimerTask remote = new TimerTask() {
// RUN FORREST... RUN !
public void run() {
try {
kae.trace("TimerTask::run() --> Calling RemoteFileMonitor.check()");
monitor.check();
} catch (Exception ex) {
// NULL TRAP: ALLOWS US TO CONTINUE AND RETRY:
}
}
};
// THIS TimerTask PERIODICALLY TRIES TO KILL THE REMOTE-FILE-MONITOR:
TimerTask assassin = new TimerTask() {
// WHERE DO BAD FOLKS GO WHEN THEY DIE ?
private final LocalDateTime death = LocalDateTime.now().plus(ConfigurationOptions.getPollingCycleTime(), ChronoUnit.MINUTES);
// RUN FORREST... RUN !
public void run() {
// IS THERE LIFE AFTER DEATH ???
if (LocalDateTime.now().isAfter(death)) {
// THEY GO TO A LAKE OF FIRE AND FRY:
kae.error(ReturnCode.MONITOR_POLLING_CYCLE_EXCEEDED);
}
}
};
// SCHEDULE THE PERIODIC EXECUTION OF THE RemoteFileMonitor: (remote --> run() monitor --> check())
executor.scheduleAtFixedRate(remote, delay, interval, TimeUnit.MINUTES);
// SCHEDULE PERIODIC ASSASSINATION ATTEMPTS AGAINST THE RemoteFileMonitor: (assassin --> run() --> after death --> die())
executor.scheduleAtFixedRate(assassin, delay, 60L, TimeUnit.SECONDS);
// LOOP UNTIL THE MONITOR COMPLETES:
do {
try {
// I THINK I NEED A NAP:
Thread.sleep(interval * 10);
} catch (InterruptedException e) {
// FAIL && THEN cleanexit();
kae.error(ReturnCode.MONITORING_ERROR, "Monitoring of the XXXXXX-Ingestion site was interrupted");
}
// NOTE: THE MONITOR IS SET TO 'FINISHED' WHEN THE DONE-File IS DELIVERED AND RETRIEVED:
} while (monitor.isNotFinished());
// SHUTDOWN THE MONITOR TASK:
executor.shutdown();