使用番石榴 AbstractScheduledService

for*_*has 4 java guava

我正在尝试使用 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);
    }

}
Run Code Online (Sandbox Code Playgroud)

因此该服务应该每 8 小时定期执行一些任务,但实际上从未执行过。继承的isRunning()方法返回 false 并且该runOneIteration()方法永远不会被调用。

我已经设法通过从服务构造函数调用该方法(从父类继承)来使其工作startAsync(),但我没有看到任何引用说这是它应该工作的方式。

我在这里错过了什么吗?这是工作方式吗AbstractScheduledService

Pat*_*Huy 5

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

处于此状态的服务处于非活动状态。它执行最少的工作并消耗最少的资源。

为了使服务做一些有用的事情,您必须将其转换为状态RUNNING

处于该状态的服务是可操作的。

这就是为什么您必须在服务执行任何操作之前启动该服务。

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

  • 您将它与 Spring 一起使用,然后将所有服务注入到一个 bean 中,并在 @PostConstruct 方法(或 Spring 等效方法)中启动它们。不要在构造函数中启动服务。 (3认同)