AbstractScheduledService

AbstractScheduledService

我正在尝试使用 guava AbstractScheduledService 定期执行一些任务:

public class MyService extends AbstractScheduledService {

    public MyService() {

    }

    @Override
    protected void runOneIteration() {
        doStuff();
    }

    private void doStuff() {
    // Do stuff
    }

    @Override
    protected Scheduler scheduler() {
        return Scheduler.newFixedRateSchedule(0, 8, TimeUnit.HOURS);
    }

}
因此,此服务应每 8 小时定期执行一些任务,但实际上从未执行过。继承的 isRunning() 方法返回 false 并且永远不会调用 runOneIteration() 方法。
我设法通过从我的服务构造函数调用 startAsync() 方法(继承自父类)使其工作,但我没有看到任何引用资料表明这是它应该工作的方式。
我在这里错过了什么吗?这是 AbstractScheduledService 的工作方式吗?

最佳答案

AbstractScheduledServiced 实现 Service 。 Service 接口(interface)描述了生命周期方法,包括 startAsyncServiceState 枚举文字包含有关其含义的文档。处于 NEW 状态的服务(刚刚创建):



为了让服务做一些有用的事情,你必须将它转换到状态 RUNNING


这就是为什么你必须在它做任何事情之前启动服务。

我还建议不要从构造函数调用 startAsync,而是从创建 MyService 实例的代码中调用它。在构造函数中产生如此严重的副作用(线程的创建)很少是预料之中的事情。

关于java - 使用 Guava AbstractScheduledService,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25499811/

10-11 02:35