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; } }
<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.
と言及されているので、デプロイ時としている。
まぁ、そんな大差ないかな。
おしまい。