2016-08-03 4 views
3

私たちはエンタープライズアプリケーションを開発しています。すべてのサービスは、穏やかなWebサービスとして公開されます。ビジネスロジックはejbsで書かれています。 ejbsから多くのバックエンドシステムを呼び出さなければなりません。バックエンドは、組織内のさまざまなアプリケーション/チームから公開されているWebサービスです。ejbsにインターセプタをプログレッシブに追加することはできますか?

は、以下の簡単な流れにある

WS1 < - > BL_EJB1 < - > BE_EJB1

WSは、BLは、ビジネスロジックのWebサービスであり、BEバックエンドです

トランザクション全体をreporting_statsおよびfailure_statsというテーブルに保持します。それらは基本的に、ユーザーID、リクエストが入った時刻、応答が送信された時刻、呼び出されたWebサービスのパス、ビジネスロジックから呼び出されたバックエンドの名前、ステータスバックエンドからの応答を得るためにどれくらいの時間がかかったかなど、バックエンドコールの応答などでした。

このログは、すべてのサービスで共通であるため、トランザクションを記録するためのインターセプタが導入されましたテーブルの詳細。インターセプタとejbsは、EjbContextを介してデータを交換します。以下は、WS1 <修正フロー

ある - >インターセプタ(BL_EJB1)< - >インターセプタ(BE_EJB1)

我々はBL_EJB3からBL_EJB1とBL_EJB2を呼び出す必要がある状況があります。この場合、BL_EJB1とBL_EJB2上のインターセプタをトリガする必要はありません。

開発中にメソッドに注釈を付ける代わりに、インターセプタを実行時に導入する方法はありますか?

+1

(インターセプタの代わりに、またはインターセプタを使用することに加えて)アプリケーションのレイヤーはどうなりますか? WS1はロギングなどが行われる上位ファサードレイヤを呼び出し、上位ファサードレイヤは実際のビジネスロジックが行われる下位レイヤからメソッドを呼び出します。下位層からの他のサービスは、上位のファサード層を通過することなく互いに呼び出すことができる。 – stg

答えて

0

実行時にProcessAnnotatedType -Phase(例:this SO質問)にインターセプタを追加する方法があります。しかし、私があなたの問題を理解する限り、ejb呼び出しごとにインターセプタを切り替える必要があります。

インターセプタをバイパスする前に、自分のコードに与えるメリットについて再考するでしょう。それはいくつかの機能を追加するだけでなく、それを文書化します。メソッドにたとえば@LogTransactionDetailsと注釈が付いている場合は、トランザクションの詳細であることが絶対に明らかです。ランタイムマジックでこれを回避すると、数週間、数日、数日後に混乱することになります。

私はstgとして提案された追加のレイヤーが好きです。あなたのコードとビジネス境界を明確にします。

しかし、これはあなたのユースケースでは選択肢ではありません:既にあなたのインターセプタでEJBContextを使用しています。追加のフラグNoNeedForLoggingEJBContext#getContextData()に追加してBL_EJB3を呼び出し、インターセプタでInvocationContext#getContextData()を使用して参照することができます。

関連する問題