3

しばらくの間、JSF マネージド Bean の代わりに CDI Bean (Myfaces CODI を使用) を使用する Bean を使用して、このテクノロジで実際に何ができるかをよりよく理解するために、いくつかのチュートリアルを行ってきました。悪用される可能性が最も高いのは CDI イベント モデルですが、それを何に使用できるかについてはあまりインスピレーションがありません。

クリティカル パスでデータベースにアクセスせずにページ アクセスの永続的な記録を維持するページ カウンター メカニズムがあります。つまり、ページの読み込み時間が遅くなります。これは、シングルトン EJB に格納されたデータを使用して、AtomicReference によってアクセスされる ConcurrentHashMap 内の AtomicInteger をインクリメントすることによって機能します。次に、EJB タイマーが定期的にマップを「取得」して新しいマップに置き換え、適切なデータベース レコードに新しいヒットを追加します。PreDestroy リスナーは、アプリ サーバーのシャットダウン時に永続化されていない更新を保存します。

ページの読み込み時に、アプリケーション スコープの CDI Bean がそれを監視してバックエンド処理を行う「ページ アクセス」イベントを起動するだけでよいと考えましたが、これはいくつかの点で既存の設計には及ばないものです。

  • 現在、更新はバッチ処理されており、タイマー メソッドは数分ごとにのみ実行されます。

  • サーバーの電源障害が発生した場合、既存の設計ではデータが失われますが、これは望ましくありませんが許容できますが、正常なシャットダウンを処理するという点でかなり信頼性があります。

サーバーのシャットダウンなどの場合に、キューに入れられた CDI イベントに何が起こるかをよりよく理解する必要があります。これを理解するために仕様を調べます。

私が本当に興味を持っているのは、JSF アプリケーションで CDI イベントを使用する興味深いシナリオに触発されているという上記のアイデアに関するフィードバックをいただければ幸いですが、経験を共有したい人はいますか?

ありがとう。

4

2 に答える 2

3

CDIイベントは、jsfアプリケーションの次のユースケースで使用できます。

  • ユーザーがログイン/ログアウトしたいときにイベントを発生/監視する
  • ユーザーがロケールを変更したときにイベントを発生/監視する
  • ユーザーがテーマを変更したときにイベントを発生/監視する

ユースケースでは、ページビュー統計を保存するEJBに@Asynchronousで注釈を付けて、別のスレッドでそれを行うことができます。そうすれば、ページの読み込みが遅くなることはないと思います。

一般に、古いイベント/オブザーバーパターンを使用したいが、分離されたエレガントな方法とDI機能を使用したい場合は、CDIイベントを使用できます。そして、このパターンはさまざまなユースケースに適用できます。

詳細については、このブログもお読みください。link1 link2

于 2012-08-24T11:15:12.607 に答える
1

まず第一に、イベントは非同期ではなく同期です。つまり、明らかに JMS のように使用することはできず、サーバーが停止した場合のフェイルオーバーのようなものはありません。

実際、私が知っている唯一の理由は、イベントメカニズムが導入された理由は、タイプセーフな方法でコンポーネントを分離するためです(しかし、それはかなりの理由です:)

私が遭遇した最もエレガントなシナリオの 1 つは Seam Catch (現在はSeam Solderに成形されています) です。この説明はこちらをご覧ください。そのイベント駆動型の例外処理の考え方は、さまざまな参加者 (別名: CDI モジュールとユーザー コード) が例外通知のために自分自身を登録できるようにすることです。イベントは、登録されたオブザーバーのチェーンをバブルアップおよびバブルダウンし、固有の CDI メカニズムを使用して、最も適切なハンドラーを自動的に見つけます。

ドキュメントを読んだり、自分でソースコードをチェックしたりするのが最善です。

于 2012-08-23T15:40:55.153 に答える