我有一个服务包装程序,它需要启动一些JMS和其他组件,如果启动失败,我想撤回所有内容并在一段时间后重试。诸如下面的简化代码之类的东西已经在生产环境中工作了一段时间,但是因为它是一种罕见的失败案例,所以我对自己的逻辑不满意。
在这种情况下,可以通过用户操作,设置更改等来触发start()和stop()。startMyServices()方法很繁琐,如果失败了,我想重新安排它,以备稍后使用。我没有看到这种方法是否有问题,还是更好的方法?我读过Goetz的Java并发书。
public class TestServiceWrapper {
private final ScheduledThreadPoolExecutor scheduler;
private ScheduledFuture<?> restartTask;
private boolean running = false;
public TestServiceWrapper() {
scheduler = new ScheduledThreadPoolExecutor(1);
scheduler.setRemoveOnCancelPolicy(true);
}
public synchronized void start() {
cancelRestartTask();
startMyServices();
}
public synchronized void stop() {
cancelRestartTask();
stopMyServices();
}
private synchronized void startMyServices() {
try {
restartTask = null;
if (!running) {
// ... try to start things up that might fail with an exception ...
running = true;
}
} catch (Exception e) {
stopMyServices();
restartTask = scheduler.schedule(()->startMyServices(), 10, TimeUnit.SECONDS);
}
}
private synchronized void stopMyServices() {
running = false;
// ... shut things down...
}
private void cancelRestartTask() {
if (restartTask != null) {
restartTask.cancel(false);
restartTask = null;
}
}
}