Может ли запускаемый однокомпонентный компонент задержать инициализацию контейнера J2EE? - PullRequest
0 голосов
/ 28 апреля 2019

В соответствии с Учебное пособие по Java EE 6 :

Контейнер EJB отвечает за определение, когда инициализировать экземпляр синглтон-компонента сеанса, если только класс реализации синглтон-компонента сеанса не аннотирован.с аннотацией javax.ejb.Startup.В этом случае, иногда называемый активной инициализацией, контейнер EJB должен инициализировать сессионный компонент синглтона при запуске приложения. Синглтон-сессионный компонент инициализируется до того, как контейнер EJB доставляет запросы клиентов любым корпоративным компонентам в приложении .

Мое RESTEasy приложение, обслуживаемое Thorntail не использует EJB, но использует аннотации @Startup, @Singleton и @PostConstruct для выполнения длительной задачи обновления базы данных во время инициализации сервера приложений.Это примерно так:

@Startup
@Singleton
public class StartupTask {

  @PostConstruct
  void init {
    // database update task
  }
}

Сможет ли мое приложение обрабатывать HTTP-запросы до завершения этой задачи?

Мой вопрос похож на этот .

1 Ответ

1 голос
/ 01 мая 2019

Любой боб, помеченный javax.ejb.Singleton , является EJB и подчиняется условиям, которые вы указали в своем вопросе.

Вы можете обойти задержку, переместив свое "обновление базы данных"логика задачи для второго EJB:

@Stateless
public class DatabaseUpdater {

    @Resource
    private Datasource dataSource;

    // OR

    @PersistenceContext
    private EntityManager em;

    @javax.ejb.Asynchronous
    public void updateDatabase() {
        // beware of long running transaction timeouts in here!
        ...
    }

}

и затем вызовите его из вашего компонента @Startup:

@Startup
@Singleton
public class StartupTask {

    @EJB
    private DatabaseUpdater databaseUpdater;

    @PostConstruct
    void init {
        databaseUpdater.updateDatabase();
    }

}
...