【问题标题】:How to use Guava ServiceManager with Guice Injection如何在 Guice 注入中使用 Guava ServiceManager
【发布时间】:2013-10-02 10:10:58
【问题描述】:

here所说,Guava ServiceManager可以通过

ServiceManager manager = injector.getInstance(ServiceManager.class);

为了完成这项工作,我在 Guice 模块中添加了以下内容:

@Provides
public Set<Service> services(){
    return ImmutableSet.<Service>of(MyService());
}

在我的主要课程中,

ServiceManager manager = injector.getInstance(ServiceManager.class);
manager.startAsync().awaitHealthy();

如何获取已启动服务的实例?

附言将服务设置为 @Singleton 感觉就像是 hack。

【问题讨论】:

  • 我想我有同样的问题,但在另一种形式下。我管理插件而不是服务。基本上,它涉及 Multibinder 和私有模块。我在这里得到了答案:stackoverflow.com/questions/6625837/…
  • 嗨 @tanyehzheng 它是一个 Web 应用程序还是一个桌面应用程序?
  • 虽然我尝试的是桌面应用程序,但我的问题并不特定于它是桌面应用程序还是网络应用程序。

标签: java guice guava


【解决方案1】:

ServiceManager.getServicesByState().get(RUNNING) 返回正在运行的服务,ServiceManager.getServicesByState().values() 返回由 ServiceManager 管理的所有服务。

【讨论】:

    【解决方案2】:

    在我看来,将服务设置为@Singleton 根本不是什么黑客行为。这可能就是我会做的。

    @Provides @Singleton
    public MyService myService() {
      return new MyService();
    }
    
    @Provides
    public Set<Service> services(MyService myService) {
      return ImmutableSet.<Service>of(myService);
    }
    

    然后你可以在任何你想要的地方注入任何你想要的特定服务实例。

    【讨论】:

    • 如果这是使用它的预期方式,我认为他们应该说清楚,因为很容易忘记注释为@Singleton 并最终得到一个新的未启动服务实例。调试这类问题非常困难。
    • 难道guice也是ServiceManager中的一个服务?
    猜你喜欢
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    相关资源
    最近更新 更多