1

我正在使用带有 sbt-play-ebean 3.0.0 的 Play Framework 2.5.10。

我的问题
我需要在应用程序启动时为我的一个模型中的每个对象设置 Akka 演员。唯一的官方方法是注册一个启动模块。但有时调用启动模块时默认的 Ebean 服务器尚未初始化。

我丑陋的解决方案

启动模块:

public class StartupModule extends AbstractModule implements AkkaGuiceSupport {

  @Override
  protected void configure() {
    bindActor(MainActor.class, "main-actor");
  }
}

MainActor 类的构造函数:

@Inject
public MainActor(ActorSystem system) {
  this.system = system;

  boolean ebeanReady = false;
  EbeanServer ebeanServer = null;

  do  {
    try {
      ebeanServer = Ebean.getDefaultServer();
    } catch (PersistenceException e) {
      Logger.error("Ebean not ready!");
    }

    if (ebeanServer != null) {
      ebeanReady = true;
      Logger.info("Ebean ready!");
      Ebean.runCacheWarming();
    }

  } while (!ebeanReady);

  for (Model model : Model.find.all()) {
     foo(model);
  }

}

在初始化 Ebean 服务器之前,有没有更好的方法来做到这一点而无需暴力尝试?

4

1 回答 1

1

我遇到了同样的问题,我通过将 Ebean Dynamic Evolutions 绑定到模块解决了这个问题:

public class StartupModule extends AbstractModule implements AkkaGuiceSupport 
{
    @Override
    protected void configure() {
         bind(DynamicEvolutions.class).to(EbeanDynamicEvolutions.class).asEagerSingleton();
         bindActor(MainActor.class, "main-actor");
    }
}
于 2018-09-04T12:39:11.947 回答