Java 使用guava AbstractScheduledService

Java 使用guava AbstractScheduledService,java,guava,Java,Guava,我尝试使用番石榴定期执行一些任务: 因此,该服务应该每8小时定期执行一次任务,但实际上从未执行过。继承的isRunning() 我已经通过从我的服务构造函数调用startAsync()方法(继承自父类)成功地实现了这一点,但我没有看到任何引用说明它应该是这样工作的 我错过什么了吗?这就是AbstractScheduledService的工作方式吗?AbstractScheduledService实现。服务界面描述了生命周期方法,包括startAsync。枚举文字包含关于其含义的文档。处于NEW状

我尝试使用番石榴定期执行一些任务:

因此,该服务应该每8小时定期执行一次任务,但实际上从未执行过。继承的
isRunning()

我已经通过从我的服务构造函数调用
startAsync()
方法(继承自父类)成功地实现了这一点,但我没有看到任何引用说明它应该是这样工作的


我错过什么了吗?这就是
AbstractScheduledService
的工作方式吗?

AbstractScheduledService
实现。服务界面描述了生命周期方法,包括
startAsync
。枚举文字包含关于其含义的文档。处于
NEW
状态的服务(刚创建):

处于此状态的服务处于非活动状态。它只做最少的工作,消耗最少的资源

要让服务做一些有用的事情,您必须将其转换为运行状态

处于此状态的服务正在运行

这就是为什么你必须在服务开始之前启动它


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

注意,下一次执行只会在runOneIteration返回后安排。我不确定我是否理解您的意思。如果我不调用startAsync()方法,该服务将永远不会运行。对于您的实现,Quartz不是更好吗?看起来您希望运行Quartz的任务,而不是Guava的服务。我使用的是Spring的IOC,因此该服务是由Spring容器创建的。因为一旦我的应用服务器启动,服务应该立即被使用,所以我宁愿从构造函数启动它。关于您的答案,我仍然试图理解调用startAsync()是否是使用AbstractScheduledService的推荐做法,因为AbstractScheduledService是一项服务,需要启动。是的,你应该在它上面调用startAsync。你将它与Spring一起使用,然后将你的所有服务注入一个bean中,并在@PostConstruct方法(或Spring等效方法)中启动它们。不要在构造函数中启动服务。
service
s的典型实践(当您使用多个服务时)是将它们全部注入到
ServiceManager
中,然后启动
ServiceManager
以启动所有服务。然后,您可以在关闭应用程序时关闭
ServiceManager
,以关闭所有服务,
ServiceManager
还可以检查应用程序的所有服务是否正常。
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);
    }

}