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

标签 jakarta-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之后,我仍然遇到这个问题。
但是,我看到了一些异常(exception)情况-也许您可以从中做出一些贡献:

[#|2011-07-25T10:22:51.529+0200|SEVERE|glassfish3.1|javax.enterprise.system.tools.deployment.org.glassfish.deployment.common|_ThreadID=65;_ThreadName=Thread-1;|Exception while invoking class org.glassfish.ejb.startup.EjbApplication start method

javax.ejb.EJBException: javax.ejb.CreateException: Initialization failed for Singleton MailService at com.sun.ejb.containers.AbstractSingletonContainer$SingletonContextFactory.create(AbstractSingletonContainer.java:719) at com.sun.ejb.containers.AbstractSingletonContainer.instantiateSingletonInstance(AbstractSingletonContainer.java:449) at org.glassfish.ejb.startup.SingletonLifeCycleManager.initializeSingleton(SingletonLifeCycleManager.java:216) at org.glassfish.ejb.startup.SingletonLifeCycleManager.initializeSingleton(SingletonLifeCycleManager.java:177) at org.glassfish.ejb.startup.SingletonLifeCycleManager.doStartup(SingletonLifeCycleManager.java:155) at org.glassfish.ejb.startup.EjbApplication.start(EjbApplication.java:177) ...

Caused by: javax.ejb.CreateException: Initialization failed for 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 more

Caused by: java.lang.NullPointerException at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:768) at org.jboss.weld.manager.BeanManagerImpl.getBean(BeanManagerImpl.java:1209) at org.jboss.weld.manager.BeanManagerImpl.getBean(BeanManagerImpl.java:144) at org.glassfish.weld.services.JCDIServiceImpl._createJCDIInjectionContext(JCDIServiceImpl.java:144)

最佳答案

毕竟问题不是注解,而是beans.xml放错了地方。根据需要将其放在META-INF中,帮助我克服了这一难题。

切换到IntelliJ IDEA可以帮助解决问题:在其中,日志文件包含将Bean创建为@Singleton@ApplicationScoped的高度可见的错误。

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

关于jakarta-ee - 如何正确使用Java EE的@Startup?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6791220/

相关文章:

java - 缺少@AnnotationDrivenTx Spring3

java - 注解处理中如何获取父类(super class)名

java - Mysql/Glassfish 无效资源 jdbc

java - Jetty 调用 ServletContextListener.contextInitialized() 后会发生什么

java - 严重: Exception while loading the app : EJB Container initialization error

python - 为什么将元组分配给带注释的变量需要括号?

java - 是否可以覆盖 Glassfish v3 的默认日志记录?

java - 轻松使用 ejb

php - 在 SAP 上下文中从 php 迁移到 java 的策略

jakarta-ee - 如何在 JEE6 应用程序中 stub 外部接口(interface)进行测试?