JBossESB HelloWorldインスタンス解析
本稿では、JBossESBに付属のhelloworld_について具体的に説明します.Action例では,JBossESBの動作メカニズムを特定のHelloWorldでの構成により解析する.
1、 jboss-esb.xml
このファイルは%JBOSSESBに保存されています.HOME%/sample/quickstarts/helloworld_アクション中です.jboss-esb.xmlの構成を見るときは、2つの部分に分けるべきです.
1.1、Providers部分の構成コードは以下の通りである.
dest-type="QUEUE"
dest-name="queue/quickstart_helloworld_action_Request"
/>
dest-type="QUEUE"
dest-name="queue/quickstart_helloworld_action_esb"
/>
まず
1.2、サービスの一部の構成コードは以下の通りである.
name="SimpleListener"
description="Hello World">
busidref="quickstartGwChannel"
is-gateway="true"
/>
busidref="quickstartEsbChannel"
/>
class="org.jboss.soa.esb.actions.SystemPrintln"/>
process="displayMessage">
class="org.jboss.soa.esb.samples.quickstart.helloworldaction.MyJMSListenerAction"
process="playWithMessage">
class="org.jboss.soa.esb.actions.Notifier">
第2の部分はサービスを定義する部分であり、ここでは現在のesbパケットが提供するサービスs.を定義する.各サービスは
listenerでは、busidrefによってproviderで定義されたbusに関連付けられています.ここでは、2つのlistenerを定義しています.そのうちの1つはGatewayとして、外部からJMSのメッセージを取得することだけを担当しています.その後、ESB内部に必要なMessageに移行する.もう1つのlistenerは、このMessageがサービス内部で通信するためのチャネルである.従って、サービスごとに少なくとも1つのlistenerを内部Message伝送用として定義しなければならない.
2、 MyJMSListenerアクションの定義:
public class MyJMSListenerAction extends AbstractActionLifecycle
{
protected ConfigTree _config;
public MyJMSListenerAction(ConfigTree config) { _config = config; }
public Message noOperation(Message message) { return message; }
public Message displayMessage(Message message) throws Exception{
logHeader();
System.out.println("Body: "+ message.getBody().get().toString());
logFooter();
return message;
}
public Message playWithMessage(Message message) throws Exception {
// Header msgHeader = message.getHeader();
Body msgBody = message.getBody();
// Call theCall = msgHeader.getCall();
// EPR theEpr = theCall.getFrom();
String contents = msgBody.get().toString();
StringBuffer sb = new StringBuffer();
sb.append("/nBEFORE**/n");
sb.append(contents);
sb.append("/nAFTER**/n");
msgBody.add(sb.toString());
return message;
}
public void exceptionHandler(Message message, Throwable exception) {
logHeader();
System.out.println("!ERROR!");
System.out.println(exception.getMessage());
System.out.println("For Message: ");
System.out.println(message.getBody().get());
logFooter();
}
//This makes it easier to read on the console
private void logHeader() {
System.out.println("/n&&&&&&&&&&&&&&&&&&&&&&&&&&");
}
private void logFooter() {
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&/n");
}
)
上記のメソッドはjboss-esb.xmlファイルのactionに対応します.actionのnameはactionの別名を表し、classはactionメソッドが存在するクラス(パッケージおよびクラス名)を定義し、processはそのクラスの具体的なメソッドを表します.
3、 Esbファイルディレクトリ構造
サーバディレクトリの下に.esbのファイルを配置します.ディレクトリ構造は次のとおりです.
4、 クライアントコールサービス
現在、JBossESBでは、一般的にサービスを呼び出すには2つの方法がある.1つはGateway listener、もう1つはServiceInvokerのAPIを直接介して呼び出す.
1、 jboss-esb.xml
このファイルは%JBOSSESBに保存されています.HOME%/sample/quickstarts/helloworld_アクション中です.jboss-esb.xmlの構成を見るときは、2つの部分に分けるべきです.
providers
とservices
です.1.1、Providers部分の構成コードは以下の通りである.
dest-name="queue/quickstart_helloworld_action_Request"
/>
dest-name="queue/quickstart_helloworld_action_esb"
/>
まず
<providers>
です.一連の<provider>
からなり、現在はjms-provider、fs-provider、ftp-providerなどがあります.それから、providerでこの.esbファイルの中でserviceが定義したlistenerに必要なbusを定義します.Busはメッセージングに必要な伝送層として簡単に理解できます.以下に示すように、2つのBusを定義しました.一つはGatewayのListener用、もう一つはESB-aware Message伝送に必要な伝送層である.1.2、サービスの一部の構成コードは以下の通りである.
description="Hello World">
is-gateway="true"
/>
/>
process="playWithMessage">
第2の部分はサービスを定義する部分であり、ここでは現在のesbパケットが提供するサービスs.を定義する.各サービスは
<listener>
と<actions>
から構成され、actionsはn個のactionから構成される.ここのactionはメッセージ(Message)を処理する場所である.listenerでは、busidrefによってproviderで定義されたbusに関連付けられています.ここでは、2つのlistenerを定義しています.そのうちの1つはGatewayとして、外部からJMSのメッセージを取得することだけを担当しています.その後、ESB内部に必要なMessageに移行する.もう1つのlistenerは、このMessageがサービス内部で通信するためのチャネルである.従って、サービスごとに少なくとも1つのlistenerを内部Message伝送用として定義しなければならない.
2、 MyJMSListenerアクションの定義:
public class MyJMSListenerAction extends AbstractActionLifecycle
{
protected ConfigTree _config;
public MyJMSListenerAction(ConfigTree config) { _config = config; }
public Message noOperation(Message message) { return message; }
public Message displayMessage(Message message) throws Exception{
logHeader();
System.out.println("Body: "+ message.getBody().get().toString());
logFooter();
return message;
}
public Message playWithMessage(Message message) throws Exception {
// Header msgHeader = message.getHeader();
Body msgBody = message.getBody();
// Call theCall = msgHeader.getCall();
// EPR theEpr = theCall.getFrom();
String contents = msgBody.get().toString();
StringBuffer sb = new StringBuffer();
sb.append("/nBEFORE**/n");
sb.append(contents);
sb.append("/nAFTER**/n");
msgBody.add(sb.toString());
return message;
}
public void exceptionHandler(Message message, Throwable exception) {
logHeader();
System.out.println("!ERROR!");
System.out.println(exception.getMessage());
System.out.println("For Message: ");
System.out.println(message.getBody().get());
logFooter();
}
//This makes it easier to read on the console
private void logHeader() {
System.out.println("/n&&&&&&&&&&&&&&&&&&&&&&&&&&");
}
private void logFooter() {
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&/n");
}
)
上記のメソッドはjboss-esb.xmlファイルのactionに対応します.actionのnameはactionの別名を表し、classはactionメソッドが存在するクラス(パッケージおよびクラス名)を定義し、processはそのクラスの具体的なメソッドを表します.
3、 Esbファイルディレクトリ構造
サーバディレクトリの下に.esbのファイルを配置します.ディレクトリ構造は次のとおりです.
/META-INF/jboss-esb.xml
/META-INF/deployment.xml , classloader.
jbm-queue-service.xml (optional) Queue
**.jar (optional)
classes
4、 クライアントコールサービス
現在、JBossESBでは、一般的にサービスを呼び出すには2つの方法がある.1つはGateway listener、もう1つはServiceInvokerのAPIを直接介して呼び出す.