2011-10-28 6 views
2

私が開発しているアプリケーションのタスクの1つは、システム上で動作している他のアプリケーションのデータをバックアップすることです。無人で実行できるように、このバックアッププロセスをスケジュールする必要があります。私はJEE6/EJB3.1 Timerユーティリティを使用しています。JEE6再デプロイ中のタイマの持続性

私はTimerHandle型のフィールドを持つJPA2を使用してデータベースに永続化するクラスBackupConfigurationを持っています。ユーザーがバックアップをスケジュールすることを決めた場合は、新しい持続タイマーを作成し、TimerHandleフィールドに値を設定します。

サーバを再起動しても問題ありません。タイマーが再起動します(すべてのタイマーが一度に起動するため、一気に慌ててしまいます)。

私がアプリケーションを再デプロイすると(これは開発中にかなり発生します)、すべてのタイマーが失われます!私は愚かにタイマーがサーバーに結びついていると仮定しましたが、アプリケーションに結びついていることが判明しました。

私の疑問は、どのような再配置でも永続的なタイマーを作る最良の方法は何ですか?

私が見ることができる唯一の解決策は、ScheduleExpressionとTimerHandleをバックアップ構成で保存することです。その後、私はハンドルがあるがタイマーがない場合、私はタイマーを再作成します。しかし、この主な問題は、タイマーがないかどうかをアプリケーションが検出するたびに、スケジュールされたすべてのエンティティを列挙することを意味します。これは現在のところ多くの仕事ではありませんが、将来的には莫大なコストがかかる可能性があります。

+0

? WebSphere Application Serverの動作を説明していますが、明確ではありません。これが使用しているアプリケーションサーバーの場合、アンインストールを実行したときにアプリケーションサーバーが停止されていない限り、再デプロイ中に永続タイマーをクリアしないようにするオプションはないと思います(たとえば、切断されたwsadminセッションを使用)。 –

+0

GlassFish 3.0.1を使用していますが、これは標準的な動作です。 – wobblycogs

答えて

1

ほとんどの(おそらくすべての)アプリケーションサーバーは、タイマーをサーバーではなくアプリケーションに永続させるように見えます。これはアプリケーションを削除するときにタイマーが掛からないようにするため意味があります。 NetBeansは、少なくとも再配布する前にアプリケーションを削除し、すべてのタイマーを失うため、開発中には面倒です。

解決策は、TimerHandleとスケジューリング情報をデータベースに格納することです。アプリケーションが起動すると、TimerRepairシングルトンBeanが作成され、必要なクラスでrepairTimersを呼び出します。 repairTimersメソッドは、すべてのスケジュールを選択し、TimerHandleがTimerを回復しようとする場合に選択します。 Timerリカバリが例外をスローすると、スケジューリング情報からTimerが再作成されます。全体的には解決策としてはそれほど悪くはありませんが、多くのアイテムが予定されていると、それが本当に心配しているのは過度の起動時間です。

2

asadmin redeployコマンドのGlassFishには、--keepstate=trueオプションがあります。
再デプロイメント間にEJBタイマを保持します。あなたが見ることができます詳細について
: アプリケーションサーバーを使用している
http://docs.oracle.com/cd/E18930_01/html/821-2418/beahw.html
http://docs.oracle.com/cd/E18930_01/html/821-2416/ggndx.html#SJSASEEAGgkudf
http://docs.oracle.com/cd/E18930_01/html/821-2433/redeploy-1.html#scrolltoc

関連する問題