第15章にてデータベースの接続情報(永続性ユニット)作成後EJBタイマーが正常に作動しなくなる

ホーム フォーラム Q&A「わかりやすいJavaEE」 第15章にてデータベースの接続情報(永続性ユニット)作成後EJBタイマーが正常に作動しなくなる

このトピックには4件の返信が含まれ、1人の参加者がいます。1 ヶ月、 3 週間前 daisuke さんが最後の更新を行いました。

5件の投稿を表示中 - 1 - 5件目 (全5件中)
  • 投稿者
    投稿
  • #2739 返信

    daisuke

    ◇環境
    Windows 10 Pro 64bit
    NetBeans IDE 8.0.2 (Build 201411181905)
     →インストール版、Zip版両方で発生しました。
    GlassFish Server 4.1

    ◇事象
    15-2 2.2データベースの使い方に記載されているデータベース接続情報の作成にて持続性ユニットを作成後、
    EJBタイマーを利用したプログラムのexcersize-chap13とexcersize-chap14が
    エラーによってデプロイできなくなる。

    ◇エラー内容
    コンソール
    C:\NetBeansprojects\exercise_chap13\nbproject\build-impl.xml:1048: モジュールはデプロイされませんでした。
    詳細は、サーバーのログ・ファイルを参照してください。
    ビルド失敗(合計時間: 1秒)

    Glassfish Server コンソール
     重大: Exception while loading the app
     重大: Undeployment failed for context /exercise_chap13
     警告: EJB Timer Service is not available. Timers for application with id 100603488505495552 will not be deleted
     重大: Exception while loading the app : EJB Timer Service is not available

    ◇その他詳細
    Glass Fish管理コンソールの
    Resources → JDBC → JDBC Connection Pools 配下にある
    __TimerPoolのpingが永続性ユニット作成後、以下エラーで通らなくなりました。

    An error has occurred
    java.lang.ExceptionInInitializerError

    An error has occurred
     java.lang.NoClassDefFoundError: Could not initialize class org.apache.derby.jdbc.EmbeddedDriver Could not initialize class org.apache.derby.jdbc.EmbeddedDriver

    なお、Configurations → server-config → EJB Container →[EJB Timer Service]タブの
    Timer Datasource はデフォルトのまま空欄となっています。
    永続性ユニット作成前はこちらで正常動作していました。

    ◇依頼事項
    事象の発生原因と解決方法についてご教示いただければと思います。
    よろしくお願いいたします。

    #2746 返信

    川場隆

    クリーンな環境を構築し直して試してみると、確かにご指摘の現象が再現しました。
    そこで、いろいろ調べてみましたが、はっきりした原因はわかりません。
    ただ、15章の持続性ユニットを作成したのは、無関係だと思います。
    GlassFishのバグであるというのが、大方の見解のようです。

    @StatelessでタイマーEJBを実行すると、Glassfishは、それを記憶しておくために、EmbeddedタイプのJavaDBに記録を残すのですが、複数回に渡ってアプリケーションを起動すると、その書き換えがうまくいかなくなることが原因と考えられます。

    対処方法として、サーバーのセキュリティ設定を書き変えるとか、ドメイン領域のマーカーファイルを消すなど、さまざまな方法が報告されていますが、どれもケースバイケースで、ここで報告されている状況は解決できませんでした。

    ただ、@Statelessではなく、@Singleton を使うとバグを回避して実行できました。
    ソースコードを示しますので、試してみてください。
    変更箇所は// でコメントアウトしています。

    import javax.ejb.EJB;
    import javax.ejb.Schedule;
    //import javax.ejb.Stateless;
    import javax.inject.Singleton;

    //@Stateless
    @Singleton
    public class WeatherNews {

    @EJB
    WeatherFeed feed;

    @EJB
    MailSender sender;

    // 必ずpersistent=falseを指定する
    // 以下では、実際のメールID、パスワード、メールアドレスをセットしてください。
    @Schedule(hour = “*/6”, persistent = false)
    public void send() {
    sender.send(“あなたのメールアドレス”, “お天気情報”, feed.rss(13));
    }
    }

    #2749 返信

    daisuke

    ご回答ありがとうございます。

    問題発生状態で、@Statelessから@Singletonに変更しましたが、事象解決しませんでした。

    再度、NetBeansとGlassFishを入れ直し、
    @Singletonのソースを用いて、検証したところ、以下の通りでした。

    1.クリーンな状態でexercise_chap13とexercise_chap14のデプロイを実施
      →正常終了

    2.15章のsample21-01を用いた永続性ユニット作成手順を実施後、exercise_chap13とexercise_chap14のデプロイを実施
      →正常終了

    3.sample21-01を実行
      →正常終了

    4.exercise_chap13とexercise_chap14のデプロイを実施
      →同様のエラーが発生

    永続性ユニット作成自体は影響がないようですが、それを使用したプログラムを実行すると@Singletonでも同様のエラーが発生するようです。GlassFishのバグとのことですが、回避策等はないのでしょうか。

    ご教示いただけますと幸いです。

    #2752 返信

    川場隆

    こちらでも試してみましたが、現象は再現しませんでした。Sample21-1を実行後も、exercise_chap13とexercise_chap14は、正常に、何度でも起動します。
    参考までに、ビデオを作ってみましたのでご覧ください。

    #2753 返信

    daisuke

    ご返信ありがとうございます。

    私のミスで、Singletonのimport文が間違っておりました。

    誤:import javax.ejb.Singleton;
    正:import javax.inject.Singleton;

    import javax.inject.Singleton;に変更し、実行、デプロイしたところ正常に動作いたしました。
    動画まで作成いただき、誠にありがとうございました。

    本件はクローズでお願いいたします。

5件の投稿を表示中 - 1 - 5件目 (全5件中)
返信先: 第15章にてデータベースの接続情報(永続性ユニット)作成後EJBタイマーが正常に作動しなくなる
あなたの情報: