2016-11-25 9 views
1

Я скорее новичок в JBoss и аннотации. У меня есть пример кода. Исключительные детали вырезаны.Служба EJB Singleton не работает при развертывании

@Singleton 
@Startup 
public class SomeBean { 

    @Resource 
    TimerService timerService; 

    @Inject 
    AnotherSingleton anotherOne; 

    Timer timer; 

    @PostConstruct 
    private void ejbCreate() { 
     timer = timerService.createIntervalTimer(0, interval, tc); 
    } 

    @Timeout 
    public void run() throws Exception { 
    } 
} 

@Singleton 
public class AnotherSingleton { 

    @Inject 
    Repository rep; 
} 

Существует случай, когда война развертывает на JBoss он терпит неудачу с исключением из Хранилища производителя (услуги в другом Jboss не доступны).

Caused by: java.lang.IllegalStateException: WFLYEE0042: Failed to construct component instance 

Так процесс заканчивается

WFLYCTL0186: Services which failed to start:  service jboss.deployment.unit."someservices-view.war".component.SomeBean.START 

Какие варианты у меня есть? Могу ли я сказать JBoss, чтобы он не @Inject beans при запуске, но когда код выполняется таймером? Могу ли я как-нибудь поймать исключение? @ Расписание не может быть принято. Мне нужно настроить таймер.

ответ

1

Инъекции обрабатываются CDI specification, который обеспечивает функцию «обертывания» инъекций, как бы, like so.

@Inject 
Instance<AnotherSingleton> anotherOneInstance; 

Это в основном создает прокси вокруг AnotherSingleton и вы можете отложить получение фактической ссылки на него в то время, когда вам это нужно.

AnotherSingleton anotherOne = anotherOneInstance.get(); 

Это должно позволить развертывание для достижения успеха и таймер для инициализации, но, конечно, если в данный момент вы пытаетесь использовать AnotherOne и репозиторий не доступен, код будет перерыв с исключением.

В качестве альтернативы, вы всегда можете сделать manual lookup through the BeanManager, чтобы не полагаться на какие-либо формы инъекций зависимостей, но это всегда должно быть крайним средством, поскольку это просто приводит к громоздкому коду.

+0

Спасибо за подсказку. Решение с Instance <> похоже работает отлично. – Eruanno

+0

@Eruanno Если этот ответ решил вашу проблему, пожалуйста, примите его, установив галочку рядом с ответом. –

Смежные вопросы