如何正确使用Java EE的@Startup?

时间:2011-07-22 14:05:24

标签: java-ee annotations glassfish startup

我想将Java EE应用程序中长时间运行的进程从同步执行转移到异步执行。该过程应自动启动,然后每小时运行一次。 该项目使用Java EE 6在Glassfish 3.1中运行。

经过一些阅读,我相信我可以通过@Singleton@Startup在Java EE 6中启动此类服务。 所以,我创建了一个新类

@Startup
@Singleton
public class MyService {
}

并通过maven运行现有的集成测试。 令我惊讶的是,测试失败了,直到最基本的“页面就在那里” - 测试。他们不再找到网页,而是找到错误页面。

试验,我删除@Startup注释,然后再次运行测试。这一次,他们成功了。

手动启动服务器并导航到该页面会产生预期结果:页面在那里。 更重要的是,在eclipse中,他们通过两个注释成功完成了测试。我能看到的唯一区别是启动服务器的是eclipse,而不是Cargo Maven插件。

这里可能出现什么问题? 如何正确使用@Startup

更新: 从eclipse切换回IntelliJ IDEA后,我仍然遇到这个问题。 但是,我看到了一些例外 - 也许你可以用它们做点什么:

  

[#| 2011-07-25T10:22:51.529 + 0200 |严重| glassfish3.1 | javax.enterprise.system.tools.deployment.org.glassfish.deployment.common | _ThreadID = 65; _ThreadName = Thread- 1; |调用类org.glassfish.ejb.startup.EjbApplication start方法时的异常

     

javax.ejb.EJBException:javax.ejb.CreateException:Singleton MailService的初始化失败       at com.sun.ejb.containers.AbstractSingletonContainer $ SingletonContextFactory.create(AbstractSingletonContainer.java:719)       at com.sun.ejb.containers.AbstractSingletonContainer.instantiateSingletonInstance(AbstractSingletonContainer.java:449)       在org.glassfish.ejb.startup.SingletonLifeCycleManager.initializeSingleton(SingletonLifeCycleManager.java:216)       在org.glassfish.ejb.startup.SingletonLifeCycleManager.initializeSingleton(SingletonLifeCycleManager.java:177)       在org.glassfish.ejb.startup.SingletonLifeCycleManager.doStartup(SingletonLifeCycleManager.java:155)       在org.glassfish.ejb.startup.EjbApplication.start(EjbApplication.java:177)   ...

     

引起:javax.ejb.CreateException:Singleton MailService的初始化失败       at com.sun.ejb.containers.AbstractSingletonContainer.createSingletonEJB(AbstractSingletonContainer.java:545)       at com.sun.ejb.containers.AbstractSingletonContainer.access $ 100(AbstractSingletonContainer.java:79)       at com.sun.ejb.containers.AbstractSingletonContainer $ SingletonContextFactory.create(AbstractSingletonContainer.java:717)       ......还有36个

     

引起:java.lang.NullPointerException       at 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.JCDIServiceImpl._createJCDIInjectionContext(JCDIServiceImpl.java:144)

1 个答案:

答案 0 :(得分:5)

问题不在于注释,它是一个错位的beans.xml。根据需要将其放入META-INF,这有助于我超越这一点。

切换到IntelliJ IDEA有助于解决问题:在其中,日志文件包含非常明显的错误,用于将bean创建为@Singleton以及@ApplicationScoped

另一件事证明非常有用的是在JBoss中尝试完全相同的应用程序。在这里,它有效,所以我有信心我没有误解基本概念。