1

我们有一些服务需要一段时间才能启动(1-2 分钟)。在此过程中,有人可能会请求强制关闭服务(即转换STARTING -> STOPPING)。查看AbstractService类的源代码,我发现没有调用doStop() 当前状态STARTING,或者NEW这意味着在收到停止请求时没有通知底层类。

  switch (snapshot.state) {
    case NEW:
      snapshot = new StateSnapshot(State.TERMINATED);
      terminated(State.NEW);
      break;
    case STARTING:
      snapshot = new StateSnapshot(State.STARTING, true, null);
      stopping(State.STARTING);
      break;
    case RUNNING:
      snapshot = new StateSnapshot(State.STOPPING);
      stopping(State.RUNNING);
      doStop();
      break;
    case STOPPING:
    case TERMINATED:
    case FAILED:
      // do nothing
      break;
    default:
      throw new AssertionError("Unexpected state: " + snapshot.state);
  }

由于无论状态如何,我都需要执行一些清理,有没有办法获得有关关机的通知?在子类中使用Service.Listener是个好主意吗?

4

1 回答 1

4

没有调用doStop状态何时是NEW或者STARTING因为您不必停止从未启动的服务。这并不意味着在收到停止请求时不会通知基础类。参考stop(),如果状态是NEWterminated则调用,它将侦听器排队以terminated调用其方法。类似地,如果状态为STARTINGstopping则调用它,它将侦听器排队以stopping调用其方法。然后调用中的finally块来执行任何排队的s。stopexecuteListenersListener

所以简而言之,是的,使用Service.Listener. 确保在开始之前将其添加ListenerService,这样您就不会错过任何状态转换的通知。, failed,stoppingterminated方法都得到了传递给它们的Service.State那个Service,所以你可以在你Listener的 sterminated方法中为正常情况(Servicegets RUNNINGif (from == STARTING)在你的方法中的一个块中stopping为你描述你在哪里想要在启动期间强制关闭,以及在您failed的特殊情况下使用您的方法。

于 2012-09-01T13:51:20.037 回答