Сервер Ebean по умолчанию имеет значение null, когда модуль запуска называется [Play Framework].

Я использую Play Framework 2.5.10 с sbt-play-ebean 3.0.0.

Моя проблема
Мне нужно настроить акторы 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 не будет инициализирован?


person inwi    schedule 27.02.2017    source источник
comment
Может быть, попробуйте добавить задержку в вашем модуле для вещей, которые вам нужны для использования Ebean. Загляните в планировщик akka. У меня похожая проблема, и я решил ее, сделав это.   -  person pedroct92    schedule 03.03.2017
comment
@ pedroct92 pedroct92 Я не хочу просто откладывать создание MainActor.class, я хотел бы быть на 100% уверен, что Ebean.default существует :-). Теперь я инкапсулировал его в поток с 1-секундным сном после каждой попытки.   -  person inwi    schedule 06.03.2017


Ответы (1)


У меня была та же проблема, я решил ее, привязав Ebean Dynamic Evolution к модулю:

public class StartupModule extends AbstractModule implements AkkaGuiceSupport 
{
    @Override
    protected void configure() {
         bind(DynamicEvolutions.class).to(EbeanDynamicEvolutions.class).asEagerSingleton();
         bindActor(MainActor.class, "main-actor");
    }
}
person Kecc    schedule 04.09.2018