使用Java ScheduledThreadPoolExecutor重试启动失败

时间:2019-04-15 23:54:22

标签: java multithreading

我有一个服务包装程序,它需要启动一些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;
        }
    }
}

0 个答案:

没有答案