Как правильно использовать @Startup в Java EE? - PullRequest
3 голосов
/ 22 июля 2011

Я хочу перевести длительный процесс в приложении Java EE из синхронного в асинхронное выполнение.Процесс должен запускаться автоматически, а затем запускаться каждый час.Проект выполняется в Glassfish 3.1 с Java EE 6.

После некоторого прочтения я считаю, что могу запускать такие сервисы в Java EE 6 через @Singleton и @Startup.Итак, я создаю новый класс

@Startup
@Singleton
public class MyService {
}

и запускаю существующие интеграционные тесты через maven.К моему удивлению, тесты провалились, вплоть до самого основного теста «страница есть».Они больше не находят веб-страницы, вместо этого получают страницы с ошибками.

Экспериментируя, я удаляю аннотацию @Startup и снова запускаю тесты.На этот раз им это удается.

Запуск сервера вручную и переход на страницу дает ожидаемый результат: страница есть.Более того, в Eclipse тесты пройдены успешно с обоими аннотациями.Единственное отличие, которое я вижу, состоит в том, что сервер запускает затмение, а не плагин Cargo Maven.

Что здесь может пойти не так?Что мне нужно сделать, чтобы правильно использовать @Startup?

Обновление: после возврата к IntelliJ IDEA из затмения у меня все еще остается эта проблема.Тем не менее, я вижу некоторые исключения - возможно, из них можно что-то сделать:

[# | 2011-07-25T10: 22: 51.529 + 0200 | SEVERE | glassfish3.1 | javax.enterprise.system.tools.deployment.org.glassfish.deployment.common | _ThreadID = 65; _ThreadName = Thread-1; | Исключительная ситуация при вызове класса org.glassfish.ejb.startup.EjbПрименение метода запуска

javax.ejb.EJBException: javax.ejb.CreateException: не удалось инициализировать службу Singleton MailService в com.sun.ejb.containers.AbstractSingletonContainer $ SingletonContextFactory.create (AbstractSingletonContainer.java:719) в com.sun.ejb.containersst.ContainingStainleSaingle449 вSingletonLifeCycleManager.doStartup (SingletonLifeCycleManager.java:155) at org.glassfish.ejb.startup.EjbApplication.start (EjbApplication.java:177) ...

Причина: javax.ejb.CreateException: не удалось инициализировать службу Singleton MailService в com.sun.ejb.containers.AbstractSingletonContainer.createSingletonEJB (AbstractSingletonContainer.java:545) на com.sun.ejb.containers.AbstractSingletonContainer.access $ 100 (AbstractSingletonContainer.java:79) на сайтеcreate (AbstractSingletonContainer.java:717) ... еще 36

Вызвано: java.lang.NullPointerException в java.util.concurrent.ConcurrentHashMap.get (ConcurrentHashMap.java:768) в org.jboss.weld.manager.BeanManagerImpl.getBean (BeanManagerImpl.java:1209) в org.jboss.weld.manager.BeanManagerImpl.getBean (BeanManagerImpl.java:144) в org.glassfish.weld.services.JmpII (JCDISJIJD))

1 Ответ

5 голосов
/ 25 июля 2011

В конце концов, проблема была не в аннотациях, а в неуместном beans.xml.Размещение в META-INF, как требуется, помогло мне обойти это.

Переключение на IntelliJ IDEA помогло решить проблему: в нем в файле журнала содержались заметные ошибки при создании компонента в виде @Singleton а также @ApplicationScoped.

Еще одна вещь, которая оказалась очень полезной, это попробовать точно такое же приложение в JBoss.Здесь это сработало, поэтому я был уверен, что не неправильно понял основные понятия.

...