14.12. アノテーションの使用


以下は、アクションクラスに追加できるアノテーションです。
@Process
最も単純な実装では、@Process アノテーションが付けられた 1 つのメソッドを持つ基本的な プレーンな古い Java オブジェクト (POJO)でアクションを作成します。
public class MyLogAction {

                @Process
 		    public void log(Message message) {
		        // log the message...
		    }
		}
Copy to Clipboard Toggle word wrap
@Process アノテーションは、クラスを有効な アクション として識別します。  クラスに複数のメソッドがある場合は、メッセージインスタンス(またはメッセージの一部)の処理に使用される メソッドも特定します。@BodyParam、@PropertyParam、および @AttachmentParam アノテーションの説明については、より詳細な説明があります。)
この アクション のインスタンスを パイプライン に設定するには、低/ベースレベルの アクション の実装と同じプロセスを使用します( AbstractActionPipelineProcessor を拡張するか、ActionLifecycle、または他のサブタイプまたは抽象実装のいずれかを実装するもの)。
<service .....>
		    <actions>
		        <action name="logger" class="com.acme.actions.MyLogAction" />
		    </actions>
		</service>
Copy to Clipboard Toggle word wrap
@Process アノテーションが付けられた複数のメソッドが アクション 実装に関連付けられている場合は、process 属性を使用して、メッセージインスタンスの処理に使用するメソッドを指定します。
<service .....>
		    <actions>
		        <action name="logger" class="com.acme.actions.MyLogAction" 
                                           process="log" />
		    </actions>
		</service>
Copy to Clipboard Toggle word wrap
@process メソッドを実装して以下を返すことができます。
  • void。これは、上記のロガーアクションの実装と同様に戻り値がないことを意味します。
  • Message: これはメッセージインスタンスです。  これは、アクションパイプラインのアクティブ/現在のインスタンスになります。
  • 別のタイプ。  メソッドがメッセージインスタンスを返さない場合、返されるオブジェクトインスタンスはアクションパイプラインの現在のメッセージインスタンスに設定されます。  メッセージに設定する場所は、set-payload-location<action> 設定プロパティーによって異なります。これは、通常の MessagePayloadProxy ルールに従ってデフォルトです。
@Process メソッドを使用して、さまざまな方法でパラメーターを指定します。これにより、以下が可能になります。
  1. メッセージインスタンスをメソッドパラメーターとして指定します。
  2. 任意のパラメータータイプを 1 つ以上指定します。  Enterprise Service Bus フレームワークは、アクティブ/現在のパイプラインメッセージインスタンスでそのタイプのデータを検索します。最初に、メッセージボディー、プロパティー、添付ファイルの順に検索し、このデータをそれらのパラメーターの値として渡します (または見つからない場合は null)。
最初のオプションの例は、ロガーアクションの上述されています。  2 番目のオプションの例を以下に示します。
public class OrderPersister {

		    @Process
		    public OrderAck storeOrder(OrderHeader orderHeader,
								OrderItems orderItems) {
		        // process the order parameters and return an ack...
		    }
		}
Copy to Clipboard Toggle word wrap
この例では、@Process メソッドは パイプライン の以前のアクションに依存して OrderHeader および OrderItem オブジェクトインスタンスを作成し、それらを現在のメッセージに割り当てます。  (おそらく、より現実的な実装では、XML または EDI ペイロードを注文インスタンスにデコードする一般的なアクション実装があり、その後に返されます。 OrderPersister は注文インスタンスを唯一のパラメーターとして取ります。 以下に例を示します。
public class OrderDecoder {

		    @Process
		    public Order decodeOrder(String orderXML) {
		        // decode the order XML to an ORder instance... 
		    }
		}

		public class OrderPersister {

		    @Process
		    public OrderAck storeOrder(Order order) {
		        // persist the order and return an ack...
		    }
		}
Copy to Clipboard Toggle word wrap
サービス設定で 2 つのアクションをチェーンします。
<actions>
    <action name="decode" class="com.acme.orders.OrderDecoder" />
    <action name="persist" class="com.acme.orders.OrderPersister" />
</actions>
Copy to Clipboard Toggle word wrap
このコードは、アノテーションが少ないため、オプション #2 で読み取るのが簡単になりますが、適切なパラメーター値のメッセージを介してランタイムのhunting のプロセスが完全に確定されないため、リスクが発生し ます。  このため、Red Hat は @BodyParam、@PropertyParam、および @AttachmentParam アノテーションをサポートします。
これらの @Process メソッドパラメーターアノテーションを使用して、メッセージのどこから @Process メソッドの個別のパラメーター値を取得するかを明示的に定義します。その名前が示すように、これらの各アノテーションを使用すると、特定のパラメーターの名前付きの場所 (メッセージボディー、プロパティー、または添付ファイル内) を指定できます。
public class OrderPersister {

  		    @Process
		    public OrderAck storeOrder(
		                   @BodyParam("order-header") OrderHeader orderHeader,
		                   @BodyParam("order-items") OrderItems orderItems) {
			
		        // process the order parameters and return an ack...
		    }
		}
Copy to Clipboard Toggle word wrap
指定したメッセージの場所に値が含まれていない場合は、このパラメーターに 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>
Copy to Clipboard Toggle word wrap
これらのプロパティーを使用するには、低/ベースレベルのアクション実装を使用します( AbstractActionPipelineProcessor を拡張するか、ActionLifecycleを実装してください)。これには、ConfigTree クラス(コンストラクターを介してアクションに提供される)の使用が関係します。アクションを実装するには、以下の手順に従います。
  1. ConfigTree インスタンスを提供するアクションクラスでコンストラクターを定義します。
  2. ConfigTree インスタンスから関連するアクション設定プロパティーをすべて取得します。
  3. 必須のアクションプロパティーの有無を確認し、<action> 設定で指定されていない場所で例外を発生させます。
  4. すべてのプロパティー値を文字列( ConfigTreeで指定)からアクション実装で使用される適切なタイプにデコードします。たとえば、java.lang.String から java.io.Filejava.lang.String をブール値に、java.lang.String を long などに決定します。
  5. 設定した値をターゲットプロパティータイプにデコードできない場所で例外を発生させます。
  6. 複数の異なる設定の可能性に ユニットテスト を実装し、上記のタスクが適切に完了していることを確認します。
上記のタスクは一般的に簡単ですが、面倒でエラーが発生しやすく、設定ミスの処理方法に関してアクション間で不整合が発生する可能性があります。  多くのコードを追加して、混乱が発生する場合もあります。
アノテーションが付けられたアクションは、@ConfigProperty を介してこれらの問題に対処します。MyLogActions 実装を展開します。これには、logFilelogLevel の 2 つの必須の設定プロパティーがあります。
public class MyLogAction {

		    @ConfigProperty
		    private File logFile;

		    @ConfigProperty
		    private LogLevel logLevel;
 
		    public static enum LogLevel {
		        DEBUG, 
		        INFO, 
		        WARN
		    }

		    @Process
		    public void log(Message message) {
		        // log the message at the configured log level...
		    }
		}
Copy to Clipboard Toggle word wrap
注記
@ConfigProperty アノテーションを "setter" メソッドで定義することもできます(フィールドの ではなく)。
これはすべて完了する必要があります。Enterprise Service Bus がアクションをデプロイすると、実装とデコードされた値内のマップの両方を検証します(上記の LogLevel enum の場合のように列挙のサポートを含む)。@ConfigProperty アノテーションを持つアクションフィールドを見つけます。開発者は、ConfigTree クラスをまったく処理したり、追加のコードを開発したりする必要はありません。
デフォルトでは、@ConfigProperty アノテーションを持つすべてのクラスフィールドは必須です。  必須ではないフィールドは、以下の 2 つの方法のいずれかで処理されます。
  1. フィールドの @ConfigProperty アノテーションに use = Use.OPTIONAL を指定します。
  2. フィールドの @ConfigProperty アノテーションに defaultVal を指定します。(これはオプションです。)
ログアクションのプロパティーのみをオプションにするには、以下のようなアクションを実装します。
public class MyLogAction {
		
		    @ConfigProperty(defaultVal = "logs/my-log.log")
		    private File logFile;

		    @ConfigProperty(use = Use.OPTIONAL)
		    private LogLevel logLevel;

		    public static enum LogLevel {
		        DEBUG, 
		        INFO, 
		        WARN
		    }

		    @Process
		    public void log(Message message) {
		        // log the message...
		    }
		}
Copy to Clipboard Toggle word wrap
@ConfigProperty アノテーションは、2 つの追加フィールドをサポートします。
  1. name: アクションインスタンスでその名前のフィールドを入力するために使用されるアクション設定プロパティーの名前を明示的に指定します。
  2. choice: このフィールドを使用して、それ自体に許可される設定値を制限します。  これは、( LogLevelのように)列挙型を使用して実行することもできます。
name フィールドは、古いアクション(低/ベースレベル実装タイプを使用する)を新しいアノテーションベースの実装に移行する場合など、さまざまな状況で使用される場合があります。これは、プロパティーの古い設定名(後方互換性のために変更できない)が有効な Java フィールド名にマップされないことのみとなります。ログアクションを例として取り込むと、これがログアクションの古い設定であったとします。
<action ...>
		    <property name="log-file" value="logs/my-log.log" />
		    <property name="log-level" value="DEBUG" />
		</action>
Copy to Clipboard Toggle word wrap
ここでのプロパティー名は有効な Java フィールド名にマッピングされないため、@ConfigProperty アノテーションの名前を指定します。
public class MyLogAction {
		
		    @ConfigProperty(name = "log-file")
		    private File logFile;

		    @ConfigProperty(name = "log-level")
		    private LogLevel logLevel;

		    public static enum LogLevel {
		        DEBUG, 
		        INFO, 
		        WARN
		    }

		    @Process
		    public void log(Message message) {
		        // log the message...
		    }
		}
Copy to Clipboard Toggle word wrap
Bean 設定のプロパティー値は文字列の値からデコードされます。適切な POJO Bean プロパティータイプと照合するには、以下の単純なルールが使用されます。
  1. プロパティータイプに単一引数の文字列コンストラクターがある場合は、それを使用します。
  2. Pimitive の場合は、オブジェクトタイプの単一引数の文字列コンストラクターを使用します。たとえば、int の場合は、Integer オブジェクトを使用します。
  3. 列挙の場合は、Enum.valueOf を使用して設定文字列を列挙値に変換します。
@initialize および @Destroy
アクションの実装は、デプロイ時に初期化タスクを実行する必要がある場合があります。また、アンデプロイ中にクリーンアップのウォールを実行する必要もあります。  このような理由により、@Initialize および @Destroy メソッドアノテーションがあります。
以下に例をいくつか示します。デプロイメント時に、ロギングアクションは一部のチェック(例:ファイルとディレクトリーが存在する)を実行しなければならない場合があります。また、いくつかの初期化タスクを実行することもできます(書き込みのためにログファイルを開くなど)。アンデプロイ時には、(ファイルを閉じるなど)クリーンアップタスクを実行する必要がある場合があります。これらのタスクを実行するコードを以下に示します。
public class MyLogAction {

		    @ConfigProperty
		    private File logFile;

		    @ConfigProperty
		    private LogLevel logLevel;

		    public static enum LogLevel {
		        DEBUG, 
		        INFO, 
		        WARN
		    }

		    @Initialize
		    public void initializeLogger() {
			// Check if file already exists… check if parent folder 
			// exists etc...
			// Open the file for writing...
		    }
 
		    @Destroy
		    public void cleanupLogger() {
		        // Close the file...
		    }

		    @Process
		    public void log(Message message) {
		        // log the message...
		    }
		}
Copy to Clipboard Toggle word wrap
注記
@ConfigProperty アノテーションはすべて、@Initialize デプロイヤーが @Initialize メソッドを呼び出す際に処理されます。そのため、@Initialize メソッドは、カスタム初期化を実行する前にこれらのフィールドの準備が整っている可能性があります。
注記
メソッドの指定には、これらの両方のアノテーションを常に使用する必要はありません。  必要な場合にのみ指定します。つまり、メソッドが初期化のみを必要とする場合は、@Initialize アノテーションのみを使用します(@Destroy アノテーションが付けられた一致メソッドを指定する必要はありません)。
注記
単一のメソッドを指定し、@Initialize と @Destroy の両方にアノテーションを付けることができます。
注記
オプションで、@Initialize メソッドで ConfigTree パラメーターを指定できます。これは、ConfigTree インスタンスに依存するアクションにアクセスできるようにします。
@onSuccess および @OnException
これらのアノテーションを使用して、アクションが設定されている パイプライン の正常な実行または失敗した実行で実行するメソッドを指定します。
public class OrderPersister {

		    @Process
		    public OrderAck storeOrder(Order order) {
		        // persist the order and return an ack...
		    }

		    @OnSuccess
		    public void logOrderPersisted(Message message) {
		        // log it...
		    }

		    @OnException
		    public void manualRollback(Message message, 
                                           Throwable theError) {
		        // manually rollback...
		    }
		}
Copy to Clipboard Toggle word wrap
これらの両方のアノテーションの場合、メソッドに渡されるパラメーターは任意です。上記のパラメーターには、none、一部、またはすべてを指定できます。  Enterprise Service Bus のフレームワークは、それぞれの場合に関連するパラメーターを解決します。

トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat