Java EEアプリケーションで長期実行プロセスを同期から非同期の実行に移行したいと考えています。プロセスは自動的に開始され、1時間ごとに実行されます。 このプロジェクトはJava EE 6を搭載したGlassfish 3.1で動作します。Java EEの@Startupを正しく使用するには?
読んだところ、@Singleton
と@Startup
でJava EE 6でこのようなサービスを開始できると思います。 だから、私は
@Startup
@Singleton
public class MyService {
}
新しいクラスを作成するとMavenを経由して、既存の統合テストを実行します。 私の驚いたことに、テストは最も基本的な "ページがあります"テストに失敗します。彼らはもはやエラーページを取得するWebページを見つけることはありません。
実験の結果、@Startup
注釈が削除され、もう一度テストが実行されます。今回は成功します。
サーバーを手動で起動してページに移動すると、予想される結果が得られます。ページはそこにあります。 さらに、eclipseでは、両方の注釈を使用したテストが成功します。私が見ることができる唯一の違いは、Cargo Mavenプラグインではなく、サーバーを起動するのは日食であるということです。
ここで何が問題になる可能性がありますか? @Startup
を正しく使用するにはどうすればよいですか?
更新: eclipseからIntelliJ IDEAに切り替えても、まだこの問題があります。 はしかし、私はいくつかの例外を参照してください - 多分あなたは彼らから何かを行うことができます。
[#| 2011-07-25T10:22:+ 0200 51.529 | SEVERE | glassfish3.1 | javax.enterprise.system。 tools.deployment.org.glassfish.deployment.common | _ThreadID = 65; _ThreadName =スレッド-1; |例外呼び出すクラスはメソッド
にjavax.ejb.EJBException開始org.glassfish.ejb.startup.EjbApplicationながら:javaxのを。 ejb.CreateException:Singleton MailServiceの初期化に失敗しました。 com.sun.ejb.containers.AbstractSingletonContainer $ SingletonContextFactory.create(AbstractSingletonContainer.java:719) at com.sun.ejb.containers.AbstractSingletonContainer.instanti org.glassfish.ejb.startup.SingletonLifeCycleManager.initializeSingleton(SingletonLifeCycleManager.java:177) でorg.glassfish.ejb.startup.SingletonLifeCycleManager.initializeSingleton(SingletonLifeCycleManager.java:216) でateSingletonInstance(AbstractSingletonContainer.java:449) でjavax:org.glassfish.ejb.startup.SingletonLifeCycleManager.doStartup org.glassfish.ejb.startup.EjbApplication.start(EjbApplication.java:177)で(SingletonLifeCycleManager.java:155) ...
によって引き起こされます.ejb.CreateException:Singleton MailServiceの初期化に失敗しました。 com.sun.ejb.containers.AbstractSingletonContainer.createSingletonEJB(AbstractSingletonContainer.java:545)(AbstractSingletonContainer.java:717) ... 36以上
()は、 org.jboss.weld.manager.BeanManagerImplでjava.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:768) でjava.lang.NullPointerExceptionが:によって引き起こさ。org.glassfish.weld.services.JCDIServiceImpl._createJCDIInjectionContextでorg.jboss.weld.manager.BeanManagerImpl.getBean(BeanManagerImpl.java:144) でgetBean(BeanManagerImpl.java:1209) (JCDIServiceImpl.java:144)
このような目的で@Scheduleを使用する方がよいでしょうか? – alexblum
ありがとうございます。私はそれを試してみましょう。 –
Alex - '@ Schedule'は' @ Timeout'よりずっと簡単です。しかし、 '@ Startup'や' @ Singleton'アノテーションに代わるものはありません。説明するケア? –