0

EJBタイマーサービスの利用に関して質問するシナリオがあります。

ユースケースは次のとおりです。システムは、特定のタイムスタンプを使用して、ファイルの変更についてSubversionリポジトリをポーリング/要求するタスクをスケジュールできる必要があります。

スケジュールされたタスクが実行されようとしているときはいつでも、特定のsvnリポジトリに対してコマンドを実行するという考え方です。この特定の目的のために、外部プロセスを呼び出すことはしませんが、SVNKitJavaライブラリhttp://svnkit.com/を使用する「純粋な」Javaの方法を使用します。

私の唯一の懸念はこれです:外部プロセスを呼び出すタスクを実行するためにEJBタイマーサービスを使用するのは良い考えですか?私の方法では「純粋な」Javaの方法を使用しますが、バッチファイル/コマンドライン/外部実行可能ファイルをタイマーサービスロジックに直接呼び出すなどの他のシナリオでは使用します。

サーバーのメモリ使用量/パフォーマンスなどの影響が心配です。

これは良い考えですか?

私が考えているもう1つの考えは、ポーリングを実行し、そこでロジックをコーディングするSWT / Swingなどのクライアントベースのテクノロジーを使用してサーバーに「デスクトップ」アプリケーションを作成することですが、これは2つのアプリケーションを管理する必要があることを意味します。 。ポーリングする「デスクトップ」アプリと、Glassfishで作成する「Web」ユーザーインターフェイス。

私は、Glassfishである私の選択したアプリサーバーですべてを行うことに傾倒しています。

以前にEJBタイマーを使用しましたが、外部サービスを呼び出さずにデータベースを呼び出すだけで、このシナリオが発生しただけなので、ここで質問をして、これを行った経験のある人からさらに考えを集めました。

何かご意見は?

4

1 に答える 1

3

理論的には、EJBはコンテナ/サーバーによるBeanインスタンス、スレッドなどの管理を妨げるため、外部I/Oに依存することは想定されていません。

実際には、予防策を講じればこれでうまくいくはずです。例えば:

  • 関数を独自のEJB(つまり、これらのタイマーのみを処理するステートレスセッションBean)に分離して、インスタンスプーリングの問題を回避します
  • ハングしたプロセスがすべてのサーバースレッドをハングさせないように、コマンドの待機中にタイムアウトを使用します
  • 複数のOSコマンドを同時に実行するようにタイマーをスケジュールしないようにしてください

EJB 3.0タイマーは永続的であることに注意してください(非永続的であるオプションがあるEJB 3.1タイマーと比較して)。つまり、次のことを意味します。

  1. これらは、クラスター内の任意のサーバーで実行できます。クラスタに複数のマシンがある場合は、それらすべてがコマンドを実行できることを確認する必要があります。
  2. それらはサーバーの再起動後も存続します。タイマーを実行するようにスケジュールしたが、サーバーがクラッシュする前にクラッシュした場合は、サーバーの再起動時にタイマーが実行されます。これは、インターバルタイマー(すべての欠落したタイマーが繰り返し起動する)および既存の時間を注意深く管理しない場合(冗長タイマーを簡単に作成できる)に特定の問題を引き起こす可能性があります。
于 2012-10-23T02:43:16.537 に答える