14.12. アノテーションの使用
以下は、アクションクラスに追加できるアノテーションです。
- @Process
- 最も単純な実装では、@Process アノテーションが付けられた 1 つのメソッドを持つ基本的な プレーンな古い Java オブジェクト (POJO)でアクションを作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow @Process アノテーションは、クラスを有効なアクションとして識別します。 クラスに複数のメソッドがある場合は、メッセージインスタンス(またはメッセージの一部)の処理に使用される メソッドも特定します。@BodyParam、@PropertyParam、および @AttachmentParam アノテーションの説明については、より詳細な説明があります。)このアクションのインスタンスをパイプラインに設定するには、低/ベースレベルのアクションの実装と同じプロセスを使用します(AbstractActionPipelineProcessorを拡張するか、ActionLifecycle、または他のサブタイプまたは抽象実装のいずれかを実装するもの)。<service .....> <actions> <action name="logger" class="com.acme.actions.MyLogAction" /> </actions> </service>
<service .....> <actions> <action name="logger" class="com.acme.actions.MyLogAction" /> </actions> </service>Copy to Clipboard Copied! Toggle word wrap Toggle overflow @Process アノテーションが付けられた複数のメソッドがアクション実装に関連付けられている場合は、process 属性を使用して、メッセージインスタンスの処理に使用するメソッドを指定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow @process メソッドを実装して以下を返すことができます。- void。これは、上記のロガーアクションの実装と同様に戻り値がないことを意味します。
- Message: これはメッセージインスタンスです。 これは、アクションパイプラインのアクティブ/現在のインスタンスになります。
- 別のタイプ。 メソッドがメッセージインスタンスを返さない場合、返されるオブジェクトインスタンスはアクションパイプラインの現在のメッセージインスタンスに設定されます。 メッセージに設定する場所は、set-payload-location<action> 設定プロパティーによって異なります。これは、通常の
MessagePayloadProxyルールに従ってデフォルトです。
@Process メソッドを使用して、さまざまな方法でパラメーターを指定します。これにより、以下が可能になります。- メッセージインスタンスをメソッドパラメーターとして指定します。
- 任意のパラメータータイプを 1 つ以上指定します。 Enterprise Service Bus フレームワークは、アクティブ/現在のパイプラインメッセージインスタンスでそのタイプのデータを検索します。最初に、メッセージボディー、プロパティー、添付ファイルの順に検索し、このデータをそれらのパラメーターの値として渡します (または見つからない場合は
null)。
最初のオプションの例は、ロガーアクションの上述されています。 2 番目のオプションの例を以下に示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow この例では、@Process メソッドはパイプラインの以前のアクションに依存してOrderHeaderおよびOrderItemオブジェクトインスタンスを作成し、それらを現在のメッセージに割り当てます。 (おそらく、より現実的な実装では、XML または EDI ペイロードを注文インスタンスにデコードする一般的なアクション実装があり、その後に返されます。OrderPersisterは注文インスタンスを唯一のパラメーターとして取ります。 以下に例を示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow サービス設定で 2 つのアクションをチェーンします。<actions> <action name="decode" class="com.acme.orders.OrderDecoder" /> <action name="persist" class="com.acme.orders.OrderPersister" /> </actions><actions> <action name="decode" class="com.acme.orders.OrderDecoder" /> <action name="persist" class="com.acme.orders.OrderPersister" /> </actions>Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコードは、アノテーションが少ないため、オプション #2 で読み取るのが簡単になりますが、適切なパラメーター値のメッセージを介してランタイムのhunting のプロセスが完全に確定されないため、リスクが発生し ます。 このため、Red Hat は @BodyParam、@PropertyParam、および @AttachmentParam アノテーションをサポートします。これらの @Process メソッドパラメーターアノテーションを使用して、メッセージのどこから @Process メソッドの個別のパラメーター値を取得するかを明示的に定義します。その名前が示すように、これらの各アノテーションを使用すると、特定のパラメーターの名前付きの場所 (メッセージボディー、プロパティー、または添付ファイル内) を指定できます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 指定したメッセージの場所に値が含まれていない場合は、このパラメーターに null を渡します(@Process メソッドインスタンスはこれの処理方法を決定できます)。一方、指定した場所に誤ったタイプの値が含まれる場合、MessageDeliverExceptionが出力されます。 - @ConfigProperty
- ほとんどのアクションには、ある程度のカスタム設定が必要です。 Na アクション設定では、プロパティーは <action> 要素の <property> サブ要素として提供されます。
<action name="logger" class="com.acme.actions.MyLogAction"> <property name="logFile" value="logs/my-log.log" /> <property name="logLevel" value="DEBUG" /> </action><action name="logger" class="com.acme.actions.MyLogAction"> <property name="logFile" value="logs/my-log.log" /> <property name="logLevel" value="DEBUG" /> </action>Copy to Clipboard Copied! Toggle word wrap Toggle overflow これらのプロパティーを使用するには、低/ベースレベルのアクション実装を使用します(AbstractActionPipelineProcessorを拡張するか、ActionLifecycleを実装してください)。これには、ConfigTreeクラス(コンストラクターを介してアクションに提供される)の使用が関係します。アクションを実装するには、以下の手順に従います。ConfigTreeインスタンスを提供するアクションクラスでコンストラクターを定義します。ConfigTreeインスタンスから関連するアクション設定プロパティーをすべて取得します。- 必須のアクションプロパティーの有無を確認し、<action> 設定で指定されていない場所で例外を発生させます。
- すべてのプロパティー値を文字列(
ConfigTreeで指定)からアクション実装で使用される適切なタイプにデコードします。たとえば、java.lang.Stringからjava.io.File、java.lang.Stringをブール値に、java.lang.Stringを long などに決定します。 - 設定した値をターゲットプロパティータイプにデコードできない場所で例外を発生させます。
- 複数の異なる設定の可能性に ユニットテスト を実装し、上記のタスクが適切に完了していることを確認します。
上記のタスクは一般的に簡単ですが、面倒でエラーが発生しやすく、設定ミスの処理方法に関してアクション間で不整合が発生する可能性があります。 多くのコードを追加して、混乱が発生する場合もあります。アノテーションが付けられたアクションは、@ConfigProperty を介してこれらの問題に対処します。MyLogActions 実装を展開します。これには、logFile と logLevel の 2 つの必須の設定プロパティーがあります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記@ConfigProperty アノテーションを "setter" メソッドで定義することもできます(フィールドの ではなく)。これはすべて完了する必要があります。Enterprise Service Bus がアクションをデプロイすると、実装とデコードされた値内のマップの両方を検証します(上記の LogLevel enum の場合のように列挙のサポートを含む)。@ConfigProperty アノテーションを持つアクションフィールドを見つけます。開発者は、ConfigTreeクラスをまったく処理したり、追加のコードを開発したりする必要はありません。デフォルトでは、@ConfigProperty アノテーションを持つすべてのクラスフィールドは必須です。 必須ではないフィールドは、以下の 2 つの方法のいずれかで処理されます。- フィールドの @ConfigProperty アノテーションに
use = Use.OPTIONALを指定します。 - フィールドの @ConfigProperty アノテーションに defaultVal を指定します。(これはオプションです。)
ログアクションのプロパティーのみをオプションにするには、以下のようなアクションを実装します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow @ConfigProperty アノテーションは、2 つの追加フィールドをサポートします。- name: アクションインスタンスでその名前のフィールドを入力するために使用されるアクション設定プロパティーの名前を明示的に指定します。
- choice: このフィールドを使用して、それ自体に許可される設定値を制限します。 これは、( LogLevelのように)列挙型を使用して実行することもできます。
name フィールドは、古いアクション(低/ベースレベル実装タイプを使用する)を新しいアノテーションベースの実装に移行する場合など、さまざまな状況で使用される場合があります。これは、プロパティーの古い設定名(後方互換性のために変更できない)が有効な Java フィールド名にマップされないことのみとなります。ログアクションを例として取り込むと、これがログアクションの古い設定であったとします。<action ...> <property name="log-file" value="logs/my-log.log" /> <property name="log-level" value="DEBUG" /> </action>
<action ...> <property name="log-file" value="logs/my-log.log" /> <property name="log-level" value="DEBUG" /> </action>Copy to Clipboard Copied! Toggle word wrap Toggle overflow ここでのプロパティー名は有効な Java フィールド名にマッピングされないため、@ConfigProperty アノテーションの名前を指定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Bean 設定のプロパティー値は文字列の値からデコードされます。適切な POJO Bean プロパティータイプと照合するには、以下の単純なルールが使用されます。- プロパティータイプに単一引数の文字列コンストラクターがある場合は、それを使用します。
- Pimitive の場合は、オブジェクトタイプの単一引数の文字列コンストラクターを使用します。たとえば、int の場合は、Integer オブジェクトを使用します。
- 列挙の場合は、
Enum.valueOfを使用して設定文字列を列挙値に変換します。
- @initialize および @Destroy
- アクションの実装は、デプロイ時に初期化タスクを実行する必要がある場合があります。また、アンデプロイ中にクリーンアップのウォールを実行する必要もあります。 このような理由により、@Initialize および @Destroy メソッドアノテーションがあります。以下に例をいくつか示します。デプロイメント時に、ロギングアクションは一部のチェック(例:ファイルとディレクトリーが存在する)を実行しなければならない場合があります。また、いくつかの初期化タスクを実行することもできます(書き込みのためにログファイルを開くなど)。アンデプロイ時には、(ファイルを閉じるなど)クリーンアップタスクを実行する必要がある場合があります。これらのタスクを実行するコードを以下に示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記@ConfigProperty アノテーションはすべて、@Initialize デプロイヤーが @Initialize メソッドを呼び出す際に処理されます。そのため、@Initialize メソッドは、カスタム初期化を実行する前にこれらのフィールドの準備が整っている可能性があります。注記メソッドの指定には、これらの両方のアノテーションを常に使用する必要はありません。 必要な場合にのみ指定します。つまり、メソッドが初期化のみを必要とする場合は、@Initialize アノテーションのみを使用します(@Destroy アノテーションが付けられた一致メソッドを指定する必要はありません)。注記単一のメソッドを指定し、@Initialize と @Destroy の両方にアノテーションを付けることができます。注記オプションで、@Initialize メソッドでConfigTreeパラメーターを指定できます。これは、ConfigTreeインスタンスに依存するアクションにアクセスできるようにします。 - @onSuccess および @OnException
- これらのアノテーションを使用して、アクションが設定されている
パイプラインの正常な実行または失敗した実行で実行するメソッドを指定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow これらの両方のアノテーションの場合、メソッドに渡されるパラメーターは任意です。上記のパラメーターには、none、一部、またはすべてを指定できます。 Enterprise Service Bus のフレームワークは、それぞれの場合に関連するパラメーターを解決します。