Module  javafx.graphics
软件包  javafx.concurrent

Class ScheduledService<V>

  • 参数类型
    V - 计算的ScheduledService值
    All Implemented Interfaces:
    Worker<V>EventTarget


    public abstract class ScheduledService<V>
    extends Service<V>

    ScheduledService是一个Service ,它将在成功执行后自动重新启动,并且在某些情况下即使发生故障也将重新启动。 一个新的ScheduledService开始于READY状态,就像普通的Service一样。 调用startrestart ,ScheduledService将在delay指定的时间内进入SCHEDULED状态。

    一旦运行,ScheduledService将执行其任务。 成功完成后,ScheduledService将转换到SUCCEEDED状态,然后进入READY状态并返回到SCHEDULED状态。 计划服务将保持在此状态的时间取决于最后一次状态转换到运行时间与当前时间之间的时间量,以及period 简而言之, period定义了从一次运行开始和下一个运行开始的最短时间。 如果之前的执行在period之前完成,则ScheduledService将保持在SCHEDULED状态,直到期限到期。 另一方面,如果执行时间比指定的时间长,则ScheduledService将立即转换回运行。

    如果,在运行时,ScheduledService的任务将引发错误或以其他方式结束了过渡失败,那么ScheduledService要么重新启动或退出,这取决于值backoffStrategyrestartOnFailure ,并maximumFailureCount

    如果发生故障,并且restartOnFailure为假,则ScheduledService将转换到FAILED并停止。 要重新启动失败的ScheduledService,您必须手动调用重新启动。

    如果发生故障,并且restartOnFailure为真,则ScheduledService 可能会自动重新启动。 首先,调用backoffStrategy的结果将成为新的cumulativePeriod 以这种方式,在每次故障之后,您可以使服务等待更长时间更长的时间,然后再重新启动。 一旦任务成功完成,cumulativePeriod将重置为period的值。

    ScheduledService定义了静态EXPONENTIAL_BACKOFF_STRATEGY和LOGARITHMIC_BACKOFF_STRATEGY实现,其中LOGARITHMIC_BACKOFF_STRATEGY是backoffStrategy的默认值。 在达到maximumFailureCount之后,ScheduledService将以与错误restartOnFailure完全相同的方式转换为FAILED。

    如果在ScheduledService运行时更改了perioddelay ,则在下一次迭代时将考虑新值。 例如,如果period增加,则下次ScheduledService进入SCHEDULED状态时,将使用新的period 同样,如果更改了delay ,则新值将在下次重新启动或重置/启动时保持。

    ScheduledService通常用于涉及轮询的用例。 例如,您可能需要定期ping服务器,以查看是否有任何更新。 如ScheduledService可能会像这样实现:
       ScheduledService<Document> svc = new ScheduledService<Document>() { protected Task<Document> createTask() { return new Task<Document>() { protected Document call() { // Connect to a Server // Get the XML document // Parse it into a document return document; } }; } }; svc.setPeriod(Duration.seconds(1));  
    该示例将每隔1秒ping远程服务器。

    这个班的时间并不是绝对可靠的。 一个非常忙碌的事件线程可能会在执行后台任务的开始时引入一些时间滞后,因此周期或延迟的非常小的值可能不准确。 延迟或数百毫秒或更长的时间段应该是相当可靠的。

    默认配置中的ScheduledService的默认period ,默认delay为0.这将导致ScheduledService在Service.start()立即执行任务,并在成功完成后立即重新执行。

    为了这个课程的目的,任何答案为Duration.isUnknown()任何持续时间将视为持续时间。 同样,任何对Duration.isIndefinite()回答的持续时间将被视为Double.MAX_VALUE毫秒的持续时间。 任何null持续时间被视为Duration.ZERO。 必须准备退避策略回调的任何自定义实现来处理这些不同的潜在值。

    ScheduledService引入了一个名为lastValue的新属性。 lastValue是最后一次成功计算的值。 因为服务在每次运行时清除其value属性,并且由于ScheduledService将在完成后立即重新计划运行(除非进入已取消或失败的状态),所以value属性对于ScheduledService不是太有用。 在大多数情况下,您将要使用lastValue返回的值。

    实施者注: Service.ready()Service.scheduled()Service.running()succeeded()Service.cancelled() ,并failed()方法在这个类中实现。 也覆盖这些方法的子类必须注意调用超级实现。
    从以下版本开始:
    JavaFX 8.0
    • Property Detail

      • period

        public final ObjectProperty<Duration> periodProperty
        允许在最后一次运行开始和下次运行开始之间的最短时间。 实际期间(也称为cumulativePeriod )将取决于此属性以及backoffStrategy和故障次数。
        另请参见:
        getPeriod()setPeriod(Duration)
      • currentFailureCount

        public final ReadOnlyIntegerProperty currentFailureCountProperty
        当前ScheduledService失败的次数。 每当手动重新启动ScheduledService时,都会重新启动。
        另请参见:
        getCurrentFailureCount()
      • cumulativePeriod

        public final ReadOnlyObjectProperty<Duration> cumulativePeriodProperty
        迭代之间使用的当前累积周期。 这将与period相同,除了失败之后,在这种情况下,backoffStrategy的结果将被用作每个故障后的累积周期。 每当手动重新启动ScheduledService或迭代成功时,都会重新设置。 当ScheduledService进入计划状态时,累积周期被修改。 累积maximumCumulativePeriod可以通过设置maximumCumulativePeriod加以限制。
        另请参见:
        getCumulativePeriod()
      • maximumCumulativePeriod

        public final ObjectProperty<Duration> maximumCumulativePeriodProperty
        累积百分比的最大允许值。 设置此值将有助于确保在重复故障的情况下,退避算法不会最终在累积周期内产生不合理的较大值。 累积期限不得大于该值。 如果maximumCumulativePeriod为负,那么cumulativePeriod将被限制为0.如果maximumCumulativePeriod为NaN或为null,则不会影响累积周期。
        另请参见:
        getMaximumCumulativePeriod()setMaximumCumulativePeriod(Duration)
      • lastValue

        public final ReadOnlyObjectProperty<V> lastValueProperty
        最后成功计算的值。 在每次迭代期间,与任何其他服务一样,ScheduledService的“值”将重置为null。 然而,“lastValue”将被设置为最近成功计算的值,甚至跨越迭代。 无论何时手动调用重置或重新启动,它都会被重置。
        另请参见:
        getLastValue()
    • 字段详细信息

      • EXPONENTIAL_BACKOFF_STRATEGY

        public static final Callback<ScheduledService<?>,Duration> EXPONENTIAL_BACKOFF_STRATEGY
        backoffStrategy属性的回调实现将在失败的情况下以指数方式backoffStrategy重新执行之间的时间段。 该计算采用原始周期和连续故障的数量,并从该信息计算退避量。

        如果service为空,则返回Duration.ZERO。 如果期限为0,则此方法的结果将为Math.exp(currentFailureCount) 在所有其他情况下,返回值与period + (period * Math.exp(currentFailureCount))相同。

      • LOGARITHMIC_BACKOFF_STRATEGY

        public static final Callback<ScheduledService<?>,Duration> LOGARITHMIC_BACKOFF_STRATEGY
        backoffStrategy属性的回调实现将在失败的情况下对数地backoffStrategy重新执行之间的时间段。 该计算采用原始周期和连续故障的数量,并从该信息计算退避量。

        如果service为空,则返回Duration.ZERO。 如果期间为0,则该方法的结果将为Math.log1p(currentFailureCount) 在所有其他情况下,返回值与period + (period * Math.log1p(currentFailureCount))相同。

      • LINEAR_BACKOFF_STRATEGY

        public static final Callback<ScheduledService<?>,Duration> LINEAR_BACKOFF_STRATEGY
        backoffStrategy属性的回调实现将在失败的情况backoffStrategy性地回退重新执行之间的时间段。 该计算采用原始周期和连续故障的数量,并从该信息计算退避量。

        如果service为空,则返回Duration.ZERO。 如果期限为0,则此方法的结果将为currentFailureCount 在所有其他情况下,返回值与period + (period * currentFailureCount)相同。

    • 构造方法详细信息

      • ScheduledService

        public ScheduledService​()
    • 方法详细信息

      • getDelay

        public final Duration getDelay​()
        获取属性延迟的值。
        Property description:
        首次启动ScheduledService之间的初始延迟,以及何时开始运行。 这是在新的调用Service.start()Service.restart()之后,在进入RUNNING状态之前,ScheduledService将保持在SCHEDULED状态的时间。
      • setDelay

        public final void setDelay​(Duration value)
        设置属性延迟的值。
        Property description:
        首次启动ScheduledService之间的初始延迟,以及何时开始运行。 这是在新的调用Service.start()Service.restart()之后,在进入RUNNING状态之前,ScheduledService将保持在SCHEDULED状态的时间。
      • getPeriod

        public final Duration getPeriod​()
        获取属性期间的值。
        Property description:
        允许在最后一次运行开始和下次运行开始之间的最短时间。 实际期间(也称为cumulativePeriod )将取决于此属性以及backoffStrategy和故障次数。
      • setPeriod

        public final void setPeriod​(Duration value)
        设置属性周期的值。
        Property description:
        允许在最后一次运行开始和下次运行开始之间的最短时间。 实际期间(也称为cumulativePeriod )将取决于此属性以及backoffStrategy和故障次数。
      • periodProperty

        public final ObjectProperty<Duration> periodProperty​()
        允许在最后一次运行开始和下次运行开始之间的最短时间。 实际期间(也称为cumulativePeriod )将取决于此属性以及backoffStrategy和故障次数。
        另请参见:
        getPeriod()setPeriod(Duration)
      • getBackoffStrategy

        public final Callback<ScheduledService<?>,Duration> getBackoffStrategy​()
        获取属性backoffStrategy的值。
        Property description:
        计算在每次故障时添加到期间的时间量。 每当手动重新启动ScheduledService时,这个累积金额将被重置。
      • setBackoffStrategy

        public final void setBackoffStrategy​(Callback<ScheduledService<?>,Duration> value)
        设置属性backoffStrategy的值。
        Property description:
        计算在每次故障时添加到期间的时间量。 每当手动重新启动ScheduledService时,这个累积金额将被重置。
      • getRestartOnFailure

        public final boolean getRestartOnFailure​()
        获取属性restartOnFailure的值。
        Property description:
        指示在Task中出现故障时,ScheduledService是否应自动重新启动。
      • setRestartOnFailure

        public final void setRestartOnFailure​(boolean value)
        设置属性restartOnFailure的值。
        Property description:
        指示在Task中出现故障时,ScheduledService是否应自动重新启动。
      • getMaximumFailureCount

        public final int getMaximumFailureCount​()
        获取属性maximumFailureCount的值。
        Property description:
        在完成FAILED状态之前,ScheduledService可以失败的最大次数。 您当然可以手动重新启动ScheduledService,这将导致当前计数被重置。
      • setMaximumFailureCount

        public final void setMaximumFailureCount​(int value)
        设置属性maximumFailureCount的值。
        Property description:
        在完成FAILED状态之前,ScheduledService可以失败的最大次数。 您当然可以手动重新启动ScheduledService,这将导致当前计数被重置。
      • maximumFailureCountProperty

        public final IntegerProperty maximumFailureCountProperty​()
        在完成FAILED状态之前,ScheduledService可以失败的最大次数。 您当然可以手动重新启动ScheduledService,这将导致当前计数被重置。
        另请参见:
        getMaximumFailureCount()setMaximumFailureCount(int)
      • getCurrentFailureCount

        public final int getCurrentFailureCount​()
        获取属性currentFailureCount的值。
        Property description:
        当前ScheduledService失败的次数。 每当手动重新启动ScheduledService时,都会重新启动。
      • currentFailureCountProperty

        public final ReadOnlyIntegerProperty currentFailureCountProperty​()
        当前ScheduledService失败的次数。 每当手动重新启动ScheduledService时,都会重新启动。
        另请参见:
        getCurrentFailureCount()
      • getCumulativePeriod

        public final Duration getCumulativePeriod​()
        获取属性cumulativePeriod的值。
        Property description:
        迭代之间使用的当前累积周期。 这将与period相同,除了失败之后,在这种情况下,backoffStrategy的结果将被用作每次故障后的累积周期。 每当手动重新启动ScheduledService或迭代成功时,都会重新设置。 当ScheduledService进入计划状态时,累积周期被修改。 累积maximumCumulativePeriod可以通过设置maximumCumulativePeriod加以限制。
      • cumulativePeriodProperty

        public final ReadOnlyObjectProperty<Duration> cumulativePeriodProperty​()
        迭代之间使用的当前累积周期。 这将与period相同,除了失败之后,在这种情况下,backoffStrategy的结果将被用作每次故障后的累积周期。 每当手动重新启动ScheduledService或迭代成功时,都会重新设置。 当ScheduledService进入计划状态时,累积周期被修改。 累积maximumCumulativePeriod可以通过设置maximumCumulativePeriod加以限制。
        另请参见:
        getCumulativePeriod()
      • getMaximumCumulativePeriod

        public final Duration getMaximumCumulativePeriod​()
        获取属性maximumCumulativePeriod的值。
        Property description:
        累积百分比的最大允许值。 设置此值将有助于确保在重复故障的情况下,退避算法不会最终在累积周期内产生不合理的较大值。 累积期限不得大于该值。 如果maximumCumulativePeriod为负,那么cumulativePeriod将被限制为0.如果maximumCumulativePeriod为NaN或为null,则不会影响累积周期。
      • setMaximumCumulativePeriod

        public final void setMaximumCumulativePeriod​(Duration value)
        设置属性maximumCumulativePeriod的值。
        Property description:
        累积百分比的最大允许值。 设置此值将有助于确保在重复故障的情况下,退避算法不会最终在累积周期内产生不合理的较大值。 累积期限不得大于该值。 如果maximumCumulativePeriod为负,那么cumulativePeriod将被限制为0.如果maximumCumulativePeriod为NaN或为null,则不会影响累积周期。
      • maximumCumulativePeriodProperty

        public final ObjectProperty<Duration> maximumCumulativePeriodProperty​()
        累积百分比的最大允许值。 设置此值将有助于确保在重复故障的情况下,退避算法不会最终在累积周期内产生不合理的较大值。 累积期限不得大于该值。 如果maximumCumulativePeriod为负,那么cumulativePeriod将被限制为0.如果maximumCumulativePeriod为NaN或为null,则不会影响累积周期。
        另请参见:
        getMaximumCumulativePeriod()setMaximumCumulativePeriod(Duration)
      • getLastValue

        public final V getLastValue​()
        获取属性lastValue的值。
        Property description:
        最后成功计算的值。 在每次迭代期间,与任何其他服务一样,ScheduledService的“值”将重置为null。 然而,“lastValue”将被设置为最近成功计算的值,甚至跨越迭代。 无论何时手动调用重置或重新启动,它都会被重置。
      • lastValueProperty

        public final ReadOnlyObjectProperty<V> lastValueProperty​()
        最后成功计算的值。 在每次迭代期间,与任何其他服务一样,ScheduledService的“值”将重置为null。 然而,“lastValue”将被设置为最近成功计算的值,甚至跨越迭代。 无论何时手动调用重置或重新启动,它都会被重置。
        另请参见:
        getLastValue()
      • executeTask

        protected void executeTask​(Task<V> task)
        描述从类别复制: Service

        使用此服务上定义的executor执行给定的任务。 如果executor为空,则使用默认执行程序,它将创建一个新的守护程序线程,执行此任务。

        此方法仅用于由Service实现调用。

        重写:
        executeTaskService<V>
        参数
        task - 要执行的非空任务
      • succeeded

        protected void succeeded​()
        对于子类的受保护的便利方法,当服务状态已转换到SUCCEEDED状态时调用。 该方法在服务完全转换到新状态后被调用。 实现注意:覆盖此方法的子类必须调用此超级实现。
        重写:
        succeededService<V>
      • failed

        protected void failed​()
        对于子类的受保护的便利方法,只要服务状态已经转换到FAILED状态。 该方法在服务完全转换到新状态后被调用。 实现注意:覆盖此方法的子类必须调用此超级实现。
        重写:
        failedService<V>
      • reset

        public void reset​()
        重置服务。 只能在其中一个完成状态(即,已成功,失败或已取消)或READY时被调用。 该方法只能在FX应用程序线程上调用。 实现注意:覆盖此方法的子类必须调用此超级实现。
        重写:
        resetService<V>
      • cancel

        public boolean cancel​()
        取消任何当前正在运行的任务并停止此计划的服务,这样就不会发生额外的迭代。
        Specified by:
        cancel在接口 Worker<V>
        重写:
        cancelService<V>
        结果
        任何运行任务是否被取消,如果没有任务被取消,则为false。 在任何情况下,ScheduledService将停止迭代。