2011-07-22 15 views
3

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)

+1

このような目的で@Scheduleを使用する方がよいでしょうか? – alexblum

+0

ありがとうございます。私はそれを試してみましょう。 –

+0

Alex - '@ Schedule'は' @ Timeout'よりずっと簡単です。しかし、 '@ Startup'や' @ Singleton'アノテーションに代わるものはありません。説明するケア? –

答えて

5

結局のところ、この問題は注釈ではなく、間違ってbeans.xmlでした。必要に応じてMETA-INFに入れておくと、これを過ぎ去るのに役立ちました。

IntelliJ IDEAに切り替えると、問題が解決しました。ログファイルには、@Singleton@ApplicationScopedのようにBeanを作成する際に目に見えるエラーが含まれていました。

JBossで全く同じアプリケーションを試してみると非常に役に立ちました。ここではうまくいきましたので、私は基本的な概念を誤解していないと確信していました。

関連する問題