Инициализация Wildfly: временная задержка вызывает исключение IllegalStateException в приложении Java-EE - PullRequest
0 голосов
/ 31 октября 2018

У меня есть простой проект Java, который извлекает и вычисляет данные, называемые CalculatorService. Он включен через buildpath в приложение JavaEE, которое развернуто на сервере wildfly.

Когда я запускаю сервер wildfly, база данных и ее таблицы собираются. После этого запускается InitializationBean, где некоторые данные выбираются через так называемый CalculatorService. После этого эти данные будут храниться в базе данных. Давайте взглянем на InitializationBean приложения JavaEE.

@Singleton
@Startup
public class InitializationBean {

    @Inject
    private InitService initService;

    @PostConstruct
    private void initialize() {
        // Start CalculatorService and fetch data.
        CalculatorService calcService = new CalculatorService();
        calcService.fetchData();
        System.out.println("DONE <===========");
        initService.storeData();
    }
}

InitService выглядит так:

@Singleton
public class InitService {

    @EJB
    private DataDAO dataDAO;

    public void storeData() {
        // Get fetched data stored within CalculatorService.
        Set <DataCalc> dataSet = CalculatorService.getAllData();
        // Loop through fetched data of CalculatorService and transform to valid entity.
        for (DataCalc d : dataSet) {
            Data data = new Data();
            data.setName(d.getName());
            try { // Store in database
                dataDAO.create(data);
            } catch (Exception e) { e.printStackTrace(); }
    }
    }
}

Если я запускаю сервер с вышеуказанной настройкой, используя тестовые данные, а не CalculatorService, все работает как положено. Но как только я пользуюсь сервисом, я получаю следующий вывод:

DONE <===========
ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 88) MSC000001: Failed to start service jboss.deployment.subunit."MyProject.ear"."MyProject.jar".component.InitializationBean.START: org.jboss.msc.service.StartException in service jboss.deployment.subunit."MyProject.ear"."MyProject.jar".component.InitializationBean.START: java.lang.IllegalStateException: WFLYEE0042: Failed to construct component instance
    at org.jboss.as.ee@14.0.1.Final//org.jboss.as.ee.component.ComponentStartService$1.run(ComponentStartService.java:57)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:514)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at org.jboss.threads@2.3.2.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
    at org.jboss.threads@2.3.2.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985)
    at org.jboss.threads@2.3.2.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487)
    at org.jboss.threads@2.3.2.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1378)
    at java.base/java.lang.Thread.run(Thread.java:844)
    at org.jboss.threads@2.3.2.Final//org.jboss.threads.JBossThread.run(JBossThread.java:485)
Caused by: java.lang.IllegalStateException: WFLYEE0042: Failed to construct component instance
    at org.jboss.as.ee@14.0.1.Final//org.jboss.as.ee.component.BasicComponent.constructComponentInstance(BasicComponent.java:163)
    at org.jboss.as.ee@14.0.1.Final//org.jboss.as.ee.component.BasicComponent.constructComponentInstance(BasicComponent.java:134)
    at org.jboss.as.ee@14.0.1.Final//org.jboss.as.ee.component.BasicComponent.createInstance(BasicComponent.java:88)
    at org.jboss.as.ejb3@14.0.1.Final//org.jboss.as.ejb3.component.singleton.SingletonComponent.getComponentInstance(SingletonComponent.java:127)
    at org.jboss.as.ejb3@14.0.1.Final//org.jboss.as.ejb3.component.singleton.SingletonComponent.start(SingletonComponent.java:141)
    at org.jboss.as.ee@14.0.1.Final//org.jboss.as.ee.component.ComponentStartService$1.run(ComponentStartService.java:54)
    ... 8 more
Caused by: java.lang.IllegalStateException
    at org.jboss.msc@1.4.3.Final//org.jboss.msc.value.InjectedValue.getValue(InjectedValue.java:50)
    at org.jboss.as.ejb3@14.0.1.Final//org.jboss.as.ejb3.deployment.ModuleDeployment$ModuleDeploymentStartService$1.run(ModuleDeployment.java:102)
    at org.jboss.as.ee@14.0.1.Final//org.jboss.as.ee.component.deployers.StartupCountdown.countDown(StartupCountdown.java:27)
    at org.jboss.as.ejb3@14.0.1.Final//org.jboss.as.ejb3.component.singleton.StartupCountDownInterceptor.processInvocation(StartupCountDownInterceptor.java:28)
    at org.jboss.invocation@1.5.1.Final//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.invocation@1.5.1.Final//org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:53)
    at org.jboss.as.ee@14.0.1.Final//org.jboss.as.ee.component.BasicComponent.constructComponentInstance(BasicComponent.java:161)
    ... 13 more

Поскольку обработка CalculatorService занимает очень много времени (более двух часов), я предполагаю, что он как-то связан со временем. Но так как нет ничего похожего на TimeoutException, я понятия не имею, с чего начать.

UPDATE

Когда CalculatorService должен извлечь небольшой фрагмент данных, который занимает всего несколько секунд, исключение не выдается, и данные успешно сохраняются.

1 Ответ

0 голосов
/ 02 ноября 2018

Добавьте аннотацию @javax.ejb.Asynchronous к вашему storeData() методу:

...
@Asynchronous
public void storeData() {
    ...

Это позволит вашему приложению правильно запускаться, пока storeData() выполняет свою работу в фоновом потоке.

Возможно, вы захотите переместить вызовы CalculatorService и в этот метод ...

...