JBossESBにてカスタムアクションクラスをPOJO(アノテーション)で作成する

今回はJBossESBにおけるPOJOアノテーション)でのカスタムアクションの作成方法について。
とは言ってもなんてことはない、Programmers Guideの中で使えそうなものをまとめただけ。

@Process、@OnSuccess、@OnException

JBossESBをひも解く(その1) - ITエンジニアとして生きるでも言及したが、action pipelineのアーキテクチャは以下のようになっている。

で、@Process、@OnSuccess、@OnExceptionはそれぞれ

  • @Process --->メソッド
  • @OnSuccess --->OKメソッド
  • @OnException --->例外メソッド

に対応している。

ソースにするとこんな感じ。

public class SampleAction {

	@Process
	public Message process(Message message) {
		System.out.println("メソッド");
		return message;
	}

	@OnSuccess
	public void onSuccess(Message message) {
		System.out.println("OKメソッド");
	}

	@OnException
	public void onException(Message message, Throwable th) {
		System.out.println("例外メソッド");
		System.out.println("例外メッセージ : " + th.getMessage());
	}
}


@ConfigProperty

@ConfigPropertyを付けとくと、jboss-esb.xmlに定義したプロパティ値をマッピングしてくれる。
プロパティ名は変数名(下例だと「val」)に合わせる必要がある。
(もちろん別名指定する方法もあるが、あまり用途も無さそうなのでここでは割愛)

public class SampleAction {

	@ConfigProperty
	private String val;
	
	@Process
	public Message process(Message message) {
		System.out.println("プロパティ値 : " + val);
		return message;
	}
}

jboss-esb.xml

<service name="sample" description="" category="Category" invmScope="GLOBAL">
	<actions>
		<action name="sample" class="org.sample.soa.esb.actions.SampleAction">
			<property name="val" value="for test" />
		</action>
	</actions>
</service>

これで変数val に「"for test"」がマッピングされる。


ここで1点注意。
定義されたプロパティ値("for test"の箇所)は「java.lang.String」として扱われ、
変数(val)に値をマッピングする際に

コンストラクタ(java.lang.String xxx)

で初期化する。
そのため、コンストラクタで「java.lang.String」を受け入れないものは@ConfigPropertyを利用できない。

つまり

public class SampleAction {

	@ConfigProperty
	private File file;

   :
   :

は動作するが

public class SampleAction {

	@ConfigProperty
	private java.util.logging.Logger logger;

   :
   :

はエラーとなってしまう、ということ。

File(java.lang.String xxx)は存在するが、Logger(java.lang.String xxx)は存在しないため、初期化出来ずにエラーとなってしまう。)


@Initialize、@Destroy

これは説明いらないかな・・・というくらい単純。
@Initializeはデプロイ時、@Destroyはアンデプロイ時の処理を指定出来る。

public class SampleAction {

	@Initialize
	public void initialize(){
		System.out.println("デプロイ時の処理");
	}
	
	@Destroy
	public void destroy(){
		System.out.println("アンデプロイ時の処理");
	}
	
	
	@Process
	public Message process(Message message) {
		System.out.println("メソッド");
		return message;
	}
}

正確には@Initializeは「クラスロード時に」だと思うが、Programmers Guide

Sometimes action implementations need to perform initialization tasks at deployment time. 
They may also need to perform a clean-up whilst being undeployed.  
For these reasons, there are @Initialize and @Destroy method annotations.

と言及されているので、デプロイ時としている。
まぁ、そんな大差ないかな。


おしまい。