【问题标题】:Restartable Service using Guava使用 Guava 的可重启服务
【发布时间】:2012-01-23 18:03:29
【问题描述】:

我目前正在开发一个应用程序,我需要在其中管理多个服务的状态,并根据一些事件停止/启动它们。问题是,正如文档中所述,Guava 的服务是单向的,这意味着一旦停止,就无法再次启动。

由于我需要以某种方式规避这个问题,我面临着几个替代方案,我想提出来考虑(特别是因为每个方案都可能存在我现在不知道的缺点)。

这个问题的第一个明显解决方案是在我需要“重新启动”它时实例化一个新服务。这可行,但在我当前的架构中,它会使事情变得有点复杂:目前我正在启动所有服务,并基于来自 EventBus 的事件,如果需要,启动或停止它们。调用 start 和 stop 方法的类只保存对服务 Map 的引用,并根据收到的事件在这些实例上调用正确的方法。如果我需要实例化一个新对象来响应事件,我将不得不放弃我目前拥有的一些解耦(可能通过保留每种服务类型的类并使用反射调用构造函数)。

另一种可能性是将 Service 接口实现为 RestartableThreadedService(或类似的东西)。如果我采用这条路线,我的 start() 方法可以像第一次一样创建另一个线程,并重置状态。

第二种方法有什么明显的缺点吗?我担心我可能会在这里遗漏一些明显的缺点(除了必须编写一些更复杂的代码之外),尤其是在线程管理方面。

【问题讨论】:

    标签: java guava


    【解决方案1】:

    我推荐您的第一种方法,但有比反射更好的方法。使用依赖注入,或者可能传递 Supplier<Service> 对象而不是使用 serviceClass.newInstance(),可能是这里的方法。

    【讨论】:

    • 感谢您的回答,这看起来像是要走的路。如果我采用 DI 路径,我会按照 Craig 的建议更好地了解 Guice 的范围,但供应商似乎很有希望。不幸的是,我只会在几天内重新完成这项任务,然后我会更新我的问题,并提供更多详细信息/选项。
    • 我有一个类似的用例,并采用了混合方法。我使用了单元素缓存而不是供应商,因为它允许我在条目停止时清除/无效条目。但是我把我的缓存放在一个实现服务的类中(并且大部分只是委托给缓存的服务),这样我就可以拥有 API。
    【解决方案2】:

    考虑使用 Guice 的作用域。

    【讨论】:

      【解决方案3】:

      在这个 github 中跟踪了相同的问题:https://github.com/google/guava/issues/418

      我在这里有一个建议的更改:https://github.com/okigan/guava/commit/8f51b155f9ce5c60236b9a9bfdc6ca5f8bf5e51d

      它的要点是向 AbstractService 添加一个 reset() 允许从 TERMINATED 转换回 NEW:

          public final void reset() {
          lock.lock();
          try {
              switch (snapshot.state) {
                  case TERMINATED:
                  case FAILED:
                      snapshot = new StateSnapshot(State.NEW);
                      break;
                  default:
                      throw new AssertionError("Unexpected state: " + snapshot.state);
              }
          } catch (Throwable resetFailure) {
              notifyFailed(resetFailure);
          } finally {
              lock.unlock();
              executeListeners();
          }
      }  
      

      【讨论】:

      • 服务模块中是否添加过重置功能?
      猜你喜欢
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      • 2019-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-23
      相关资源
      最近更新 更多