ESB プログラマーガイド
JBoss 開発者向け
エディッション 5.2.0
概要
前書き
1. 謝辞
第1章 ESB (Enterprise Service Bus)
1.1. ESB (Enterprise Service Bus) とは?
1.2. 実際に ESB を使用できる場面とは?

図1.1 シンプルなファイル移動

図1.2 変換とシンプルなファイル移動

図1.3 変換とキューを使用する簡単なファイル移動

図1.4 基本的なデータ変換

図1.5 変換とキュー
第2章 JBoss Enterprise Service Bus
2.1. Rosetta
注記

図2.1 Rosetta
- さまざまなトランスポートのメカニズムで動作させる設定が簡単に行えます (email や JMS など)。
- 汎用目的のオブジェクトリポジトリを提供します。
- プラグ可能なデータ変換のメカニズムを実現します。
- インタラクションのロギングに対応します。
重要
org.jboss.internal.soa.esb と org.jboss.soa.esb の 2 つのツリーがあります。 コンテンツは予告なしに変更されるため、org.jboss.internal.soa.esb パッケージ内にあるものはすべてその使用を制限してください。org.jboss.soa.esb は、Red Hat の廃止予定ポリシーの範囲となります。
2.2. JBoss Enterprise Service Bus のコア: 概要
- メッセージリスナーとメッセージフィルタリングコード。メッセージリスナーは、受信メッセージをリッスンするルーターとしての役割を果たします (JMS キューやトピック、ファイルシステム上にあるメッセージ)。その後、メッセージをフィルタリングして、別のメッセージエンドポイントにルーティングする (送信ルーター経由) 処理パイプラインに渡します。
SmooksActionプロセッサー経由のデータ変換コンポーネント (この件に関する詳細は、サービスガイドの「メッセージ変換」の章を参照)- コンテンツベースルーティングサービス (この件に関する詳細は、サービスガイドの「コンテンツベースルーティングとは」の章を参照)
- ESB 内で交換されたメッセージやイベントを保存する際に使用するメッセージリポジトリ (この件に関する詳細は、サービスガイドの「レジストリとは」の章を参照)
jdbc:teiid:vdb_name@mm://localhost:31000 です。

図2.2 一般的なデプロイメント
注記
第3章 サービスとメッセージ
- サービスはそれぞれ、ビジネス論理や統合ポイントをレガシーシステムでカプセル化します。
- メッセージを使い、クライアントとサービスは互いに通信します。
3.1. サービス
Listeners は、action pipeline へメッセージを送るため、サービスのインバウンドルーターとして機能します。
<?xml version = "1.0" encoding = "UTF-8"?>
<jbossesb xmlns="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.0.1.xsd" invmScope="GLOBAL">
<services>
<service category="Retail" name="ShoeStore" description="Acme Shoe Store Service">
<actions>
<action name="println" class="org.jboss.soa.esb.actions.SystemPrintln" />
</actions>
</service>
</services>
</jbossesb>
ServiceInvoker クラスを使用してサービスを呼び出すことができます。
ServiceInvoker invoker = new ServiceInvoker(“Retail”, “ShoeStore”); Message message = MessageFactory.getInstance().getMessage(); message.getBody().add(“Hi there!”); invoker.deliverAsync(message);
ServiceInvoker は Services Registry を使用して Retail:ShoeStore サービスが使用できるエンドポイントのアドレスをルックアップします。また、クライアントから使用できるサービスエンドポイントの 1 つにメッセージを送る処理をすべて行います。メッセージのトランスポート処理はクライアントに対して完全に透過的です。
ServiceInvoker に渡されるタイミングは、サービスに設定されているリスナーの種類により左右されます。例えば、JMS、FTP、HTTP などの種類です (上記の例では、リスナーは定義されていませんが、invmScope="GLOBAL" を使うことで、サービスの InVM listener が有効になっています)。
重要
- ゲートウェイリスナーゲートウェイリスナーの設定は、ゲートウェイエンドポイントを提供します。エンドポイントタイプは、ESB デプロイメント外部からメッセージのエントリポイントを提供します。また、サービスの
action pipelineへ送る前にメッセージペイロードを ESB Message へラップし、メッセージペイロードを「正規化」します。 - ESB 対応リスナーESB 対応のリスナーは、ESB 対応のエンドポイントを提供します。これは、ESB 対応コンポーネント間で ESB メッセージを交換する際に使用するエンドポイントのタイプです(たとえば、ESB 対応リスナーを使い、Bus 上でメッセージの交換ができます)。
<?xml version = "1.0" encoding = "UTF-8"?>
<jbossesb xmlns="http://anonsvn.labs.jboss.com/labs/jbossesb/
trunk/product/etc/schemas/xml/jbossesb-1.0.1.xsd">
<providers>
<jms-provider name="JBossMQ" connection-factory="ConnectionFactory">
<jms-bus busid="shoeStoreJMSGateway">
<jms-message-filter dest-type="QUEUE" dest-name="queue/shoeStoreJMSGateway"/>
</jms-bus>
</jms-provider>
</providers>
<services>
<service category="Retail" name="ShoeStore" description="Acme Shoe Store Service"
invmScope="GLOBAL">
<listeners>
<jms-listener name="shoeStoreJMSGateway" busidref="shoeStoreJMSGateway"
is-gateway="true"/>
</listeners>
<actions>
<action name="println" class="org.jboss.soa.esb.actions.SystemPrintln" />
</actions>
</service>
</services>
</jbossesb>
ServiceInvoker は、常にサービスのローカル InVM エンドポイントがあればそれを優先的に利用します)。
3.2. メッセージ
- 要求応答アーキテクチャーでなく一方向メッセージを使用します。
- 交換されたメッセージ内で規定の定義を維持します。後で実装の変更が大変難しくなるため、バックエンド実装の選択を公開するサービスインターフェースを定義しないようにしてください。
- メッセージペイロードに拡張可能なメッセージ構造を使用します。これにより、変更をバージョン化して後方互換性を維持することができます。
- 極端に粒度が細かいサービスは開発しないようにしてください。これは、簡単に環境の変化に対応できないような非常に複雑なアプリケーションが必要になることが多いためです (SOA のパラダイムは分散オブジェクトではなく、1 つのサービスである点を忘れないでください)。
<xs:complexType name="Envelope"> <xs:attribute ref="Header" use="required"/> <xs:attribute ref="Context" use="required"/> <xs:attribute ref="Body" use="required"/> <xs:attribute ref="Attachment" use="optional"/> <xs:attribute ref="Properties" use="optional"/> <xs:attribute ref="Fault" use="optional"/> </xs:complexType>

図3.1 メッセージの基本構造
org.jboss.soa.esb.message.Message インターフェースの実装です。このパッケージには、メッセージ内の各種フィールドのインターフェースが同梱されます。
public interface Message
{
public Header getHeader ();
public Context getContext ();
public Body getBody ();
public Fault getFault ();
public Attachment getAttachment ();
public URI getType ();
public Properties getProperties ();
public Message copy () throws Exception;
}
警告
org.jboss.soa.esb.addressing.Call クラスに関して学習するには、次章を参照してください)。
public interface Header
{
public Call getCall ();
public void setCall (Call call);
}
注記
警告
public interface Body
{
public static final String DEFAULT_LOCATION =
"org.jboss.soa.esb.message.defaultEntry";
public void add (String name, Object value);
public Object get (String name);
public byte[] getContents();
public void add (Object value);
public Object get ();
public Object remove (String name);
public void replace (Body b);
public void merge (Body b);
public String[] getNames ();
}
重要
add を使用してください。クライアントとサービスに対して同じバイト配列の場所が必要な場合、JBoss ESB が使用する ByteBody.BYTES_LOCATION を使用できます。
警告
DEFAULT_LOCATION) は注意して使用してください。
public interface Fault
{
public URI getCode ();
public void setCode (URI code);
public String getReason ();
public void setReason (String reason);
public Throwable getCause ();
public void setCause (Throwable ex);
}
警告
public interface Properties
{
public Object getProperty(String name);
public Object getProperty(String name, Object defaultVal);
public Object setProperty(String name, Object value);
public Object remove(String name);
public int size();
public String[] getNames();
}
注記
java.util.Properties を使用する properties はまだ、JBoss Enterprise Service Bus には実装されていません。これは、利用可能なクライアントやサービスのタイプを制限するためです。同じ理由から、Web Services スタックもこれらのプロパティを実装しません。この制約に対応するには、現在の抽出に java.util.Properties を埋め込んでください。
Attachment インターフェースは、名前の付いた添付と名前のない添付の両方をサポートします。JBossESB の現在のリリースでは、Java でシリアライズされたオブジェクトのみが添付として扱われます。今後のリリースではこの制限が解除される予定です
public interface Attachment
{
Object get(String name);
Object put(String name, Object value);
Object remove(String name);
String[] getNames();
Object itemAt (int index) throws IndexOutOfBoundsException;
Object removeItemAt (int index) throws IndexOutOfBoundsException
Object replaceItemAt(int index, Object value)
throws IndexOutOfBoundsException;
void addItem (Object value);
void addItemAt (int index, Object value)
throws IndexOutOfBoundsException;
public int getUnnamedCount();
public int getNamedCount();
}
注記
注記
- 開発者は、クライアントがサービスとの対話を行うために使用するコントラクトを定義します。このコントラクトの一部で、サービスの機能、非機能部分を指定します。例えば、航空予約サービス (機能) やトランザクション関連のサービス (非機能) です。また、開発者はサービスが理解できるオペレーション (メッセージ) も定義します。形式 (Java Serialized Message や XML) もメッセージ定義の一部として定義されます (この例ではトランザクションコンテキスト、座席番号、顧客名などです)。コンテンツを定義すると、サービスがペイロードがメッセージのどの部分にあるか分かるよう指定します (アタッチメントや、具体的な名前付きオブジェクト、またはデフォルトの名前付きオブジェクトなどの形式で行うことができます)。これはサービス開発者が決定します。唯一の制限事項は、オブジェクトとアタッチメントはグローバル一意名でなければならない点です (そうでなければ、同じメッセージボディが複数の「Hop」で転送される場合、サービスやアクションは別のものに向けられた部分的なペイロードを誤って拾ってしまう場合があります) 。
- サービスのコントラクト定義 (UDDI レジストリか、帯域外通信で) 取得でき、これでメッセージのどの部分にペイロードを置くかを定義します。それ以外の場所に置かれた情報は、ほぼ無視されるため、サービスが正しく実行されなくなります。
3.3. データの取得、設定
actions、listeners、gateways、routers、notifiers) はデフォルトでメッセージのデフォルトのペイロードの場所を使用して、メッセージ上にあるデータを "get"、"set" するよう設定されています。
MessagePayloadProxy を使用してメッセージの get やset を管理します。このクラスは上記のようにデフォルトのケースに対応しますが、すべてのコンポーネントで一様に無効にすることもできます。以下のコンポーネントプロパティを使用して、メッセージペイロードの get や set の場所を一様に無効にすることができます。
- get-payload-location: メッセージペイロードを取得する場所。
- set-payload-location: メッセージペイロードを設定する場所。
注記
jbossesb.sarに移動します。jbossesb-properties.xmlファイルを開きます。- core セクションで、use.legacy.message.payload.exchange.patterns プロパティを
trueに設定します。
3.4. ボディの拡張
拡張タイプ
org.jboss.soa.esb.message.body.content.TextBody- ボディの内容が任意のストリングの場合これを使用します。
getTextメソッドやsetTextメソッドを使用して操作することができます。 org.jboss.soa.esb.message.body.content.ObjectBody- ボディの内容がシリアライズされたオブジェクトの場合はこれを使います。
getObjectメソッドやsetObjectメソッドを使用して操作することができます。 org.jboss.soa.esb.message.body.content.MapBody- ボディの内容がマップ (ストリング、シリアライズされている) の場合これを使用します。
setMapメソッドやその他のメソッドを使用して操作することができます。 org.jboss.soa.esb.message.body.content.BytesBody- ボディの内容が任意の Java データタイプを含むバイトストリームの場合これを使用します。データタイプのメソッドを使用して操作することができます。
BytesMessageが作成されると、操作の必要に応じて読み取り専用モードまたは書き込み専用モード内に置かれます。readMode()メソッドやwriteMode()メソッドを使用してモードを変更することができますが、モードが変更される度にバッファーポイントがリセットされます。flush()メソッドを呼び出して、すべての更新がボディに適応されたことを確認する必要があります。
XMLMessageFactory クラスや SerializedMessageFactory クラスを使用すると、これらのインターフェースを基にしたボディの実装を持つメッセージを作成することができます。メッセージに対して作業を行う場合、MessageFactory クラスや MessageFactory に関連したクラスを使用するより、XMLMessageFactory クラスや SerializedMessageFactory クラスを使用した方が便利です。
createTextBody など、ボディの各タイプに関連する create メソッドが存在します。このメソッドによって、特定タイプのメッセージを作成し初期化することができます。メッセージの作成後、ローボディまたはインターフェースメソッドを使用して直接メッセージを操作することができます。ボディの構造は送信後も維持されるため、メッセージを作成したインターフェースのメソッドを使用すればメッセージの受信側が操作することもできます。
注記
3.5. メッセージヘッダー
org.jboss.soa.esb.addressing.Call クラスのインスタンスに格納されます。
public class Call
{
public Call ();
public Call (EPR epr);
public Call (Call copy);
public void setTo (EPR epr);
public EPR getTo () throws URISyntaxException;
public void setFrom (EPR from);
public EPR getFrom () throws URISyntaxException;
public void setReplyTo (EPR replyTo);
public EPR getReplyTo () throws URISyntaxException;
public void setFaultTo (EPR uri);
public EPR getFaultTo () throws URISyntaxException;
public void setRelatesTo (URI uri);
public URI getRelatesTo () throws URISyntaxException;
public void copy();
public void setAction (URI uri);
public URI getAction () throws URISyntaxException;
public final boolean empty();
public void setMessageID (URI uri);
public URI getMessageID () throws URISyntaxException;
public String toString();
public String stringForum();
public boolean valid();
public void copy (Call from);
}
org.jboss.soa.esb.addressing.Call は一方向パターンと要求返答対話パターンの両方をサポートします。
表3.1 org.jboss.soa.esb.addressing.Call プロパティ
| プロパティ | タイプ | 必須 | 説明 |
|---|---|---|---|
| To | EPR | Yes | メッセージ受信側のアドレス |
| From | EPR | No | メッセージ発信元のエンドポイント |
| ReplyTo | EPR | No | このメッセージに返信する受信側を特定するエンドポイント参照 |
| FaultTo | EPR | No | 不良の警告の受信側を識別するエンドポイント参照 |
| Action | URI | Yes | これは、メッセージが暗示するセマンティクスを一意かつ不透明に識別します。 |
| MessageID | URI | 場合による | 時空間でこのメッセージを一意に識別する URI。別のアプリケーションに使う予定のメッセージは [MessageID] を共有することはできません。メッセージは、通信エラーなどが原因で再送信され、同じ [MessageID] プロパティを使用する可能性があります。このプロパティの値は、不透明な URI で、等価を超えた解釈については定義されません。返信が来るものについては、このプロパティを必ず設置する必要があります。 |

図3.2 UML で表記されたヘッダーとエンドポイント参照の関係
注記
警告
注記
WS-Addressing 規格にまとめられています。
3.6. LogicalEPR
LogicalEPR とは、ESB サービス/エンドポイントの名前とカテゴリを指定する EPR のことです。LogicalEPR には物理アドレス指定の情報は含まれません。
LogicalEPR は EPR ユーザー(通常 ESB ですが、そうとは限りません)を想定しないため、LogicalEPR の選択が奨励されます。LogicalEPRのクライアントは EPR で提供されるサービス名やカテゴリの詳細を使用して、呼び出し が行われる時に(適切なアドレス指定情報を取得する場合など)サービスやエンドポイントに対する物理エンドポイントの詳細をルックアップできます。クライアントは適切な物理エンドポイントタイプを選択することもできます。
3.7. デフォルトの FaultTo
注記
LogicalEPR の詳細を参照してください。
3.8. デフォルトの ReplyTo
ReplyTo のデフォルトを使用するには、システム管理者は JBoss Enterprise Service Bus をデフォルト使用するよう設定する必要があります)。
表3.2 トランスポートによるデフォルトの ReplyTo
| トランスポート | ReplyTo |
|---|---|
| JMS | 元のリクエストの配信に使用した名前と同じものを持つキュー。接尾辞は _reply です。 |
| JDBC | 元の要求の配信に使用した名前を持つ同じデータベース内にあるテーブル。接尾辞は _reply_table (応答テーブルには、要求テーブルと同じ列定義が必要となります)。 |
| ファイル | ローカルファイルとリモートファイル共に管理的な変更は必要ありません。元の送信側のみが応答を受け取るようにするため、応答は固有のサフィックスで要求と同じディレクトリに書き込まれます。 |
3.9. メッセージペイロード
警告

図3.3 メッセージペイロードの UML 表記
add メソッドを使用します。粒度の細かくデータにアクセスできるように、名前付きのオブジェクトペアを使用します。どのタイプのオブジェクトでもメッセージボディに追加できます (Java シリアライズ可能でないオブジェクトを追加するには、JBoss Enterprise Service Bus にメッセージのマーシャル化とアンマーシャル化機能を追加する必要があります。このプロセスの詳細については、"メッセージフォーマット"のセクションを参照してください)。
注記
注記
注記
注記
3.10. MessageFactory
org.jboss.soa.esb.message.Message インターフェースの実装はすべて org.jboss.soa.esb.message.format.MessageFactory クラスから取得されます。
public abstract class MessageFactory
{
public abstract Message getMessage ();
public abstract Message getMessage (URI type);
public abstract void reset();
public static MessageFactory getInstance ();
}
- MessageType.JBOSS_XML: これは、ワイヤー上にあるメッセージの XML 表現を使用します。メッセージのスキーマは、
message.xsdファイルで定義します (schemasディレクトリ内にあります)。URI は urn:jboss/esb/message/type/JBOSS_XML です。 - MessageType.JAVA_SERIALIZED: この実装では、メッセージの全コンポーネントをシリアライズできます。また、このメッセージタイプの受信側には、デシリアライズするための十分な情報 (Java クラス) が必要なのは明らかです。URI はurn:jboss/esb/message/type/JAVA_SERIALIZED です。
重要
org.jboss.soa.esb.message.format.MessagePlugin を使用します。
public interface MessagePlugin
{
public static final String MESSAGE_PLUGIN =
"org.jboss.soa.esb.message.format.plugin";
public Object createBodyType(Message msg, String type);
public Message getMessage ();
public URI getType ();
}
getType() メソッドを使用して、提供するメッセージ実装のタイプを一意に識別しなければなりません。プラグインの実装は、org.jboss.soa.esb.message.format.plugin 拡張の付いたプロパティ名を使って jbossesb-properties.xml ファイル内でシステムに対し識別されなければなりません。
注記
JBOSS_XML です。これを変更するには、org.jboss.soa.esb.message.default.uri プロパティを任意の URI 名に設定します。
3.11. メッセージのフォーマット
MessageType.JAVA_SERIALIZED
IllegalParameterException がスローされます。
MessageType.JBOSS_XML
ワイヤー上にあるメッセージの XML 表現を使用します。メッセージのスキーマは、message.xsd ファイルで定義されます (schemas ディレクトリにあります)。任意オブジェクトをメッセージに追加できます。つまり、シリアライズする必要はありません。そのため、メッセージのシリアライズが必要な場合、このようなオブジェクトを XML にマーシャリングまたは、アンマーシャリングできるようにする必要があります。org.jboss.soa.esb.message.format.xml.marshal.MarshalUnmarshalPlugin から設定できます。
public interface MarshalUnmarshalPlugin
{
public static final String MARSHAL_UNMARSHAL_PLUGIN =
"org.jboss.soa.esb.message.format.xml.plugin";
public boolean canPack(final Object value);
public boolean marshal (Element doc, Object param)
throws MarshalException;
public Object unmarshal (Element doc) throws UnmarshalException;
public URI type ();
}
注記
jbossesb-properties.xml 設定ファイルよりシステムに登録しなければなりません。プラグインは MARSHAL_UNMARSHAL_PLUGIN で始まる属性名を持たなければなりません。
第4章 サービスの構築と使用
4.1. Listener、Notifier/Router、および Action
4.1.1. Listener
listener は replyTo エンドポイントにその結果をルーティングする前にメッセージを処理するメッセージプロセッサーの「パイプライン」にメッセージをフィードします。pipeline 内で行われるアクション処理はいくつかのステップで構成されることがあります。ここでは、特定のプロセッサーにメッセージが変換され、何らかのビジネスロジックが次のプロセッサーで適用されてから、その結果が pipeline 内の次のステップまたは別のエンドポイントにルーティングされます。
注記
4.1.2. Router
router によっては、unwrap プロパティに対応するものもあります。このプロパティを true に設定すると、自動的にメッセージペイロードを抽出して、次の ESB 未対応のエンドポイントに送信します。このオプションを false に設定すると、ペイロードを抽出せずに、ESB メッセージをすべて渡します (後者の場合、受け取り側のエンドポイントは ESB 対応であるため、メッセージの処理が可能です)。
action pipeline は、設定内で待機しているアクションがあったとしても、router 操作が実行されると、メッセージを処理しなくなります。このような種類の分割が必要な場合は、StaticWiretap アクションを使用します。
StaticWiretap や StaticRouter などのツールは、他のサービスへのルーティングにのみ使用することができます。メッセージコンテンツをベースにしたアクションで、動的にルーティングができるプログラムもあります。コンテンツベースルーターの詳細については、サービスガイドの「コンテンツベースルーティングとは」の章を参照してください。
注記
4.1.3. Notifier
notifiers を使用しないでください。ESB 認識のエンドポイントと ESB を認識しないエンドポイントに同じチャンネルでのリッスンを行わせることはできません。ESB 認識のエンドポイントと通信する場合はアクション内で couriers か ServiceInvoker を使用することを考慮してください。
notifiers に対してサポートされているわけではありません (また、その逆も同様)。notifiers は意図的に非常にシンプルになっています。byte[] または String のいずれか 1 つのみをトランスポートすることができます (ペイロードで toString() を呼び出すことにより取得)。
listener の役割とはメッセージ配信のエンドポイントとして動作し action pipeline にメッセージを配信することになります。 各 listener の設定は次に記す情報を提供する必要があります。
registry(service-category、service-name、service-description、およびEPR-descriptionタグ名)。オプションのremove-old-serviceタグ名をtrueに設定すると、Enterprise Service Bus はこの新しいインスタンスを追加する前にregistryから既存のすべてのサービスエントリを削除します。ただし、すべての エンドポイント参照 (EPR) を含むサービス全体が削除されるため注意してください。listenerクラスのインスタンス化 (listenerClassタグ名を参照)listenerが処理するエンドポイント参照 (EPR)。これはトランスポート固有となります。次の例は Java Message Service のエンドポイント参照 (JMS EPR) に該当します (connection-factory、destination-type、destination-name、jndi-type、jndi-URL、message-selectorのタグ名を参照)。action pipeline。1 つ以上の <action> 要素を必要とし、それぞれが少なくともclassのタグ名を含んでいる必要があり、これがchain内のそのリンクに対して、インスタンス作成するactionクラスを確定します。
<?xml version = "1.0" encoding = "UTF-8"?>
<jbossesb xmlns="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.0.1.xsd" parameterReloadSecs="5">
<providers>
<jms-provider name="JBossMQ"
connection-factory="ConnectionFactory"
jndi-URL="jnp://127.0.0.1:1099"
jndi-context-factory="org.jnp.interfaces.NamingContextFactory"
jndi-pkg-prefix="org.jboss.naming:org.jnp.interfaces">
<jms-bus busid="quickstartGwChannel">
<jms-message-filter dest-type="QUEUE"
dest-name="queue/quickstart_helloworld_Request_gw"/>
</jms-bus>
<jms-bus busid="quickstartEsbChannel">
<jms-message-filter dest-type="QUEUE"
dest-name="queue/quickstart_helloworld_Request_esb"/>
</jms-bus>
</jms-provider>
</providers>
<services>
<service category="FirstServiceESB"
name="SimpleListener" description="Hello World">
<listeners>
<jms-listener name="JMS-Gateway"
busidref="quickstartGwChannel" maxThreads="1"
is-gateway="true"/>
<jms-listener name="helloWorld"
busidref="quickstartEsbChannel" maxThreads="1"/>
</listeners>
<actions>
<action name="action1" class="org.jboss.soa.esb.samples.
quickstart.helloworld.MyJMSListenerAction"
process="displayMessage" />
<action name="notificationAction"
class="org.jboss.soa.esb.actions.Notifier">
<property name="okMethod" value="notifyOK" />
<property name="notification-details">
<NotificationList type="ok">
<target class="NotifyConsole"/>
</NotificationList>
<NotificationList type="err">
<target class="NotifyConsole"/>
</NotificationList>
</property>
</action>
</actions>
</service>
</services>
</jbossesb>
javax.jms.ObjectMessage 内でシリアライズされる受信 ESB メッセージを待機している listener オブジェクト (jms-listener 属性) のインスタンスを作成し、それぞれの受信メッセージを 2 つのステップから成る (<action> エレメント) action pipeline に配信します。
- action1:
MyJMSListenerAction(普通のサンプルが続く) - notificationAction:
org.jboss.soa.esb.actions.SystemPrintlnクラス
action クラスは XML アクション設定をデバッグする際に便利であることがわかります。
public class MyJMSListenerAction
{
ConfigTree _config;
public MyJMSListenerAction(ConfigTree config) { _config = config; }
public Message process (Message message) throws Exception
{
System.out.println(message.getBody().get());
return message;
}
}
action クラスを仕様して、ニーズに合わせてフレームワークをカスタマイズします。ActionProcessingPipeline クラスは少なくとも次を提供するために他のアクションクラスを必要とします。
ConfigTreeタイプの引数を 1 つとるパブリックコンストラクター- message 引数をとり、メッセージを返す 1 つまたは複数のパブリックメソッド
action pipeline の各ステップの結果を通知します (以下のアイテム 5 と 6 を参照)。
org.jboss.soa.esb.listeners.message.ActionProcessingPipeline クラスは <action> エレメントを使って設定されるすべてのステップに対して次のステップを実行します。
- class 属性で指定されるクラスのオブジェクトをインスタンス化します。これには、
ConfigTreeタイプの引数を 1 つとるコンストラクターを必要とします。 - process 属性のコンテンツを分析します。コンテンツはインスタンス作成されるクラスのパブリックメソッド名をコンマで区切った一覧になり (ステップ 1)、それぞれ
Messageタイプの単一引数をとらなければならず、結果、pipeline内で次のステップに渡される messagem オブジェクトを返します。process 属性がない場合、pipelineはprocessと呼ばれる単一の処理メソッドを使用するとみなされます。連続的に複数の <action> エレメントを使用するのに比べ、単一の <action> エレメントで複数のメソッド名一覧を使用する方が利点があります。actionクラスが一度インスタンス作成されると、複数のメソッドはそのクラスの同じインスタンスで呼び出されるからです。これによりオーバーヘッドを低減し、インスタンスオブジェクト内にステータス情報を保持することができます。ユーザー提供の (新しい)actionクラスに対して便利な方法になりますが、 他の代替方法 (<action> エレメントの一覧) も変わらず他の既存actionクラスを再利用できる方法となります。 - 前のステップで返されるメッセージを使って一覧内の各メソッドを連続して呼び出します。
null の場合、pipeline は処理を直ちに停止します。
- process 属性のメソッド一覧が正常に実行された場合、
pipelineは okMethod 属性のコンテンツを分析します。 - メソッドが指定されていない場合、処理が次の <action> エレメントに継続されます。
- メソッドが okMethod 属性内にある場合、ステップ3の最後のメソッドにより返されたメソッドを使用して呼び出します。パイプラインが正常に完了すると、okMethod 通知が最後ものから最初のものへ全ハンドラーに対して呼び出されます。
- 例外が発生すると
exceptionMethod通知が現在の (失敗している) ハンドラーから最初のハンドラーまですべてのハンドラー上で呼び出されます (現在のところ、exceptionMethodの指定がないと、得られる出力はログ記録のエラーのみになります)。 ActionProcessingFaultExceptionがプロセスメソッドから送出されると次のセクションで定義されるルールに従ってエラーメッセージが返されます。エラーメッセージの内容は例外のgetFaultMessageから返されるもの、またはオリジナルの例外内の情報を含むデフォルトのFaultのいずれかになります。
action クラスは追加でランタイムの設定が必要な場合があります (例: 上記の XML 内の notifier クラスは <NotificationList> 子エレメントを必要とする)。各 <action> エレメントは上述の属性を利用してこれ以外の属性やオプションの子エレメントをすべて無視します。しかし、これらは必要となる ConfigTree 引数内の action クラスコンストラクターに渡されます。各アクションクラスはその該当する <action> エレメントでインスタンス作成されるので、「兄弟となる」 action エレメントを表示しません (表示してはいけない)。
注記
NotificationList エレメントを囲むために使用されるプロパティの名前は検証されません。
4.1.4. 注釈付きのアクションクラス
action 実装をより簡単に作成するアクションアノテーションがあります。これにより、インターフェース、抽象クラスの実装や ConfigTree タイプの処理に関する複雑性が表面化しなくなります (jboss-esb.xml ファイル内の設定情報)。
- @Process
- @ConfigProperty
- @Initialize
- @Destroy
- @BodyParam
- @PropertyParam
- @AttachmentParam
- @OnSuccess
- @OnException
4.1.4.1. @Process
public class MyLogAction {
@Process
public void log(Message message) {
// log the message...
}
}
action としてクラスを特定します。クラス内に複数のメソッドがある場合、メッセージインスタンスを処理するのに使用するメソッドを特定します (または、メッセージの一部。これについては、@BodyParam、@PropertyParam and @AttachmentParam アノテーションの説明時に詳しくみていきます)。
action インスタンスを pipeline に設定するには、ロー/ベースレベルの action 実装と同じプロセスを使用します (AbstractActionPipelineProcessor を継承する、または ActionLifecycle を実装するもの、あるいはその他のサブタイプや抽象実装):
<service .....> <actions> <action name="logger" class="com.acme.actions.MyLogAction" /> </actions> </service>
action 実装が関連付けられている場合、process 属性を使用して、メッセージインスタンスの処理に使用するものはどれか指定します。
<service .....>
<actions>
<action name="logger" class="com.acme.actions.MyLogAction"
process="log" />
</actions>
</service>
4.1.4.2. @Process メソッドの戻り値
- void: これは、上記の Logger アクション実装にあるように、戻り値がないという意味です。
- message: これは ESB メッセージインスタンスです。
action pipeline上でアクティブな/現在のインスタンスになります。 - その他のタイプ。メソッドが ESB メッセージインスタンスを返さない場合、返されたオブジェクトインスタンスは、
action pipelineにある現在の ESB メッセージインスタンスに設定されます。メッセージがどこに設定されるかは、set-payload-location <action> 設定プロパティにより変わります。これは、通常のMessagePayloadProxyルールに従いデフォルト設定します。
4.1.4.3. @Process メソッドパラメーター
- メソッドパラメーターとして ESB メッセージインスタンスを指定
- 任意のパラメータータイプを 1 つ以上指定。Enterprise Service Bus フレームワークは、アクティブ/現在のパイプラインメッセージインスタンス内でそのタイプのデータを検索します。まず、メッセージボディ、次にプロパティ、最後に添付を検索し、そのパラメーターの値としてこのデータを渡します (該当するものが見つからない場合は
null)。
public class OrderPersister {
@Process
public OrderAck storeOrder(OrderHeader orderHeader,
OrderItems orderItems) {
// process the order parameters and return an ack...
}
}
OrderHeader や OrderItem オブジェクトインスタンスの作成や、現在のメッセージへの添付について pipeline の 1 つ前のアクションに左右されます (より現実的な実装では、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...
}
}
<actions>
<action name="decode" class="com.acme.orders.OrderDecoder" />
<action name="persist" class="com.acme.orders.OrderPersister" />
</actions>
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...
}
}
MessageDeliverException がスローされます。
4.1.4.4. @ConfigProperty
<action name="logger" class="com.acme.actions.MyLogAction">
<property name="logFile" value="logs/my-log.log" />
<property name="logLevel" value="DEBUG" />
</action>
AbstractActionPipelineProcessor の継承または、ActionLifecycle の実装)。これは、ConfigTree クラスと連携します (コンストラクター経由でアクションに提供します) 。アクションを実装するには、以下の手順に従います。
ConfigTreeインスタンスを提供するアクションクラスへコンストラクターを定義します。ConfigTreeインスタンスから該当のアクション設定プロパティをすべて取得します。- 必須のアクションプロパティを確認して、<action> 設定に指定されていない場所で例外をあげます。
- プロパティの全値を文字列 (
ConfigTreeで提供) から、アクション実装で使用される適切なタイプにデコーディングします。例えば、java.lang.Stringからjava.io.Fileに、java.lang.Stringから Boolean に、java.lang.Stringから long などにデコーディングします。 - 設定値が対象のプロパティタイプにデコーディングできない場所では、例外が出されます。
- 考えられる各種設定すべてに単体テストを実装して、さきほど表示したタスクが正しく完了するようにします。
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...
}
}
注記
ConfigTree クラスを処理したり、余分のコードを開発したりする必要がありません。
- フィールドの @ConfigProperty アノテーションで
use = Use.OPTIONALを指定 - フィールドの @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...
}
}
- name: これを使用して、アクションインスタンスで指定の名前のフィールドを生成する際に使用するアクション設定プロパティ名を明示的に指定します。
- choice: このフィールドを使用して、許容の設定値を制限します。これは、列挙型を使用することで可能です (LogLevel)
<action ...> <property name="log-file" value="logs/my-log.log" /> <property name="log-level" value="DEBUG" /> </action>
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...
}
}
4.1.4.5. プロパティの値のデコード
- プロパティタイプに単一引数の文字列コンストラクターがある場合、これを使用します。
- Primitive な場合、オブジェクトタイプの単一引数文字列コンストラクターを使用します。例えば、int の場合、整数のオブジェクトを使用します。
- 列挙型の場合
Enum.valueOfを使用して設定の文字列を列挙型の値に変換します。
4.1.4.6. @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...
}
}
注記
注記
注記
注記
ConfigTree パラメーターをオプションで指定可能です。これを行うと ConfigTree インスタンスを基本とするアクションにアクセスできるようになります。
4.1.4.7. @OnSuccess と @OnException
pipeline の中で、実行が成功した際、または失敗した際にこれらのメソッドを実行すべきか指定するため、これらのアノテーションを使用します。
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...
}
}
4.1.5. アクションとメッセージ
注記
重要
重要
org.jboss.soa.esb.actions.post のボディの場所に追加することもできます。つまり、チェーン内に N 個のアクションがある場合、N 番目のアクションは、通常検索する箇所でオリジナルデータを検索します。また、N-1 番目のアクションがデータを変更した場合、N は他の指定の場所で検索を行います。アクションチェーンをスムーズじ実行するには、N 番目のアクションが org.jboss.soa.esb.actions.pre をチェックして、N-2 番目のアクションがデータを変更していないか確認します。
警告
4.1.6. レスポンスの処理
action pipeline レスポンスの処理を目的とする2種類の処理メカニズムに対応しています。このメカニズムは、明示的および暗黙的処理メカニズムとよばれ、後者はアクションのレスポンスをベースとしています。
pipeline内のアクションが null メッセージを返す場合、レスポンスは送信されません。pipeline内の最後のアクションがエラー以外の応答を返した場合、要求メッセージの ReplyTo EPR に返信が送信されます。これが設定されていない場合は、要求メッセージの From EPR に送信されます。応答をルーティングできない事態が発生すると、エラーメッセージがシステムによりログ記録されます。
pipelineがOneWayで指定されている場合、レスポンスは送信されません。pipelineがRequestResponseで指定されている場合、要求メッセージの ReplyTo EPR に返信が送信されます。これが設定されていない場合は、要求メッセージの From EPR に送信されます。EPR に指定がない場合、システムによるエラーメッセージはログ記録されません。
重要
jboss-esb.xml ファイル内の actions エレメントに追加するだけでこれを行えます。この属性の値は OneWay または RequestResponse のいずれかにします。
4.1.7. アクション処理中のエラーの扱い方
pipeline から例外として送出され、これによりパイプラインの処理を終了させるはずです。前述のように、失敗メッセージが ActionProcessingFaultException として返されます。送信者 (または仲介者) に返されるエラー情報が重要である場合、FaultTo EPR を設定してください。これを設定しないと JBoss Enterprise Service Bus は ReplyTo EPR に基づいてエラーメッセージの配信を試行し、ReplyTo EPR も設定されていない場合は From EPR に配信を試行します。いずれの EPR も設定されていない場合、エラー情報はローカルにロギングされます。
- urn:action/error/actionprocessingerror
- これは、
chain内のアクションがActionProcessingFaultExceptionを送出したが返す失敗メッセージを含んでいなかったという意味になります。例外の詳細はFaultのreasonString 内に含まれます。 - urn:action/error/unexpectederror
- つまり、処理中に予期しない例外が出現していることになります。例外に関する詳細は
FaultのreasonString 内にあります。 - urn:action/error/disabled
- アクション処理が無効になります。
Action チェーン内で例外が送出される場合、FaultMessageException 内のクライアントに伝播して戻されます。これは Courier か ServiceInvoker のクラスから再度送出されます。Fault メッセージが受信されるときにも必ず送出されるこの例外は、Fault のコードおよび理由の他に伝播された例外を含みます。
4.2. メタデータとフィルター
filter mechanism を使って Enterprise Service Bus でサポートされます。
org.jboss.soa.esb.filter.InputOutputFilter クラスは 2 種類のメソッドを持ちます。
- public Message
onOutput(Messagemsg, Map<String, Object>params) はCourierExceptionをスローします。これははトランスポートへのメッセージの流れとして呼び出されます。実装はメッセージを修正して新しいバージョンを返すことができます。追加情報は追加のパラメーターの形式で呼び出し側により提供することが可能です。 - public Message
onInput(Messagemsg, Map<String, Object>params) は、CourierExceptionをスローします。これは、トランスポートからのメッセージの流れとして呼び出されます。実装はメッセージを修正して新しいバージョンを返すことができます。追加情報は追加のパラメーターの形式で呼び出し側により提供することが可能です。
jbossesb-properties.xml ファイルの filters セクションで定義します (jbossesb.sar アーカイブにあり)。これには、org.jboss.soa.esb.filter.<number> プロパティを使います。<number> の部分は何の値でも構いません。複数のフィルターを呼び出す順序を示すのに使用します (低い値から高い値)。
注記
jbossesb-properties.xml への変更を置く必要があります。こうすることで、すべてのインスタンスが同じメタデータを処理できるようにします。
org.jboss.internal.soa.esb.message.filter.MetaDataFilterorg.jboss.internal.soa.message.filter.GatewayFilterorg.jboss.internal.soa.esb.message.filter.EntryExitTimeFilter
ゲートウェイ関連のメッセージプロパティ
org.jboss.soa.esb.message.transport.type- ファイル、FTP、JMS、SQL、Hibernate
org.jboss.soa.esb.message.source- これは、メッセージが読み込まれたファイルの名前
org.jboss.soa.esb.message.time.dob- メッセージが ESB に入った時間 (送信された時間またはゲートウェイに到着した時間)
org.jboss.soa.esb.mesage.time.dod- メッセージが ESB から出た時間 (受信した時間)
org.jboss.soa.esb.gatway.original.queue.name- メッセージが JMS ゲートウェイノード経由で受信された場合、このエレメントは受信された元のキューの名前を含む
org.jboss.soa.esb.gateway.original.url- メッセージが SQL ゲートウェイノード経由で受信された場合、このエレメントはオリジナルのデータベース URL を含む
注記
GatewayFilter のデプロイは安全ですが、gateway node にデプロイされる場合は、メッセージへの情報追加しか行いません。
ゲートウェイ生成のメッセージパラメーター
org.jboss.soa.esb.gateway.file- メッセージ提供元のファイル。このゲートウェイがファイルベースである場合にのみ表される。
org.jboss.soa.esb.gateway.config- ゲートウェイインスタンスの初期化に使用された
ConfigTree。
注記
GatewayFilter をサポートします。
4.3. サービスとは
- カスタマイズのサービスを開発する場合、最初にコンシューマー側に公開する概念的なインターフェース (や規定) を決定する必要があります。この規定は Message の観点から定義されなければなりません (つまり、ペイロードをどのようにするか、どのタイプの応答 Message が生成されるかなどです)。
- 定義が完了したら、規定情報を
registry内で公開しなければなりません (現在、JBossESB には自動的にこれを行う手段はありません)。 - これでクライアントは公開された規定に従ってサービスを使用することができるようになります。サービスが Message をどのように処理し必要な作業を行うかについては実装での選択になります。単一の Action 内でも複数の Action 内でも可能です。管理性と再利用性のどちらをとるかなど、多少の代償はつきものです。
注記
4.3.1. ServiceInvoker
ServiceInvoker が採用されました。ServiceInvoker は多くの低レベル詳細を表示させずステートレスサービスのフェールオーバーメカニズムと不透明に動作します。このように、Red Hat ではは ESB サービスのクライアント側インターフェースとして、ServiceInvoker の使用を推奨します。
public class ServiceInvoker
{
public ServiceInvoker(Service service) throws MessageDeliverException;
public ServiceInvoker(String serviceCategory, String serviceName) throws MessageDeliverException;
public ServiceInvoker(Service service, List<PortReference.Extension> extensions);
public Message deliverSync(Message message, long timeoutMillis) throws MessageDeliverException, RegistryException, FaultMessageException;
public void deliverAsync(Message message) throws MessageDeliverException;
public Service getService();
public String getServiceCategory();
}
ServiceInvoker のインスタンスはクライアントが対話を必要とするそれぞれのサービスに対して作成することができます。作成すると、そのインスタンスはプライマリの EPR またフェールオーバーの際には代替となる EPR を確定するため必要に応じて registry にコンタクトします。
deliverSync) にまたは非同期的 (deliverAsync) にメッセージを送信する方法を確定できるようになります。同期的な方法の場合、タイムアウトを指定する必要があり、これはクライアントが応答を待機する時間になります。この期間内に応答が受信されないと ResponseTimeoutException が送出されます。
registry へコンタクトがとれない、またはサービスのルックアップに成功した場合、RegistryException が、deliverSync から送出されます。タイムアウトの値は以下の 3 つのいずれかをさします。
- サービスの問題
- 単にオーバーロードして時間内に応答できない
- 許容のタイムアウト時間よりもリクエストした作業に時間がかかっている
注記
注記
FaultMessageException が送出されます。
To、ReplyTo、FaultToなどの値をMessage ヘッダー内に指定することが可能です。ServiceInvoker を使用する場合、構成される際に registry に既にコンタクトを行っているため To フィールドは不要になります。実際、ServiceInvoker を通じて Message を送信する場合、To フィールドは同期的配信モードでも非同期的配信モードでも無視されます。
注記
registry により返されたエンドポイント参照により、アクティブなサービスへの解決が失敗します。
注記
registry にある場合ServiceInvoker が個別サービスインスタンスの問題を不透明にするのですが、高度なトピックでは、その方法についても説明しています。しかし、問題発生直後にアプリケーションに通知するための自動フェールオーバーを避けたい場合もあります。この方法は、 property にて org.jboss.soa.esb.exceptionOnDeliverFailure プロパティを true に設定することでグローバルレベルの設定を行います。あるいは、メッセージ別にこれを設定します。固有のメッセージで同プロパティを true に設定することも可能です (いずれの場合もデフォルト値は false です)。
4.3.2. トランザクション
4.3.3. サービスと ServiceInvoker
ServiceInvoker とは純粋にクライアントの領域になりませんのでご注意ください。サービス内、 特に Action 内での使用が可能です。たとえば、ビルトインの content-based router を使用せずに、特定のビジネスロジックの評価に基づき異なるサービスに着信メッセージを再ルーティングさせるため Action を使用したい場合、あるいは Action によって後日の管理目的で Dead Letter Queue に障害メッセージの特定タイプをルーティングするよう決定させることもできます。
ServiceInvoker を使用すると、(「高度なトピック」の章で説明されているように) サービスにとって不透明なフェールオーバーのメカニズムという利点が得られます。つまり、複雑な開発作業をすることなく、より堅固な方法で他のサービスや障害などへの一方向要求のルーティングが可能になるということになります。
4.3.4. InVM トランスポート
ServiceInvoker のインスタンスは、ネットワークやメッセージシリアライズ化のオーバーヘッドなしに同じ JVM 内からサービスを起動できます。
注記
<service category="ServiceCat" name="ServiceName" description="Test Service">
<actions mep="RequestResponse">
<action name="action" class="org.jboss.soa.esb.listeners.SetPayloadAction">
<property name="payload" value="Tom Fennelly" />
</action>
</actions>
</service>
<service category="ServiceCat" name="ServiceName" description="Test Service">
<actions mep="RequestResponse">
<action name="action" class="org.jboss.soa.esb.listeners.SetPayloadAction">
<property name="payload" value="Tom Fennelly" />
</action>
</actions>
</service>
4.3.5. InVM のスコープ
NONE: Service は InVM トランスポートで起動できません。デフォルト値。GLOBAL: Service は同じ Classloader スコープ内から InVM トランスポートで起動可能です。
注記
LOCAL スコープが追加され、デプロイされた同じ .esb アーカイブ内での起動が制限されます。
invmScope 属性を使用することで、各サービスの個別 InVM スコープを指定します (サービス設定の <service> 要素)。
<service category="ServiceCat" name="ServiceName" invmScope="GLOBAL"
description="Test Service">
<actions mep="RequestResponse">
<action name="action"
class="org.jboss.soa.esb.listeners.SetPayloadAction">
<property name="payload" value="Tom Fennelly" />
</action>
</actions>
</service>jbossesb-properties.xml ファイルで core:jboss.esb.invm.scope.default プロパティを使用して指定されます。指定されている設定値は NONE ですが、このプロパティが未定義の場合、デフォルトのスコープは実際には GLOBAL になります。
4.3.6. 処理された InVM
InVM listener は、トランザクションスコープまたは非トランザクションスコープの中で実行可能です。トランザクション対応の他のトランスポートとして同じように実行します。明示的または暗黙的に設定を変更することでこの動作を制御します。
注記
InVM listener は暗黙的にトランザクションされます。現在、これらの追加トランスポートは JMS、Scheduled または SQL タイプとなります。
4.3.7. トランザクションセマンティック
警告
message queue は揮発性メモリにのみ保持されます。つまり、システム障害時またはシャットダウン時にこのトランスポートのメッセージキューは失われます。
重要
4.3.8. スレッド化
<service category="HelloWorld" name="Service2"
description="Service 2" invmScope="GLOBAL">
<property name="maxThreads" value="100" />
<listeners>...
<actions>...
4.3.9. ロックステップ配信
InVM transport は低いオーバーヘッドでメモリ内メッセージキューにメッセージを配信します。これは非常に高速であり、メッセージを消費するサービスに対して配信が行われるのが速すぎるとメッセージキューが溢れてしまうことがあります。これらの状況を緩和するために InVM トランスポートはロックステップ配信メカニズムを提供します。
注記
- inVMLockStep: LockStep 配信を有効にするかどうかを制御するブール値
- inVMLockStepTimeout: メッセージ取得の待機時にメッセージ配信をブロックする最大時間 (ミリ秒単位)
<service category="ServiceCat" name="Service2"
description="Test Service">
<property name="inVMLockStep" value="true" />
<property name="inVMLockStepTimeout" value="4000" />
<actions mep="RequestResponse">
<action name="action" class="org.jboss.soa.esb.mock.MockAction" />
</actions>
</service>
注記
InVM transport を使用する場合、ロックステップ配信は無効になります。内包のトランザクションをコミットする際に、メッセージが偶発的にキューに挿入されるためです。このコミットメントは、ロックステップの待機時間の前後であれば発生する可能性があります。
4.3.10. 負荷分散
ServiceInvoker を使用する場合は、InVM トランスポート (利用可能な場合) よりもサービスを起動することが常に優先されます。他の負荷分散のストラテジは、ターゲットサービスに対して InVM エンドポイントが存在しない場合のみ適用されます。
4.3.11. 「値で渡す」と「参照で渡す」
InVM transport は参照としてメッセージを渡します。場合によっては、データの整合性に問題が出てくる場合があります。また、クラスキャストの問題、つまり、ClassLoader 境界を越えてメッセージが交換されてしまう場合もあります。
true に設定することで、メッセージが値別に渡されるように設定します。
<service category="ServiceCat" name="Service2" description="Test Service">
<property name="inVMPassByValue" value="true" />
<actions mep="RequestResponse">
<action name="action" class="org.jboss.soa.esb.mock.MockAction" />
</actions>
</service>
4.4. サービス規定定義
表4.1 サービス規定属性
| 名前 | 説明 | タイプ |
|---|---|---|
| inXsd | 要求メッセージのスキーマを含むリソース (単一エレメントを表す) | xsd:string |
| outXsd | 応答メッセージのスキーマを含むリソース (単一エレメントを表す) | xsd:string |
| faultXsd | スキーマのコンマで区切られた一覧 (それぞれが 1 つまたは複数のエラーエレメントを表す) | xsd:string |
| requestLocation | ボディ内の要求コンテンツの場所 (デフォルトの場所でない場合) | xsd:string |
4.5. メッセージ検証
true の値で指定することによって有効にできます。
注記
4.6. ESB サービスを Web サービスエンドポイント経由で公開
表4.2 Web サービス属性
| 名前 | 説明 |
|---|---|
| false | Web サービスエンドポイントは公開されない |
| true | Web サービスエンドポイントは公開される (デフォルト) |
WS-Addressing をサポートしません。この機能を有効にするには、addressing 属性を設定します。
表4.3 WS-Addressing の値
| 値 | 説明 |
|---|---|
| false | WS-Addressing はサポートされていません (デフォルト) |
| true | WS-Addressing サポートが必要です。 |
表4.4 WS-Addressing プロパティ
| プロパティ | 説明 |
|---|---|
org.jboss.soa.esb.gateway.ebws.messageID | WS-Addressing のメッセージ識別子 |
org.jboss.soa.esb.gateway.ebws.relatesTo | WS-Addressing Relates To URIs を含む文字列配列 |
org.jboss.soa.esb.gateway.ebws.relationshipType | Relates To URIs に該当する WS-Addressing Relationship タイプを含む文字列配列 |
<service category="ServiceCat" name="ServiceName" description="Test Service">
<actions mep="RequestResponse" inXsd="/request.xsd" outXsd="/response.xsd"
webservice="false" validate="true">
<!-- .... >
</actions>
</service>
<service category="ServiceCat" name="ServiceName" description="Test Service">
<actions mep="RequestResponse" inXsd="/request.xsd" outXsd="/response.xsd"
validate="true" requestLocation="REQUEST" responseLocation="RESPONSE">
<!-- .... -->
</actions>
</service>
第5章 その他のコンポーネント
5.1. メッセージストア
注記
5.2. データ変換
注記
5.3. コンテンツベースルーティング
- 元の送信先が利用できない
- サービスが移動された
- アプリケーションがコンテンツベース、時間、その他の属性でメッセージの送信先を管理する必要がある
5.4. レジストリ
registry はそのサービスに関する情報を格納するための集約点をアプリケーションやビジネスに提供します。そのクライアントに対して標準市場と同レベルの情報や同じ範囲におけるサービスの提供が求められます。理想的には registry は自動ディスカバリや e-commerce トランザクションの実行を容易にし、ビジネストランザクションの動的環境を実現する必要もあります。したがって、registry は単に「e-business ディレクトリ」というだけではなく、SOA インフラストラクチャの固有となるコンポーネントになります。
registry は JBoss Enterprise Service Bus の心臓部となります。サービスはエンドポイント参照 (EPR) を自身で公開し、また使用されなくなるとエンドポイント参照を削除します。コンシューマーは registry を調べて現在のタスクに適したサービスの EPR を確定することができます。
第6章 サンプル
6.1. メッセージの使用方法
- reserveSeat
- これはフライト番号と座席番号をとり、成功または失敗の表示を返します。
- querySeat
- これはフライト番号と座席番号をとり、その座席が現在予約されているかどうかの表示を返します。
- upgradeSeat
- これはフライト番号と 2 つの座席番号をとります (現在予約されている座席と移動先の座席)。
注記
6.1.1. メッセージの構造
org.example.flight.opcode と呼ばれる場所にて opcode (オペレーションコード) が文字列 (reserve、query、upgrade) としてボディ内に表示されることを開発者が決定します。その他の文字列値 (または値の指定がない場合) は不正なメッセージとしてみなされます。
重要
- 座席番号には
org.example.flight.seatnumberを使用します (整数)。 - フライト番号には
org.example.flight.flightnumberを使用します (文字列)。 - アップグレードする座席番号には
org.example.flight.upgradenumberを使用します (整数)。
表6.1 オペレーションのパラメータ
| オペレーション | opcode | seatnumber | flightnumber | upgradenumber |
|---|---|---|---|---|
| reserveSeat | String: reserve | 整数 | 文字列 | N/A |
| querySeat | String: query | 整数 | 文字列 | N/A |
| upgradeSeat | String: upgrade | 整数 | 文字列 | 整数 |
6.1.2. サービス
class AirlineReservationSystem
{
public void reserveSeat (...);
public void querySeat (...);
public void upgradeSeat (...);
}
注記
public Message process (Message message) throws Exception
{
String opcode = message.getBody().get(“org.example.flight.opcode”);
if (opcode.equals(“reserve”))
reserveSeat(message);
else if (opcode.equals(“query”))
querySeat(message);
else if (opcode.equals(“upgrade”))
upgradeSeat(message);
else
throw new InvalidOpcode();
return null;
}
注記
6.1.3. ペイロードのデコーディング
public void reserveSeat (Message message) throws Exception
{
int seatNumber = message.getBody().get(“org.example.flight.seatnumber”);
String flight =
message.getBody().get(“org.example.flight.flightnumber”);
boolean success =
airlineReservationSystem.reserveSeat(seatNumber, flight);
// now create a response Message
Message responseMessage = ...
responseMessage.getHeader().getCall().setTo(
message.getHeader().getCall().getReplyTo()
);
responseMessage.getHeader().getCall().setRelatesTo(
message.getHeader().getCall().getMessageID()
);
// now deliver the response Message
}
reserveSeat のケースでは、クライアントにより応答が予期されます。この応答メッセージは、ビジネスロジックにより返される情報や、元の受信したメッセージより取得した配信情報を使って構成されます。この例の場合、受信メッセージの ReplyTo フィールドより取得する To アドレスが応答に必要となります。また、応答を元の要求に関連させる必要がありますが、これは応答の RelatesTo フィールドと要求の MessageID を使用して関連させます。
6.1.4. クライアント
ServiceInvoker flightService = new ServiceInvoker(...);
Message request = // create new Message of desired type
request.getBody().add(“org.example.flight.seatnumber”, 1);
request.getBody().add(“ org.example.flight.flightnumber”, “BA1234”);
request.getHeader().getCall().setMessageID(1234);
request.getHeader().getCall().setReplyTo(myEPR);
Message response = null;
do
{
response = flightService.deliverSync(request, 1000);
if (response.getHeader().getCall().getRelatesTo() == 1234)
{
// it's out response!
break;
}
else
response = null; // and keep looping
} while maximumRetriesNotExceeded;
注記
6.1.5. リモートサービス呼び出しの設定
ServiceInvoker を使用できることがわかります。別途設定は必要ありません。しかし、リモートの Java 仮想マシンから使用するには (スタンドアローンの Java アプリケーション、サーブレット、Enterprise Java Bean などの場合)、まず以下の JAR ファイルが利用できる状態であるかを確認する必要があります。
jbossesb-rosetta.jar | trove.jar |
jbossesb-config-model-[version].jar | juddi-client-[version].aop.jar |
jbossts-common.jar | juddi-core-[version].aop.jar |
log4j.jar | commons-configuration-[version].jar |
stax-ex.jar | commons-lang-[version].jar |
stax-api-[version].jar | jboss-messaging-client.jar |
jbossall-client.jar | jboss-remoting.jar |
scout-[version].aop.jar | commons-codec-[version].jar |
xbean-[version].jar | wstx.jar |
commons-logging.jar | xercesImpl.jar |
javassist.jar |
注記
$SOA_HOME/jboss-as/client/, $SOA_HOME/jboss-as/common/lib/ と $SOA_HOME/jboss-as/server/$SOA_CONF/deployers/esb.deployer/lib/ にあります。
quickstarts ディレクトリにあります)。
jbossesb-properties.xmlMETA-INF/uddi.xml
6.1.6. サンプルクライアント
helloworld quick-start がデプロイされており、Enterprise Service Bus サーバーが実行中であることを確認します)。
package org.jboss.esb.client;
import org.jboss.soa.esb.client.ServiceInvoker;
import org.jboss.soa.esb.listeners.message.MessageDeliverException;
import org.jboss.soa.esb.message.Message;
import org.jboss.soa.esb.message.format.MessageFactory;
public class EsbClient
{
public static void main(String[] args)
{
System.setProperty("javax.xml.registry.ConnectionFactoryClass",
"org.apache.ws.scout.registry.ConnectionFactoryImpl");
try
{
Message message = MessageFactory.getInstance().getMessage();
message.getBody().add("Sample payload");
ServiceInvoker invoker = new ServiceInvoker("FirstServiceESB", "SimpleListener");
invoker.deliverAsync(message);
}
catch (final MessageDeliverException e)
{
e.printStackTrace();
}
}
}
6.1.7. コツとヒント
- アクションを開発する際、アクション固有のペイロード情報は必ずメッセージボディ内の独自の場所で維持するようにしてください。
- メッセージ内でバックエンドサービス実装の詳細を公開しないようにしてください。公開してしまうと、クライアントに影響を与えずに実装を変更することが難しくなります。実装にとらわれないメッセージ定義 (内容や形式など) は、疎結合を維持できるようにします。
- ステートレスサービスの場合は、フェールオーバーを不透明に処理するため
ServiceInvokerを使用します。 - 要求/応答のアプリケーションを構築する場合は、メッセージヘッダー内で相互関係の情報 (MessageID と RelatesTo) を使用します。
- メインのサービス opcode に Header Action フィールドを使用するよう考慮してください。
- 応答用の配信アドレスのない非同期の対話を使用する場合、後で監視できるようすべてのエラーを
message storeに送信することを考慮してみてください。 - JBoss Enterprise Service Bus がサービス規定の定義や公開に対してより自動的なサポートを提供できるようになるまで、開発者とユーザーが使用できる定義のレポジトリを個別に維持するようにしてください。
第7章 高度なトピック
7.1. フェールオーバーと負荷分散のサポート
registry 内にエンドポイント参照 (EPR) を作成します。
7.1.1. サービス、エンドポイント参照 (EPR)、リスナー、アクション
jboss-esb.xml ファイル内では、各サービス要素は 1 つ以上のリスナーやアクションで構成されています。以下の設定 (一部) は、JBossESBHelloworld の例では、ある程度これをベースとしています。サービスが初期化されると、カテゴリ、名前、説明を UDDI registry に登録します。そして、各リスナー要素に対して ServiceBinding を UDDI に登録します。エンドポイント参照にこれらを保存します。
...
<service category="FirstServiceESB" name="SimpleListener" description="Hello World">
<listeners>
<jms-listener name="helloWorld" busidref="quickstartEsbChannel" maxThreads="1"/>
</listeners>
<actions>
<action name="action1" class="org.jboss.soa.esb.actions.SystemPrintln"/>
</actions>
</service>
...
Hello World registry を検索して、メッセージを送信できます。JMSEPR を受け取り、それを使ってメッセージを送信できます。こうした負荷の大きい作業はすべて ServiceInvoker クラスで行われます。HelloWorld サービスが quickstartEsbChannel 経由でメッセージを受け取ると、pipeline の最初のアクションである SystemPrintln に所属するプロセスメソッドに渡します。
7.1.2. 複製されたサービス
Node1 で実行しています。helloworld.esb ファイルを取り、 Node2 にもデプロイした (下例を参照) 場合、Node2 側で FirstServiceESB - SimpleListener サービスがすでに登録されていることがわかります。そのため、2 つ目の ServiceBinding をこのサービスに追加して、複製します。Node1 が失敗すると、Node2 が継続して機能します。

図7.1 異なるノードにある 2 つのサービスインスタンス
ServiceInvoker はアプリケーションサービスが実際には 4 つのサービスから構成されているという事実をクライアントには見えないようにしています。これにより個別サービスの障害が隠され、複製されるサービスグループの少なくとも 1 インスタンスが利用できる状態にある限りクライアントは先に進むことができます。
重要

true に設定します。このプロパティを設定すると、メッセージを再送信する代わりに ServiceInvoker によって MessageDeliverException がスローされます。すべてのメッセージにこれを指定するには、 JBoss Enterprise Service Bus property ファイルの Core セクションでこのプロパティを設定します。
7.1.3. プロトコルのクラスタリング
JBossMessaging もこうしたプロバイダーのひとつで、Enterprise Service Bus の JMS プロバイダーとしてこれを使用するのもその理由です。JMS をクラスター化することでアーキテクチャーから単一障害性を排除します。次の図を参照してください。

図7.2 JMS を使用したプロトコルクラスタリングの例

注記
FileSystem プロトコルの NAS (Network Attached Storage) がありますが、ご使用のプロバイダーが単純にクラスタリングをまったく提供できない場合はどうでしょう。このような場合には、サービスに複数のリスナーを追加し、複数の (JMS) プロバイダーを使用することができます。ただし、これにはフェールオーバーと負荷分散機能がプロバイダー全体に必要となります。それでは、これについて次のセクションで見ていくことにします。
7.1.4. クラスタリング
deploy/jbossesb.sar/jbossesb-properties.xml でセットアップできます。
<properties name="core"> <property name="org.jboss.soa.esb.registry.cache.life" value="60000"/> </properties>
7.1.5. チャンネルのフェールオーバーと負荷分散機能
HelloWorld サービスはプロトコル 1 つ以上のリッスンが可能です。以下では FTP チャンネルを追加しています。
...
<service category="FirstServiceESB" name="SimpleListener" description="Hello World">
<listeners>
<jms-listener name="helloWorld" busidref="quickstartEsbChannel" maxThreads="1"/>
<jms-listener name="helloWorld2" busidref="quickstartFtpChannel2" maxThreads="1"/>
</listeners>
...

図7.3 2 つの FTP サーバーをその混合に追加する
... <service category="FirstServiceESB" name="SimpleListener" description="Hello World"> <listeners> <jms-listener name="helloWorld" busidref="quickstartEsbChannel" maxThreads="1"/> <jms-listener name="helloWorld2" busidref="quickstartJmsChannel2" maxThreads="1"/> <ftp-listener name="helloWorld3" busidref="quickstartFtpChannel3" maxThreads="1"/> <ftp-listener name="helloWorld4" busidref="quickstartFtpChannel3" maxThreads="1"/> </listeners> ...
ServiceInvoker がサービスにメッセージを配信する場合、 8 個の EPR から選択することになります (Node1 から 4 EPR, Node2 から 4 EPR)。 どれを使用するのかどのように決定するのでしょう。 これについてはポリシーを設定することができます。jbossesb-properties.xml で「org.jboss.soa.esb.loadbalancer.policy」を設定することができます。ここでは 3 つのポリシーが提供されています。また、独自のポリシーを作成することも可能です。
- 1 番目に利用可能。問題のない ServiceBinding が見つかるとそれが終了しない限り使用され、一覧内の次の EPR に移動します。このポリシーは 2 つのサービスインスタンス間での負荷分散は提供しません。
- ラウンドロビン。一般的な負荷分散ポリシーで、各 EPR は一覧の順でヒットされます。
- ランダムロビン。他のロビンと似ていますがランダムになります。
org.jboss.soa.esb.registry.cache.life は jbossesb-properties ファイルで設定でき、デフォルトでは 60,000 ミリ秒に設定されます。その時点で動作している EPR がない場合はメッセージ再配信サービスを利用することができます。
7.1.6. メッセージ再配信
- メッセージを同期的に配信しようとしている場合、メッセージを DeadLetterService に送信します。デフォルトでは DLQ MessageStore に格納し、 呼び出し側にエラーを返送します。処理は停止します。たとえば、JMS キューに送りたい、あるいは通知を受け取りたい場合などは、jbossesb.esb 内の DeadLetterService を設定することができます。
- メッセージを非同期的に送信しようとしている場合 (推奨)、この場合もメッセージを DeadLetterService に送信しますがそのメッセージは RDLVR MessageStore に格納されます。再配信サービス (jbossesb.esb) は再配信試行の最大数に達するまでメッセージ送信の再試行を行います。最大数に達すると、メッセージは DLQ MessageStore に格納され処理は停止します。

図7.4 メッセージ再配信
注記
DeadLetterService はデフォルトでは、オンとなっていますが、jbossesb-properties.xml で、org.jboss.soa.esb.dls.redeliver を "false" にするとオフにできます。メッセージベースでこれを管理するには、各メッセージのプロパティで org.jboss.soa.esb.dls.redeliver プロパティを設定してください。グローバル設定より優先して、Message プロパティが使用されます。デフォルトは、設定ファイルに設定された値を使用します。
7.2. サービスのスケジュール
- バスプロバイダー、JMS や HTTP などメッセージングプロトコルを介してアクション処理パイプラインにメッセージを供給します。このプロバイダータイプは基礎となるメッセージングプロバイダーにより起動されます。
- スケジュールプロバイダー、スケジュール駆動のモジュールに基づいてアクション処理パイプラインにメッセージを供給します。つまり、基礎となるメッセージ配信のメカニズム (ファイルシステムなど) はメッセージが処理可能になる場合に ESB 起動に対するサポートを提供せず、スケジューラーが定期的にリスナーを起動して新しいメッセージをチェックします。
org.jboss.soa.esb.listeners.ScheduledEventMessageComposer インターフェースの実装になります。
7.2.1. Simple Schedule
- scheduleid
- スケジュール用の固有の識別子文字列になります。 リスナーからスケジュールを参照するために使用されます。
- frequency
- すべてのスケジュールリスナーが起動されるべき頻度 (秒単位) になります。
- execCount
- スケジュールが実行されるべき回数になります。
- startDate
- スケジュールの開始日と時間です。 この属性値の形式は XML スキーマタイプの「dateTime」になります。dateTime を参照してください。
- endDate
- スケジュールの終了日と時間です。 この属性値の形式は XML スキーマタイプの「dateTime」になります。dateTime を参照してください。
<providers>
<schedule-provider name="schedule">
<simple-schedule scheduleid="1-sec-trigger" frequency="1" execCount="5" />
</schedule-provider>
</providers>
7.2.2. Cron Schedule
- scheduleid
- スケジュール用の一意識別子の文字列になります。リスナーからスケジュールを参照するために使用されます。
- cronExpression
- これは、Quartz Scheduler CronTrigger 式です。
- startDate
- スケジュールの開始日と時間です。この属性値の形式は XML スキーマタイプの「dateTime」になります。
- endDate
- スケジュールの終了日と時間です。この属性値の形式は XML スキーマタイプの「dateTime」になります。
<providers>
<schedule-provider name="schedule">
<cron-schedule scheduleid="cron-trigger" cronExpression="0/1 * * * * ?" />
</schedule-provider>
</providers>
7.2.3. Scheduled Listener
event-processor クラスで設定され、org.jboss.soa.esb.schedule.ScheduledEventListener または org.jboss.soa.esb.listeners.ScheduledEventMessageComposer のいずれかの実装になります。
- ScheduledEventListener
- このインターフェースを実装するイベントプロセッサーは単純に「onSchedule」メソッドで起動されます。 アクション処理パイプラインは実行されません。
- ScheduledEventMessageComposer
- このインターフェースを実装するイベントプロセッサーはリスナーに関連付けられるアクション処理パイプラインのメッセージを「composing」する機能があります。
- name: リスナーインスタンスの名前です。
- event-processor: 各スケジュール起動で呼び出されるイベントプロセッサークラスです。実装詳細については上記を参照してください。
- いずれかひとつ
- name: リスナーインスタンスの名前です。
- scheduleidref: このリスナーの起動に使用するスケジュールの scheduleid です。
- schedule-frequency: スケジュールの頻度 (秒単位) です。直接リスナーで簡単にスケジュールを指定する便利な方法になります。
7.2.4. 設定例
<?xml version = "1.0" encoding = "UTF-8"?>
<jbossesb xmlns="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.0.1.xsd">
<providers>
<schedule-provider name="schedule">
<cron-schedule scheduleid="cron-trigger" cronExpression="0/1 * * * * ?" />
</schedule-provider>
</providers>
<services>
<service category="ServiceCat" name="ServiceName" description="Test Service">
<listeners>
<scheduled-listener name="cron-schedule-listener" scheduleidref="cron-trigger"
event-processor="org.jboss.soa.esb.schedule.MockScheduledEventMessageComposer" />
</listeners>
<actions>
<action name="action" class="org.jboss.soa.esb.mock.MockAction" />
</actions>
</service>
</services>
</jbossesb>
7.2.5. カスタムのゲートウェイの作成
- AbstractThreadedManagedLifecycle/AbstractManagedLifecycle Listener: スレッド/非スレッドリスナーを作成するために、ベースリスナー API を使用するリスナー。管理ライフサイクルベースで実行
- Schedule Driven Listener: 設定したスケジュールを元にトリガーするために ScheduledEventListener を使用し、Service Action pipeline のメッセージを生成するリスナー
- Groovy Scripted Event Driven Listener: 外部プロセスでトリガーするイベントを元に起動して、Service Action Pipeline のメッセージを生成するリスナー (例:JMS キューで受信するメッセージ)
7.2.5.1. AbstractThreadedManagedLifecycle/AbstractManagedLifecycle リスナー
public class MyCustomGateway extends AbstractThreadedManagedLifecycle {
private ConfigTree listenerConfig;
private Service service;
private ServiceInvoker serviceInvoker;
public MyCustomGateway(final ConfigTree config) throws ConfigurationException {
super(config);
this.listenerConfig = config;
String serviceCategory = listenerConfig.getRequiredAttribute(ListenerTagNames.TARGET_SERVICE_CATEGORY_TAG);
String serviceName = listenerConfig.getRequiredAttribute(ListenerTagNames.TARGET_SERVICE_NAME_TAG);
service = new Service(serviceCategory, serviceName);
}
protected void doInitialise() throws ManagedLifecycleException {
// Create the ServiceInvoker instance for the target service....
try {
serviceInvoker = new ServiceInvoker(service);
} catch (MessageDeliverException e) {
throw new ManagedLifecycleException("Failed to create ServiceInvoker for Service '" + service + "'.");
}
}
protected void doRun() {
while(isRunning()) {
// Wait for a message....
Object payloadObject = waitForPayload();
// Send the message to the target service's Action Pipeline via
// the ServiceInvoker...
try {
Message esbMessage = MessageFactory.getInstance().getMessage();
esbMessage.getBody().add(payloadObject);
serviceInvoker.deliverAsync(esbMessage);
} catch (MessageDeliverException e) {
e.printStackTrace();
}
}
}
private Object waitForPayload() {
// Wait for a message...
}
}
<?xml version = "1.0" encoding = "UTF-8"?>
<jbossesb xmlns="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.0.1.xsd"
parameterReloadSecs="5">
<providers>
<bus-provider name="CustomProvider">
<property name="provider-property" value="buprovider-prop-value" />
<bus busid="custom-bus">
<property name="bus-property" value="bus-prop-value" />
</bus>
</bus-provider>
</providers>
<services>
<service category="Custom" name="Listener" description="" invmScope="GLOBAL">
<listeners>
<listener name="custom-listener" busidref="custom-bus" is-gateway="true">
<property name="gatewayClass" value="com.acme.listeners.MyCustomGateway" />
<property name="listener-property" value="listener-prop-value" />
</listener>
</listeners>
<actions mep="OneWay">
...
</actions>
</service>
</services>
</jbossesb>
7.2.5.2. スケジュール駆動型リスナー
- ScheduledEventListener: このインターフェースを実装するイベントプロセッサーは単純に「onSchedule」メソッドで起動されます。アクション処理パイプラインは実行されません。
- ScheduledEventMessageComposer: このインターフェースを実装するイベントプロセッサーはリスナーに関連付けられるアクション処理パイプラインのメッセージを「composing」する機能があります。
- name: リスナーインスタンスの名前です。
- event-processor: 各スケジュール起動で呼び出されるイベントプロセッサークラスです。実装詳細については上記を参照してください。
- いずれかひとつ
- scheduleidref: このリスナーの起動に使用するスケジュールの scheduleid です (プロバイダー内で設定)。
- schedule-frequency: スケジュールの頻度 (秒単位) です。直接リスナーで簡単にスケジュールを指定する便利な方法になります。
Public class OrderFileListener implements ScheduledEventMessageComposer {
public void initialize(ConfigTree config) throws ConfigurationException {
// TODO: Initialise File filters etc, using the config to access properties configured on the listener...
}
public Message composeMessage() throws SchedulingException {
Message message = MessageFactory.getInstance().getMessage();
// TODO: Read one or more order files and populate the data into the ESB message for pipeline processing...
return message;
}
public Message onProcessingComplete(Message message) throws SchedulingException {
// TODO: Post pipeline processing...
return message;
}
public void uninitialize() {
// TODO: Any relevant cleanup tasks...
}
}
<?xml version = "1.0" encoding = "UTF-8"?>
<jbossesb xmlns="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.0.1.xsd">
<providers>
<schedule-provider name="schedules">
<simple-schedule scheduleid="ordersPole" frequency="5" frequencyUnits="seconds" />
</schedule-provider>
</providers>
<services>
<service category="OrderManagement" name="OrderProcessing" description="Order Processing Service">
<listeners>
<scheduled-listener name="orderFileListener" scheduleidref="ordersPole" event-processor="com.acme.OrderFileListener"/>
</listeners>
<actions>
<action name="action1" class="..."/>
<action name="action2" class="..."/>
<action name="action3" class="..."/>
</actions>
</service>
</services>
</jbossesb>
7.2.5.3. Groovy スクリプトのイベント駆動型リスナー
- name: リスナーインスタンスの名前です。
- script: Groovy スクリプトへのパス (クラスパス上)。
- config: リスナーの設定 (ConfigTree)。ネスト化されたプロパティ要素の値。これは、アクションパイプラインの構築に必要です。
- gateway: 基盤の GroovyGateway リスナー (Java) への参照。これにより、リスナーのライフサイクルにアクセスできます。
public class OrderListener implements MessageListener {
public void onMessage(final Message message) {
if(message instanceof ObjectMessage) {
Order order = ((ObjectMessage) message).getObject();
// Create and populate an ESB message with the order....
Message esbMessage = MessageFactory.getInstance().getMessage();
esbMessage.getBody().add(order);
// TODO: Add code to forward the ESB message to the Action Pipeline...
}
}
}
public class OrderListener implements MessageListener {
private ActionProcessingPipeline pipeline;
public void start(ConfigTree config) throws ConfigurationException {
// Create and initialize the pipeline..
pipeline = new ActionProcessingPipeline(config);
pipeline.initialise();
// TODO: Add JMS code for connecting this JMS MessageListener to the JMS Queue...
}
public void onMessage(final Message message) {
if(message instanceof ObjectMessage) {
Order order = ((ObjectMessage) message).getObject();
// Create and populate an ESB message with the order....
Message esbMessage = MessageFactory.getInstance().getMessage();
esbMessage.getBody().add(order);
// Forward the ESB message to the Action Pipeline...
boolean success = pipeline.process(message);
if(!success) {
// TODO: Handle error....
}
}
}
public void stop() {
try {
// TODO: Add JMS code for disconnecting from JMS Queue....
} finally {
if(pipeline != null) {
pipeline.destroy() ;
}
}
}
}
注記
import com.acme.OrderListener;
OrderListener orderListener = new OrderListener();
// Start the listener (passing the config)...
orderListener.start(config);
// Wait until the Groovy Gateway is signaled to stop...
def stopped = false;
while(!stopped) {
stopped = gateway.waitUntilStopping(200);
}
// Now stop the listener...
orderListener.stop();
<?xml version = "1.0" encoding = "UTF-8"?>
<jbossesb xmlns="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.0.1.xsd">
<services>
<service category="OrderManagement" name="OrderProcessing" description="Order Processing Service">
<listeners>
<groovy-listener name="orderJmsListener" script="/com/acme/OrderListener.groovy">
<property name="queueName" value="..."/>
</groovy-listener>
</listeners>
<actions>
<action name="action1" class="..."/>
<action name="action2" class="..."/>
<action name="action3" class="..."/>
</actions>
</service>
</services>
</jbossesb>
第8章 耐障害性と信頼性
8.1. 障害の分類
- 脱落の不良/障害
- コンポーネントが別のコンポーネントからの入力に応答せず、予期される出力を生成しない場合、脱落の不良とそれに関連する脱落の障害が発生していることになります。メッセージを紛失することのある通信リンクなどが、脱落の不良が発生しているコンポーネントの例になります。
- 値の不良/障害
- 正しい時間間隔内にコンポーネントが応答しても、値が正しくないような不良を値の不良と呼びます (これに関連する障害は値の障害と呼ばれます)。破損したメッセージを時間通りに配信する通信リンクには値の不良が発生しています。
- タイミングの不良/障害
- タイミングの不良は、コンポーネントが正しい値で応答しても指定された間隔で応答しない (早すぎるか遅すぎる) 原因となります。この不良に関連する障害はタイミングの障害です。正しい値を生成するのに応答に過度の遅延があるオーバーロードしたプロセッサーにはタイミングの障害が発生しています。タイミングの障害は、計算を時間的に制約するシステム内でのみ発生します。
- 任意の不良/障害
- 前述の障害クラスは、その値または時間ドメインでコンポーネントがどのように失敗するかを指定するものでした。前述の障害クラスが適応されない方法でコンポーネントが両方のドメインで失敗する可能性もあります。このような出力を生成する障害コンポーネントは任意の障害 (ビザンチン障害) が発生していると言えます。

図8.1 不良分類の階層
8.1.1. JBossESB と不良モデル
注記
8.1.2. 障害検出機能と障害推測機能
8.2. 信頼性の保証
8.2.1. メッセージの損失
JMSEpr のオプション部分)、障害が存在していてもメッセージの受信や処理を保証することが可能です。サービスによる処理中に障害が発生した場合、メッセージが後で再処理されるよう JMS キューに戻されます。しかし、トランザクション処理されるセッションはトランザクション処理されないセッションより大幅に遅くなることがあるため、使用には注意が必要です。
注記
8.2.2. エンドポイントの障害を疑う
8.2.3. サポート対象となるクラッシュ障害モード
8.2.4. コンポーネント固有
8.2.4.1. ゲートウェイ
8.2.4.2. ServiceInvoker
8.2.4.3. JMS ブローカー
8.2.4.4. アクションパイプライン
8.3. 推奨
- ステートレスで羃等なサービスを開発するようにしてください。不可能な場合は、アプリケーションが再送信の試行を検出できるように、MessageID を使用してメッセージを特定するようにしてください。メッセージ送信の再試行を行う場合は、同じ MessageID を使用してください。冪等でなく、再送信された メッセージを受信すると同じ処理を再度行うようなサービスは、なるべくトランザクションを使用して MessageID に対してステート移行を記録するようにします。ステートレスサービスを基にするアプリケーションの方がスケーラビリティが高い傾向にあります。
- ステートフルなサービスを開発する場合はトランザクションと JMS 実装を使用してください (できればクラスター化する)。
- レジストリのクラスタ化を行い、 クラスタ化された耐障害性のあるバックエンドデータベースを使用して単一障害点がないようにします。
- メッセージストアが必ず高可用性のデータベースで支えられているようにします。
- 他のサービスやオペレーションと比較して、 より高い信頼性や耐障害性の機能を必要とするサービスおよびサービス上のオペレーションを明確に識別しておきます。 これによりこれらのサービスで JMS 以外のトランスポートを対象とすることができるようになり、 アプリケーション全体のパフォーマンスを向上させることができる場合があります。 JBossESB により別々の EPR を通じて同時にサービスが使用されるようにすることが可能なため、 こうした異なるサービスの特性 (QoS) をアプリケーション固有の必要条件に応じて異なるコンシューマー側に提供することも可能になります。
- ネットワークのパーティションはサービスが失敗しているかのように表示する可能性があるため、 クラッシュしたように誤って識別されることに対処できないサービスに対してはこの種の障害が起きる傾向にあるトランスポートの使用は避けてください。
- 場合によっては (HTTP など)、サーバーがメッセージを処理した後、応答する前にサーバーがクラッシュすると、別のサーバーが同じ処理を行う原因となります。これは、サービスが受信したメッセージを処理した後にマシンで障害が発生した場合と、サービスが受信したメッセージを処理する前に障害が発生した場合を区別できないからです。
- 非同期 (一方向) の配信パターンを使用するとサービスの障害検出が困難になります。これは、要求への応答が任意の時間に到達できる場合、一般的に損失メッセージや遅延メッセージの概念がないからです。応答が全くない場合は障害の検出がより難しくなるため、アプリケーションセマンティックに依存してメッセージの不達を判断しなければならない場合もあります (例:銀行口座の残高が予期した金額と異なる)。ServiceInvoker または Couriers を使用して非同期のメッセージを配信する場合、各操作 (deliverAsync など) から返答があってもメッセージがサービスによって動作したとは限りません。
- メッセージストアは再配信プロトコルによって使用されますが、前述の通り、このプロトコルはロバスト性の向上に最善のプロトコルであり、トランザクションや確実なメッセージ配信を使用しません。そのため、障害によってはメッセージが全て損失したり (クラッシュの前にメッセージがストアに書き込まれない)、メッセージが複数回配信される原因となることがあります (再配信のメカニズムがストアからメッセージを取り出して無事配信するが、クラッシュによってメッセージがストアから削除されず、クラッシュから回復した後にメッセージが再度配信される)。
- FTP など一部のトランスポートは、処理済みのメッセージを保持するよう設定することができますが、未処理のメッセージと区別するため独自にマークされます。通常、デフォルトでは処理されたメッセージは削除されますが、障害から回復した際に、アプリケーションが処理されたメッセージを判別できるよう、デフォルトを変更することもできます。
第9章 サービス設定の定義
9.1. 概要

図9.1 JBoss Enterprise Service Bus 設定モデル
- <providers>: モデルのこの部分は主としてモデルの <services> セクション内で定義されるメッセージの <listener> により使用されるすべてのメッセージ <bus> プロバイダーを定義します。
- <services>:モデルのこの部分は主に JBoss ESB の単一インスタンスの制御下にある全サービスを定義します。各 <service> インスタンスには "Gateway" または "Message Aware" のいずれかのリスナー定義が含まれます。
9.2. Providers

図9.2 プロバイダー構成モデル
<providers> 部分では、ESB の単一インスタンスに対するすべてのメッセージ <provider> インスタンスを定義します。現在サポートされている 2 つの種類のプロバイダーを以下に示します。
- これらは、「プッシュ」されたメッセージであるリスナーなどに対する「イベント駆動」プロバイダーのプロバイダー詳細を指定します。このプロバイダーの種類の例は
<jms-provider>です。 - Schedule Provider: メッセージを「プル」するリスナーなどのスケジュール駆動リスナーのプロバイダー設定
<jms-provider>など) には複数の <bus> 定義を含めることができます。<provider> は、その <property> で定義される全 <bus> で共通となるプロバイダー固有プロパティに関連する <property> インスタンスで修飾することもできます (JMS なら "connection-factory"、"jndi-context-factory" など)。同様に、各 <bus> インスタンスはその <bus> インスタンスに固有となる <property> インスタンスで修飾することができます (JMS なら "destination-type"、"destination-name" など)。
<providers>
<jms-provider name="JBossMQ" connection-factory="ConnectionFactory">
<jms-bus busid="Reconciliation">
<jms-message-filter
dest-type="QUEUE"
dest-name="queue/B"
/>
</jms-bus>
</jms-provider>
</providers>
<provider> と <bus> タイプを使用しています。これに問題はありませんが、実際の設定を作成するにはこれらのタイプの特殊化された拡張を使用することをお薦めします。JMS なら <jms-provider> と <jms-bus> です。 上記の設定でもっとも重要となる部分は <bus> インスタンスで定義される busid 属性です。 これは <bus> エレメント/タイプで必要とされる属性です (<jms-bus> などそのすべての特殊化を含む)。この属性は <listener> 構成内で使用され、リスナーがそのメッセージを受け取る <bus> インスタンスを参照します。これについては後ほど詳しく説明します。
9.3. サービス

図9.3 サービス構成モデル
<services> の部分は ESB のこのインスタンスの管理下にある各サービスを定義します。<service> 一連の構成として定義します。<service> は次の属性で修飾することもできます。
表9.1 サービス属性
| 名前 | 説明 | タイプ | 必須 |
|---|---|---|---|
| name | サービスレジストリ内で登録されるサービスのサービス名 | xsd:string | true |
| カテゴリ | サービスレジストリ内で登録されるサービスのサービスカテゴリ | xsd:string | true |
| 詳細 | 読みやすい形式のサービス詳細、 リジストリ内に格納される | xsd:string | true |
<service> は <listeners> のセットと <actions> のセットを定義することができます。構成モデルは「基本の」 <listener>タイプの他、 サポートされるメインのトランスポートそれぞれの特殊化も定義します。<jms-listener>、<sql-listener> など。
<listener> は次の属性を定義します。これらの属性定義はすべての <listener> 拡張によって継承されます。このように、InVM トランスポートなど JBossESB でサポートするリスナーやゲートウェイすべてに対し設定することができます。
表9.2 リスナーの属性
| 名前 | 説明 | タイプ | 必須 |
|---|---|---|---|
| name | リスナーの名前、 この属性は主にログの目的で必要となる | xsd:string | true |
| busrefid | リスナーインスタンスが受け取るメッセージの元となる <bus> の busid への参照 | xsd:string | true |
| maxThreads | リスナーがアクティブとして持てる同時メッセージ処理スレッドの最大数 | xsd:int | True |
| is-gateway | リスナーインスタンスが「ゲートウェイ」であるかないかは関係ありません。[a] | xsd:boolean | true |
[a]
メッセージバスは特定のメッセージチャンネル/トランスポートの詳細を定義します。
| |||
<property> エレメントのセットを定義できます (ちょうど <provider> と <bus> のエレメント/タイプのようなもの)。これらはリスナー固有のプロパティの定義に使用されます。
注記
<?xml version = "1.0" encoding = "UTF-8"?>
<jbossesb xmlns="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.0.1.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.0.1.xsd http://anonsvn.jboss.org/repos/labs/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.0.1.xsd"
parameterReloadSecs="5">
<providers>
<jms-provider name="JBossMQ" connection-factory="ConnectionFactory">
<jms-bus busid="Reconciliation">
<jms-message-filter
dest-type="QUEUE"
dest-name="queue/B"
/>
</jms-bus>
<!-- busid --> <jms-bus busid="ReconciliationEsb">
<jms-message-filter
dest-type="QUEUE"
dest-name="queue/C"
</jms-bus>
</jms-provider>
</providers>
<services>
<service category="Bank" name="Reconciliation"
description="Bank Reconciliation Service">
<listeners>
<!-- busidref --> <jms-listener name="Bank-Listener"
busidref="Reconciliation"
is-gateway="true"/>
<jms-listener name="Bank-Esb"
busidref="ReconciliationEsb"/>
</listeners>
<actions>
....
</actions>
</service>
</services>
</jbossesb>
<actions> の一覧がないと、サービスはほとんど何もしません。<actions> には一般的にサービスによって受け取られるメッセージのペイロードを処理するロジックが含まれています (そのリスナーを通じて)。 代わりに、外部のサービス/エンティティによって消費されるメッセージに対して変換またはルーティングのロジックを含めることもできます。
<action> エレメント/タイプは次の属性を定義します。
表9.3 アクションの属性
| 名前 | 説明 | タイプ | 必須 |
|---|---|---|---|
| name | アクションの名前、 この属性は主にログの目的で必要となる | xsd:string | true |
| クラス | org.jboss.soa.esb.actions.ActionProcessor 実装クラス名 | xsd:string | true |
| プロセス | メッセージ処理に反射的に呼び出される「process」メソッドの名前 (デフォルトは ActionProcessor クラスで定義されるように「process」メソッドとなる) | xsd:int | false |
<actions> セット内の <action> インスタンスの一覧では、アクションは <action> インスタンスが <actions> セットに表れる順序で呼び出されます (その「process」メソッドが呼び出される)。各 <action> から返されるメッセージは一覧内の次の <action> への入力メッセージとして使用されます。
<action> タイプもゼロまたは複数の <property> エレメントインスタンスを含むことができます。<property> エレメント/タイプは標準の名前と値の組み合わせを定義するか、自由形式のコンテンツを含むことができます (xsd:any)。XSD によれば、この自由形式のコンテンツは構成内の場所 (<provider>、<bus>、<listener> のいずれかまたはその派生物のいずれか) に関係なく<property> エレメント/タイプの有効な子コンテンツになります。ただし、 この自由形式の子コンテンツが使用される<action>定義の<property> インスタンス上でのみになります。
<action> 定義に記載されているように、アクションは org.jboss.soa.esb.actions.ActionProcessor class クラスを実装することで実装されます。このインターフェースの実装はすべて次の形式のパブリックコンストラクターを含まなければなりません。
public ActionZ(org.jboss.soa.esb.helpers.ConfigTree configuration);
<actions> 構成の例としては次のようになる場合があります。
<actions>
<action name="MyAction-1" class="com.acme.MyAction1"/>
<action name="MyAction-2" class="com.acme.MyAction2">
<property name="propA" value="propAVal" />
</action>
<action name="MyAction-3" class="com.acme.MyAction3">
<property name="propB" value="propBVal" />
<property name="propC">
<!-- Free form child content... -->
<some-free-form-element>zzz<some-free-form-element>
</property>
</action>
</actions>
9.4. 固有タイプの実装
<provider>、<bus>、<listener> のトランスポート固有特殊化を定義します (JMS, SQL など)。これにより構成を厳密に検証できるようになり、XSD 対応の XML エディター (Eclipse XML Editor など) を使用するユーザーにとって構成が容易になります。これら特殊化は特に何の設定を行わなくても JBoss ESB でサポートされる各トランスポートの構成要件を明示的に定義します。JBoss ESB の構成を行っている場合は「基本」タイプの代わりにこの特殊化されたタイプを使用することを推奨します。あるいは、公式の JBoss ESB リリース以外で新しいトランスポートがサポートされる場合のみです。
<jms-provider>などのプロバイダー設定を定義します。- 新しいプロバイダーにバスの構成を追加し (
<jms-bus>)、 固有の busid 属性値を割り当てます。 - 通常通りに
<services>を定義して、作成したばかりの新しいバス構成を参照する (busrefid を使用) トランスポート固有のリスナー構成 (<jms-listener>など) を追加します (例:<jms-bus>を参照する<jms-listener>)。
<jms-bus> から <jms-listener> しか参照できないということです。相互参照されるとランタイムエラーが発生します。
- JMS
<jms-provider>、<jms-bus>、<jms-listener>、<jms-message-filter><jms-message-filter> は <jms-bus> または <jms-listener> エレメントのいずれかに追加できます。<jms-provider> と <jms-bus> は JMS 接続プロパティを指定し、<jms-message-filter> は実際のメッセージのキュー/トピックとセレクターの詳細を指定します。- SQL
<sql-provider>、<sql-bus>、<sql-listener>、<sql-message-filter><sql-message-filter> は <sql-bus> または <sql-listener> エレメントのいずれかに追加できます。<sql-provider> と <sql-bus> は JDBC 接続プロパティを指定し、<sql-message-filter> はメッセージ/行の選択と処理プロパティを指定します。- FTP
<ftp-provider>、<ftp-bus>、<ftp-listener>、<ftp-message-filter><ftp-message-filter> は <ftp-bus> または <ftp-listener> のいずれかに追加できます。<ftp-provider> や <ftp-bus> は FTP アクセスプロパティを指定し、 <ftp-message-filter> はメッセージ/ファイルの選択と処理プロパティを指定します。- ハイバネート
<hibernate-provider>、<hibernate-bus>、<hibernate-listener><hibernate-message-filter> は <hibernate-bus> または <hibernate-listener> エレメントのいずれかに追加できます。<hibernate-provider> はハイバネート設定プロパティの場所などファイルシステムアクセスのプロパティを指定し、<hibernate-message-filter> はリッスンするクラス名とイベントを指定します。- ファイルシステム
<fs-provider>、<fs-bus>、<fs-listener>、<fs-message-filter><fs-message-filter> は <fs-bus> または <fs-listener> エレメントのいずれかに追加できます。<fs-provider> と <fs-bus> はファイルシステムアクセスプロパティを指定し、<fs-message-filter> はメッセージ/ファイルの選択と処理プロパティを指定します。- スケジュール
<schedule-provider>これは特殊タイプのプロバイダーで、上記のバスベースのプロバイダーとは異なります。詳細はスケジューリングをご覧ください。- JMS/JCA 統合
<jms-jca-provider>このプロバイダーは JCA インフローを使って着信メッセージの配信を有効にするため <jms-provider> の代わりに使用できます。これによりトランザクション処理されたフローをアクションパイプラインに導入し、アクションを JTA トランザクション内に包み込みます。
注記
表9.4 JMS メッセージフィルタ設定
| プロパティ名 | 説明 | 必須 |
|---|---|---|
| dest-type | 宛先のタイプ (QUEUE または TOPIC) | Yes |
| dest-name | Queue または Topic の名前 | Yes |
| selector | 複数のリスナーを同じキュー/トピックで登録できるようにします。ただし、リスナーはこのメッセージセレクターに基づいてフィルタリングされます。 | No |
| persistent | JMS の配信モードを永続的にするかどうかを指定します。値は真または偽です。デフォルト値は真です。 | No |
| acknowledge-mode | JMS セッション確認モード。AUTO_ACKNOWLEDGE、CLIENT_ACKNOWLEDGE、DUPS_OK_ACKNOWLEDGE のいずれかの値になります。デフォルト値は AUTO_ACKNOWLEDGE です。 | No |
| jms-security-principal | JMS 宛先ユーザー名。宛先への接続を作成するときに使用されます。 | No |
| jms-security-credential | JMS 宛先パスワード。宛先への接続を作成するときに使用されます。 | No |
<jms-bus busid="quickstartGwChannel">
<jms-message-filter
dest-type="QUEUE"
dest-name="queue/quickstart_jms_secured_Request_gw"
jms-security-principal="esbuser"
jms-security-credential="esbpassword"/>
</jms-bus>表9.5 JMS リスナーの構成
| プロパティ名 | 説明 | 必須 |
|---|---|---|
| name | リスナーの名前 | Yes |
| busrefid | リッスンする JMS の ID | No |
| is-gateway | この JMS リスナーインスタンスはゲートウェイですか?それともメッセージ対応のリスナーですか? | No。デフォルトは false です。 |
| maxThreads | JMS バス上でメッセージをリッスンする際に使用するスレッドの最大数。is-gateway が false の場合のみ該当 | No。デフォルトは 1 です。 |
| clientId | JMS 接続と関連付けられたクライアント ID。接続とオブジェクトを、プロバイダーによりクライアントの代わりに保たれたステータスを関連付ける際に使用。例:永続的なサブスクリプション | No。clientId が必須にも拘らず (例:durableSubscriptionName が指定されている場合)、指定されていない場合、デフォルトのリスナー名を使用します。 |
| durableSubscriptionName | 永続的なサブスクリプション名 | No。JMS Topics の場合のみ該当 |
9.5. ファイルシステムプロバイダー設定
表9.6 ファイルシステムメッセージフィルター設定
| プロパティ | 説明 | 必須 |
|---|---|---|
| directory | 受信ファイルに関してモニタリングが行われる FTP ディレクトリ | Yes |
| input-suffix | 受信ファイルのフィルタリングに使用するサフィックス。".esbIn" のように 1 文字以上かつ "." が含まれている必要があります。 | Yes |
| work-suffix | ファイルが ESB に処理される場合に使用するサフィックス。デフォルトは ".esbInProcess"。 | No |
| post-suffix | ファイルが ESB により正常に処理された場合に使用するサフィックス。デフォルトは ".esbDone"。 | No |
| post-delete | true の場合、 ファイルは処理後に削除される。 この場合、 post-directory および post-suffix は無効になる。デフォルト値は真。 | No |
| post-directory | ESB による処理後にファイルの移動先となる FTP ディレクトリ。デフォルト値は上記のディレクトリです。 | Yes |
| post-rename | true の場合、ファイルは処理後に名前が変更されます。post-directory および post-suffix は相互排他的である点に注意してください。 | No |
| error-delete | True の場合、処理中にエラーが発生するとこのファイルは削除されます。この場合、error-directory および error-suffix からの影響はありません。デフォルト値は true。 | No |
| error-directory | 処理中にエラーが発生した場合にファイルの移動先となる FTP ディレクトリ。デフォルト値は上記のディレクトリ。 | Yes |
| error-suffix | 処理中にエラーが発生した場合にファイル名に追加されるサフィックス。デフォルト値は .esbError。 | No |
9.6. FTP プロバイダー構成
表9.7 FTP プロバイダー構成
| プロパティ | 説明 | 必須 |
|---|---|---|
| hostname | 単純にポート 21 を使用する <host> の <host:port> の組み合わせで問題ありません。 | Yes |
| username | FTP 接続に使用されるユーザー名 | Yes |
| password | 上記ユーザーのパスワード | Yes |
| directory | 新しい受信ファイルについてモニタリングされる FTP ディレクトリ | Yes |
| input-suffix | ESB による消費を目的とするファイルのフィルタに使用されるファイルサフィックス (注: 「.esbIn」のようにドットを付ける)。 すべてのファイルが検索されるよう空白文字列にすることも可能。 | Yes |
| work-suffix | 別のスレッドやプロセスがファイルを取得しないようファイル処理中に使用されるファイルサフィックス。デフォルト値は .esbInProcess です。 | No |
| post-delete | true の場合、 ファイルは処理後に削除される。 この場合、 post-directory および post-suffix は無効になる。デフォルト値は真。 | No |
| post-directory | ESB による処理後にファイルの移動先となる FTP ディレクトリ。デフォルト値は上記のディレクトリです。 | No |
| post-suffix | 処理後にファイル名に追加されるファイルサフィックス。デフォルト値は .esbDone。 | No |
| error-delete | True の場合、処理中にエラーが発生するとこのファイルは削除されます。この場合、error-directory および error-suffix からの影響はありません。デフォルト値は true。 | No |
| error-directory | 処理中にエラーが発生した場合にファイルの移動先となる FTP ディレクトリ。デフォルト値は上記のディレクトリ。 | No |
| error-suffix | 処理中にエラーが発生した場合にファイル名に追加されるサフィックス。デフォルト値は .esbError。 | No |
| protocol | 次のいずれかのプロトコル
| No |
| passive | FTP接続がパッシブ状態であることを示します。この値を新に設定すると、FTP クライアントが FTP サーバーに対して 2 つの接続を確立します。デフォルト値は false で、クライアントは FTP サーバーが接続するポートを FTP サーバーに指示します。次に FTP サーバーはクライアントに対する接続を確立します。 | No |
| read-only | true の場合、 FTP サーバーはファイルに対する書き込み操作を許可しません。この場合、 次のプロパティは無効となるので注意: work-suffix、post-delete、post-directory、post-suffix、error-delete、error-directory、および error-suffix。デフォルトは false。詳細については、「読み取り専用 FTP リスナー」のセクションを参照してください。 | No |
| certificate-url | FTPS サーバー検証のためのパブリックサーバー証明書の URL または SFTP クライアント検証のためのプライベート証明書の URL。SFTP 証明書は、デプロイメント成果物内に組み込まれたリソースとして存在します。 | No |
| certificate-name | FTPS サーバー検証のための証明書の一般名 | No |
| certificate-passphrase | SFTP クライアント検証用プライベートキーのパスフレーズ | No |
9.7. FTP リスナーの構成
9.7.1. 読み取り専用 FTP リスナー
注記
表9.8 読み取り専用 FTP リスナーの構成
| 名前 | 説明 |
|---|---|
| scheduleidref | FTP リスナーによって使用されるスケジュール。「サービススケジューリング」を参照。 |
| remoteFilesystemStrategy-class | 実装するクラスでリモートファイルシステムの方法を上書きする: org.jboss.soa.esb.listeners.gateway.remotestrategies.RemoteFileSystemStrategy。デフォルト値は org.jboss.soa.esb.listeners.gateway.remotestrategies.ReadOnlyRemoteFileSystemStrategy。 |
| remoteFilesystemStrategy-configFile | ローカルファイルシステムまたはクラスパスに存在する JBoss TreeCache 設定ファイルを指定します。デフォルトではクラスパスのルートに存在する /ftpfile-cache-config.xml という名前のファイルを検索します。 |
| removeFilesystemStrategy-cacheListener | JBoss TreeCacheListener 実装が TreeCache で使用されることを指定する。デフォルト値は TreeCacheListener。 |
| maxNodes | キャッシュに格納されるファイルの最大数。0 は制限無しを意味する。 |
| timeToLiveSeconds | ノードが一掃されるまでのアイドル時間 (秒単位)。0 は制限無しを意味する。 |
| maxAgeSeconds | ノードが一掃されるまでにアイドル時間に関係なくオブジェクトが TreeCache 内に存在する時間 (秒単位)。0 は制限無しを意味する。 |
<ftp-listener name="FtpGateway"
busidref="helloFTPChannel"
maxThreads="1"
is-gateway="true"
schedule-frequency="5">
<property name="remoteFileSystemStrategy-configFile" value="./ftpfile-cache-config.xml"/>
<property name="remoteFileSystemStrategy-cacheListener" value=
"org.jboss.soa.esb.listeners.gateway.remotestrategies.cache.DeleteOnEvictTreeCacheListener"/>
</ftp-listener>
<region name="/ftp/cache"> <attribute name="maxNodes">5000</attribute> <attribute name="timeToLiveSeconds">1000</attribute> <attribute name="maxAgeSeconds">86400</attribute> </region>
表9.9 構成
| プロパティ | 説明 | コメント |
|---|---|---|
| maxNodes | キャッシュに格納されるファイルの最大数。 | 0 は制限無しを意味します。 |
| timeToLiveSeconds | ノードが一掃されるまでのアイドル時間 (秒単位)。 | 0 は制限無しを意味します。 |
| maxAgeSeconds | ノードが一掃されるまでにアイドル時間に関係なくオブジェクトが TreeCache 内に存在する時間 (秒単位)。 | 0 は制限無しを意味します。 |
9.8. UDP ゲートウェイ
UDP Gateway は、UDP プロトコル経由で送信される ESB 未対応のメッセージを受信するための実装です。ペイロードは、デフォルトの ESB メッセージオブジェクトの場所にあるアクションチェーンへ渡されます。アクションは esbMessage.getBody().get() を呼び出し、バイト配列ペイロードをリトリーブします。
表9.10 UDP ゲートウェイ設定
| プロパティ | 説明 | コメント |
|---|---|---|
| ホスト | リッスンするホスト名/ip | 必須 |
| ポート | リッスンするポート | 必須 |
| handlerClass | org.jboss.soa.esb.listeners.gateway.mina.MessageHandler の具体的な実装 | 任意。デフォルトは org.jboss.soa.esb.listeners.gateway.mina.DefaultMessageHandler です。 |
| is-gateway | UDPGatewayListener は、ゲートウェイとしてのみ機能できます。 | 必須 |
<udp-listener name="udp-listener" host="localhost" port="9999" handlerClass="org.jboss.soa.esb.listeners.gateway.mina.DefaultMessageHandler" is-gateway="true" <udp-listener/>
9.9. JBoss リモーティング (JBR) 設定
<jbr-provider name="socket_provider" protocol="socket" host="localhost">
<jbr-bus busid="socket_bus" port="64111"/>
</jbr-provider>
<listeners>
<jbr-listener name="soc" busidref="socket_bus" is-gateway="true"/>
</listeners>
表9.11 構成
| 名前 | 説明 | デフォルト値 |
|---|---|---|
| synchronous | 対象サービスを同期的に呼び出します。 | True |
| serviceInvokerTimeout | 非同期呼び出しのタイムアウト | 20000 |
| asyncResponse | 非同期のレスポンス | "<ack/> |
| securityNS | これは、使用すべき Web Service Security バージョンの名前空間です。この名前空間を使用して、SOAP メッセージのセキュリティヘッダーをマッチします。これは、Enterprise Service Bus がこれらのヘッダーからセキュリティ情報を抽出するためのものです。 | http://docs.oasis-open.org/wss/2004/01/oasis-200401http-wss-wssecurity-secext-1.0.xsd |
<jbr-provider name="https_provider" protocol="https" host="localhost">
<!-- Https/SSL settings -->
<property name="jbr-KeyStoreURL" value="/keys/myKeystore" />
<property name="jbr-KeyStorePassword" value="keys_ssl_pass" />
<property name="jbr-TrustStoreURL" value="/keys/myKeystore" />
<property name="jbr-TrustStorePassword" value="keys_ssl_pass" />
<property name="jbr-ClientAuthMode" value="need" />
<property name="serviceInvokerTimeout" value="20000" />
<jbr-bus busid="https_bus" port="9433"/>
</jbr-provider>
org.jboss.soa.esb.message.ResponseHeader クラスのインスタンスとして、Message.Properties 内にある必要があります。そのため、JBR Gateway をレスポンスヘッダーに設定する必要がある場合、Gateway レスポンスへ提供された Enterprise Service Bus Message (例:対象サービスの同期呼び出しの後) には、Message.Properties 上に設定された ResponseHeader クラスのインスタンスを含める必要があります。
9.10. HTTP ゲートウェイ
9.10.1. 基本設定
<service category="Vehicles" name="Cars" description="" invmScope="GLOBAL">
<listeners>
<http-gateway name="Http" />
</listeners>
<actions mep="RequestResponse">
<!-- Service Actions.... -->
</actions>
</service>
default HTTP バスプロバイダーを使用します。これは、busrefid 属性を定義しないためです。サービス名を使用して、HTTP エンドポイントアドレスを以下の方法で構築します。
9.10.2. URL パターン
<service category="Vehicles" name="Cars" description="" invmScope="GLOBAL"> <listeners> <http-gateway name="Http" urlPattern="esb-cars/*" /> </listeners> <actions mep="RequestResponse"> <!-- Service Aactions.... --> </actions> </service>
9.10.3. ポート制限
<http-gateway name="Http" urlPattern="esb-cars/*">
<property name="allowedPorts" value="8080,8081">
</http-gateway>
- http://<host>:8080/*
- http://<host>:8081/*
9.10.4. 処理リクエスト
- text/*
- application/xml
- application/*-xml
9.10.5. リクエスト情報
POST の場合、リクエストペイロードのみ)
HttpRequest requestInfo = HttpRequest.getRequest(message);
表9.12 プロパティ
| プロパティ | 説明 |
|---|---|
| queryParams | クエリパラメーターを含む java.util.Map<String, String[]>。複数の値を持つパラメーターをサポートするため、値は String[] となります。 |
| ヘッダー | リクエストヘッダーを含む java.util.List<HttpHeader> |
| authType | エンドポイントを保護するのに使用する認証スキーマの名前。または認証がない場合は null。CGI 変数の AUTH_TYPE の値と同じ。 |
| characterEncoding | このリクエストのボディで使用する文字エンコーディングの名前、またはリクエストが文字エンコーディングを指定しない場合 null。 |
| contentType | リクエストのボディのコンテンツタイプ (MIME タイプ)、またはタイプが不明な場合は null。CGI 変数の CONTENT_TYPE の値と同じ。 |
| contextPath | リクエストのコンテキストを示すリクエスト URI の一部。リクエスト URI では、コンテキストパスは常に最初にきます。このパスは "/" で始まりますが、 "/" 文字で終わりません。デフォルト (root) コンテキストのエンドポイントでは、"" を返します。コンテナーは、この文字列をデコーディングしません (Servlet 仕様を参照)。 |
| pathInfo | このリクエストが出された時にクライアントが送信する URL に関連付けられた追加のパス情報。この追加のパス情報は、"/" 文字から始まり、エンドポイントパスの後、かつクエリ文字列の前に来ます。追加のパス情報がなかった場合、このメソッドは null を返します。CGI 変数の PATH_INFO の値と同じです (Servlet 仕様を参照)。 |
| pathInfoToken | pathInfo のトークンを含む List<String> |
| queryString | クエリ文字列 |
| requestURI | プロトコル名からクエリ文字列までのこのリクエスト URL の一部。Web コンテナーはこの文字列をデコーディングしません。 |
| requestPath | エンドポイントを呼び出すリクエスト URL の一部。追加のパス情報やクエリ文字列は含みません。CGI 変数の SCRIPT_NAME の値と同じ。urlPattern が "/*" 出会った場合、このメソッドは "http" を返します。 |
| localAddr | リクエストを受け取ったインターフェースの IP アドレス |
| localName | リクエストを受け取った IP インターフェースのホスト名 |
| method | HTTP メソッド |
| protocol | HTTP プロトコルの名前とバージョン |
| remoteAddr | クライアントまたはリクエストを最後に送信したプロキシの IP アドレス。CGI 変数の REMOTE_ADDR の値と同じ |
| remoteHost | クライアントまたはリクエストを最後に送信したプロキシの完全修飾名。エンジンが (パフォーマンスの改善のため) ホスト名を解決できない、あるいは解決しようとしない場合、ドット表記の IP アドレスとなります。 |
| remoteUser | ユーザー認証がされている場合、このリクエストを出すユーザーのログイン。または、ユーザー認証がされていない場合は null。ユーザー名が後続のリクエストに送信されるかは、クライアントや認証タイプにより変わります。CGI 変数の REMOTE_USER の値と同じ。 |
| contentLength | リクエストボディの長さ (バイト) および入力ストリームで利用可能な長さ (バイト)、長さが不明な場合は -1。HTTP サーブレットの場合、CGI 変数の CONTENT_LENGTH の値と同じ。 |
| requestSessionId | クライアント指定のセッション ID、または指定がない場合は null |
| scheme | 使用するスキーマ。"http" または "https" いずれか |
| serverName | リクエストの送信先サーバーのホスト名。"Host" ヘッダーの値にある ":" の前の値です。解決済みの名前またはサーバーの IP アドレス。 |
9.10.6. レスポンス処理
9.10.6.1. 非同期レスポンス処理
<listeners>
<http-gateway name="Http" urlPattern="esb-cars/*">
<asyncResponse />
</http-gateway>
</listeners>
<listeners>
<http-gateway name="Http" urlPattern="esb-cars/*">
<asyncResponse statusCode="202" />
</http-gateway>
</listeners>
<listeners>
<http-gateway name="Http" urlPattern="esb-cars/*">
<asyncResponse statusCode="202">
<payload classpathResource="/202-static-response.xml"
content-type="text/xml"
characterEncoding="UTF-8" />
<asyncResponse>
</http-gateway>
</listeners>
表9.13
| プロパティ | 説明 | 必須 |
|---|---|---|
| classpathResource |
レスポンスペイロードを含むクラスパスでファイルへのパスを指定します。
| 必須 |
| contentType |
classpathResource 属性が指定したペイロードデータのコンテンツ/MIME タイプを指定します。
| 必須 |
| characterEncoding |
classpathResource 属性が指定したデータの文字エンコーディング
| 任意 |
9.10.6.2. 同期レスポンス処理
9.10.6.3. レスポンス情報
HttpResponse responseInfo = new HttpResponse(HttpServletResponse.SC_OK);
responseInfo.setContentType("text/xml");
// Set other response info ...
// Set the HttpResponse instance on the ESB response Message instance
responseInfo.setResponse(responseMessage);
表9.14
| プロパティ | 説明 |
|---|---|
| responseCode |
ゲートウェイレスポンスに設定される HTTP レスポンス/ステータスコード (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)
|
| contentType |
レスポンスペイロード MIME タイプ
|
| encoding |
レスポンスペイロードのコンテンツエンコーディング
|
| length |
レスポンスペイロードのコンテンツの長さ
|
| headers |
リクエストヘッダーを含む java.util.List<HttpHeader>
|
9.10.6.4. ペイロードエンコーディング
9.10.6.5. レスポンスのステータス
9.10.6.6. レスポンスのタイムアウト
<listeners>
<http-gateway name="Http" urlPattern="esb-cars/*">
<property name="synchronousTimeout" value="120000"/>
</http-gateway>
</listeners>
9.10.6.7. 例外処理
<http-gateway name="http-gateway"> <exception> <mapping class="com.acme.AcmeException" status="503" /> </exception> </http-gateway>
<http-provider name="http"> <!-- Global exception mappings file... --> <exception mappingsFile="/http-exception-mappings.properties" /> </http-provider>
9.10.7. セキュリティ処理
- 設定の <http-provider> セクションで <http-bus> を指定します。
- <http-bus> で制約を指定します。
- "busrefid" 属性を使用して <http-gateway> から <http-bus> を参照します。
注記
9.10.8. 保護メソッドおよび許容ユーザーのロール
<http-bus busid="secureSalesDeletes"> <allowed-roles> <role name="friend" /> </allowed-roles> <protected-methods> <method name="DELETE" /> </protected-methods> </http-bus>
表9.15
| 指定のメソッド | 指定のロール | ログイン必須 |
|---|---|---|
| No |
No
| No |
| No |
Yes
| 全メソッド向け |
| Yes |
Yes
| 指定済みのメソッドのみ |
| Yes |
No
| No。指定のメソッドはすべてブロック |
9.10.9. 認証メソッドとセキュリティドメイン
<http-provider name="http"> <http-bus busid="secureFriends"> <allowed-roles> <role name="friend" /> </allowed-roles> <protected-methods> <method name="DELETE" /> </protected-methods> </http-bus> <auth method="BASIC" domain="java:/jaas/JBossWS" /> </http-provider>
注記
9.10.10. トランスポート保証
<http-bus busid="secureFriends" transportGuarantee="CONFIDENTIAL"> <!-- etc etc --> </http-bus>
9.11. Camel ゲートウェイ
警告
注記
camel-core.jar のみが含まれており、他に必要な依存性は手動で追加する必要があります (その他の camel-* JAR やサードパーティの JAR を含む)。
jboss-esb.xml ファイルで、更新スキーマ (jbossesb-1.3.0.xsd) を使用するように宣言した場合、JBoss ESB の <providers> セクション内で、新しい <camel-provider> セクションが利用できます。
<camel-provider name="..."> <camel-bus busid="..."> <from uri="..."/> <from uri="..."/> </camel-bus> </camel-provider>
<camel-gateway name="..." busidref="..."/>
<camel-gateway name="..."> <from uri=""/> <from uri=""/> </camel-gateway>
<camel-gateway name="..." from-uri="..."/>
<camel-bus name="..." busid="..." from-uri="..."/>
注記
注記
<camel-gateway name="..." from-uri="..." async="false" timeout="30000"/>
- async 属性 (デフォルトは false) は、基盤の ServiceInvoker が関連のサービスを同期的または非同期的に呼び出すかを指定しあmす。
- timeout 属性 (デフォルトは 30000) は、ServiceInvoker が同期呼び出しを中断するまでに待機する時間をミリ秒で定義します。
注記
9.12. 旧構成モデルからの移行
org.jboss.soa.esb.helpers.ConfigTree のインスタンス経由で受け取っていました。新しい構成モデルは XSD ベースとなりますが、基礎となるコンポーネント構成パターンはいまだ org.jboss.soa.esb.helpers.ConfigTree のインスタンス経由になります。つまり現在、XSD ベースの構成は ConfigTree スタイルの設定にマッピング/変換されるということになります。
- 新しい構成モデルに関する全ドキュメントをお読みください。 旧モデルの知識に基づいて新しい構成を推測で理解することはできません。
- 新しい構成で自由形式のマークアップがサポートされる場所は <property> エレメント/タイプのみになります。 このタイプは <provider>、<bus>、<listener> のタイプ (およびサプタイプ) で許可されます。 ただし、<property> ベースの自由形式マークアップが ConfigTree 設定にマッピングされる場所は <property> が <action> で存在する場所のみになります。 この場合、<property> のコンテンツはターゲットの ConfigTree <action> にマッピングされます。 しかし、<action> で自由形式の子コンテンツを持つ <property> エレメントが複数ある場合、 このコンテンツはすべてターゲット ConfigTree <action> 上で連結されます。
- 新しいリスナー/アクションのコンポーネントを開発する際はこれらのコンポーネントが依存する ConfigTree ベースの構成が新しい XSD ベースの設定からマッピング可能であることを必ず確認してください。この例としては、 ConfigTree 構成モデル内でどのようにその設定をリスナーノード上で属性を使いリスナーコンポーネントに提供することが決定できるか、またはリスナー構成内の子ノードに基づいて提供することが決定できるかを示す例です。<listener> コンポーネント上にある自由形式構成のこのタイプは XSD から ConfigTree へのマッピングではサポートされません。 つまり、上記の例の子コンテンツは XSD 設定から ConfigTree スタイルの設定にはマッピングされないということです。実際、XSD 設定は <property> に存在しない限り任意のコンテンツを受け取りません。また、<property> に存在する場合でも (<listener> 上)、 マッピングコードによって無視されます。
9.13. 構成
org.jboss.soa.esb.parameters.ParamRepositoryFactory によって隠されます。
public abstract class ParamRepositoryFactory
{
public static ParamRepository getInstance();
}
org.jboss.soa.esb.parameters.ParamRepository インターフェースの実装を返します。
public interface ParamRepository
{
public void add(String name, String value) throws
ParamRepositoryException;
public String get(String name) throws ParamRepositoryException;
public void remove(String name) throws ParamRepositoryException;
}
org.jboss.soa.esb.parameters.ParamFileRepository の実装 1 つのみなります。1 ファイルからのパラメータのロードが可能であることを期待します。使用する実装は org.jboss.soa.esb.paramsRepository.class プロパティを使って上書きが可能です。
注記
第10章 データのデコード - MIME デコーダー
10.1. MimeDecoder の実装
- org.jboss.soa.esb.listeners.message.mime.MimeDecoder インターフェースを実装するクラスを作成します。
- @MimeType アノテーションで新規作成されたクラスに注釈を付け、アノテーションの値として mime タイプを指定します。
- META-INF/org/jboss/soa/esb/listeners/message/mime/decoders.lst で新規作成クラスを定義します。このファイルは実行時にクラスパスに存在している必要があります。モジュールにこのファイルがない場合、このファイルをお使いのモジュールソース/リソースに追加して、実行時にその場所に置いておくようにしてください。
- (任意) MimeDecoder 実装がリスナー設定にアクセスする必要がある場合 (追加設定情報)、org.jboss.soa.esb.Configurable インターフェースを実装するクラスを持たせるようにしてください。
@MimeType("text/plain")
public class TextPlainMimeDecoder implements MimeDecoder, Configurable {
private Charset encodingCharset;
public void setConfiguration(ConfigTree configTree) throws ConfigurationException {
AssertArgument.isNotNull(configTree, "configTree");
String encoding = configTree.getAttribute("encoding", "UTF-8");
encodingCharset = Charset.forName(encoding);
}
public Object decode(byte[] bytes) throws MimeDecodeException {
try {
return new String(bytes, encodingCharset.name());
} catch (UnsupportedEncodingException e) {
throw new MimeDecodeException("Unexpected character encoding error.", e);
}
}
}
10.2. ゲートウェイ実装での MimeDecoder の使用
this.mimeDecoder = MimeDecoder.Factory.getInstanceByConfigTree(config);
<fs-listener name="FileGateway1" busidref="fileChannel1" is-gateway="true"
poll-frequency-seconds="10">
<property name="mimeType" value="text/plain" />
<property name="encoding" value="UTF-8" />
</fs-listener>
<fs-listener name="FileGateway2" busidref="fileChannel2" is-gateway="true"
poll-frequency-seconds="10">
<property name="mimeDecoder" value="com.acme.mime.ImageJPEGMimeDecoder” />
</fs-listener>
Object decodedPayload = mimeDecoder.decode(payloadBytes);
10.3. 事前定義された MimeDecoder 実装
10.3.1. text/plain
表10.1 プロパティ
| プロパティ | 説明 | コメント |
|---|---|---|
| encoding |
byte[] でエンコードされている text/plain データの文字エンコード
| デフォルト “UTF-8” |
| decodeTo |
text/plain データのデコーディング方法
| デフォルト “STRING” |
第11章 Web サービスサポート
11.1. JBossWS
SOAPProcessorアクションにより、JBossWS 2.x 以降の Web サービスエンドポイントを、ESB 上で稼働しているリスナーより公開することができます。これは、独自の Web サービスを提供しないサービスでも公開が可能です。SOAPProcessorアクションは SOAP on the bus とも呼ばれます。SOAPClientアクションにより、Web サービスエンドポイント上で呼び出しができます。SOAPClientアクションは SOAP off the bus と呼ばれる場合もあります。
注記
第12章 事前定義されたアクション
12.1. トランスフォーマーとコンバーター
MessagePayloadProxy を使用します。
12.1.1. ByteArrayToString
| 入力タイプ | byte[ ] |
| クラス | org.jboss.soa.esb.actions.converters.ByteArrayToString |
byte[] ベースのメッセージペイロードを取得して java.lang.String オブジェクトインスタンスに変換します。
表12.1 ByteArrayToString のプロパティ
| プロパティ | 説明 | 必須 |
|---|---|---|
| encoding |
メッセージバイト配列のバイナリデータエンコーディング。デフォルトは
UTF-8。
| No |
例12.1 設定例
<action name="transform" class="org.jboss.soa.esb.actions.converters.ByteArrayToString">
<property name="encoding" value="UTF-8" />
</action>
12.1.2. LongToDateConverter
|
入力タイプ
| java.lang.Long/long
|
|
出力タイプ
| java.util.Date
|
|
クラス
| org.jboss.soa.esb.actions.converters.LongToDateConverter
|
java.util.Date オブジェクトインスタンスに変換します。
例12.2 設定例
<action name="transform" class="org.jboss.soa.esb.actions.converters.LongToDateConverter">
12.1.3. ObjectInvoke
| 入力タイプ | ユーザーオブジェクト |
| 出力タイプ | ユーザーオブジェクト |
| クラス | org.jboss.soa.esb.actions.converters.ObjectInvoke |
表12.2 ObjectInvoke のプロパティ
| プロパティ | 説明 | 必須 |
|---|---|---|
| class-processor |
メッセージペイロードの処理に使用されるプロセッサークラスのランタイムクラス名です。
| Yes |
| class-method |
メソッドを処理すために使用されるプロセッサークラスのメソッド名。
| No |
例12.3 設定例
<action name="invoke" class="org.jboss.soa.esb.actions.converters.ObjectInvoke">
<property name="class-processor" value="org.jboss.MyXXXProcessor"/>
<property name="class-method" value="processXXX" />
</action>
12.1.4. ObjectToCSVString
| 入力タイプ | ユーザーオブジェクト |
| 出力タイプ | java.lang.String |
| クラス | org.jboss.soa.esb.actions.converters.ObjectToCSVString |
表12.3 ObjectToCSVString プロパティ
| プロパティ | 説明 | 必須 |
|---|---|---|
| bean-properties |
出力 CSV 文字列のために CSV 値を取得するために使用するオブジェクト Bean プロパティ名の一覧。オブジェクトは一覧の各プロパティに対して getter メソッドをサポートする必要があります。
| Yes |
| fail-on-missing-property |
プロパティがオブジェクトで不明な場合 (つまり、オブジェクトがプロパティの getter メソッドをサポートしない場合) にアクションが失敗するかどうかを示すフラグ。デフォルト値は
false です。
| No |
例12.4 設定例
<action name="transform"
class="org.jboss.soa.esb.actions.converters.ObjectToCSVString">
<property name="bean-properties"
value="name,address,phoneNumber"/>
<property name="fail-on-missing-property"
value="true" />
</action>12.1.5. ObjectToXStream
| 入力タイプ | ユーザーオブジェクト |
| 出力タイプ | java.lang.String |
| クラス | org.jboss.soa.esb.actions.converters.ObjectToXStream |
表12.4 ObjectToXStream のプロパティ
| プロパティ | 説明 | 必須 |
|---|---|---|
| class-alias |
シリアル化前に
XStream.alias(String, Class) の呼出しで使用されるクラスエイリアス。デフォルトでは入力オブジェクトのクラス名に設定されます。
| No |
| exclude-package |
生成された XML からパッケージ名を除外します。デフォルト値は
true です。class-alias が指定されている場合は適用できません。
| No |
| aliases |
XStream が XML エレメントをオブジェクトに変換できるように追加のエイリアスを指定します。
| No |
| namespaces |
XStream によって生成された XML に追加する必要があるネームスペースを指定します。各 namespace-uri はこのネームスペースが現れるエレメントである local-part に関連付けられます。
| No |
| xstream-mode |
使用する XStream モードを指定します。設定可能な値は
XPATH_RELATIVE_REFERENCES (デフォルト値)、XPATH_ABSOLUTE_REFERENCES、 ID_REFERENCES、または NO_REFERENCES です。
| No |
| fieldAliases |
Xstream に追加されたフィールドエイリアス
| No |
| implicit-collections |
Xstream で登録されます。
| No |
| converters |
Xtream で登録されるコンバーター一覧
| No |
例12.5 設定例
<action name="transform" class="org.jboss.soa.esb.actions.converters.ObjectToXStream">
<property name="class-alias" value="MyAlias" />
<property name="exclude-package" value="true" />
<property name="aliases">
<alias name="alias1" class="com.acme.MyXXXClass1" />
<alias name="alias2" class="com.acme.MyXXXClass2" />
<alias name="xyz" class="com.acme.XyzValueObject"/>
<alias name="x" class="com.acme.XValueObject"/>
...
</property>
<property name="namespaces">
<namespace namespace-uri="http://www.xyz.com" local-part="xyz"/>
<namespace namespace-uri="http://www.xyz.com/x" local-part="x"/>
...
</property>
<property name="fieldAliases">
<field-alias alias="aliasName" definedIn="className" fieldName="fieldName"/>
<field-alias alias="aliasName" definedIn="className" fieldName="fieldName"/>
...
</property>
<property name="implicit-collections">
<implicit-collection class="className" fieldName="fieldName"
fieldType="fieldType" itemType="itemType"/>
...
</property>
<property name="converters">
<converter class="className" fieldName="fieldName" fieldType="fieldType"/>
...
</property>
</action>12.1.6. XStreamToObject
| 入力タイプ | java.lang.String |
| 出力タイプ | ユーザーオブジェクト (“incoming-type” プロパティによって指定されます) |
| クラス | org.jboss.soa.esb.actions.converters.XStreamToObject |
表12.5 XStreamToObject のプロパティ
| プロパティ | 説明 | 必須 |
|---|---|---|
| class-alias |
シリアル化中に使用されるクラスエイリアス。デフォルトでは入力オブジェクトのクラス名に設定されます。
| No |
| exclude-package |
XML にパッケージ名を含めるかどうかを示すフラグ。
| YES |
| incoming-type |
クラスタイプ
| Yes |
| root-node |
XML の実際のルートノードとは異なるルートノードを指定します。XPath 式を取得します。
| No |
| aliases |
XStream が XML エレメントをオブジェクトに変換できるように追加のエイリアスを指定します。
| No |
| attribute-aliases |
Xstream が XML 属性をオブジェクトに変換できるように追加の属性エイリアスを指定します。
| No |
| fieldAliases |
Xstream に追加されたフィールドエイリアス
| No |
| implicit-collections |
Xstream で登録されます。
| No |
| converters |
Xstream が XML エレメントと属性をオブジェクトに変換できるようにコンバーターを指定します。コンバーターの詳細については、http://xstream.codehaus.org/converters.html を参照してください。
| No |
例12.6 設定例
<action name="transform" class="org.jboss.soa.esb.actions.converters.XStreamToObject">
<property name="class-alias" value="MyAlias" />
<property name="exclude-package" value="true" />
<property name="incoming-type" value="com.acme.MyXXXClass" />
<property name="root-node" value="/rootNode/MyAlias" />
<property name="aliases">
<alias name="alias1" class="com.acme.MyXXXClass1/>
<alias name="alias2" class="com.acme.MyXXXClass2/>
...
</property>
<property name="attribute-aliases">
<attribute-alias name="alias1" class="com.acme.MyXXXClass1"/>
<attribute-alias name="alias2" class="com.acme.MyXXXClass2"/>
...
</property>
<property name="fieldAliases">
<field-alias alias="aliasName" definedIn="className" fieldName="fieldName"/>
<field-alias alias="aliasName" definedIn="className" fieldName="fieldName"/>
...
</property>
<property name="implicit-collections">
<implicit-colletion class="className" fieldName="fieldName" fieldType="fieldType"
itemType="itemType"/>
...
</property>
<property name="converters">
<converter class="className" fieldName="fieldName" fieldType="fieldType"/>
...
</property>
</action>12.1.7. XsltAction
表12.6 XsltAction プロパティ
| プロパティ | 説明 | 必須 |
|---|---|---|
|
get-payload-location
|
メッセージペイロードに含まれるメッセージボディの位置
未指定のデフォルトのペイロード位置を使用する場合
|
NO
|
|
set-payload-location
|
結果となるペイロードが配置されるメッセージボディの位置。
未指定のデフォルトのペイロード位置を使用する場合
|
No
|
|
templateFile
|
XSL テンプレートファイルへのパス。デプロイアーカイブまたは URL 内のファイルパスで定義します。
|
Yes
|
|
resultType
|
結果となるメッセージペイロードとして設定される結果のタイプ。
このプロパティは、変換の出力結果を制御します。現在利用可能な値は以下のとおりです。
メッセージペイロードが
SourceResult オブジェクトで、resultType が SOURCERESULT に設定されていない場合、結果は resultType で指定されているタイプで返されます。開発者は、このタイプに互換があることを確認するようにしてください。
|
No
|
|
failOnWarning
| true の場合、変換警告が発生して例外が送出されます。false の場合、問題があることがロギングされます。
デフォルトは true
|
No
|
|
uriResolver
| URIResolver を実装するクラスの完全修飾クラス名。これは、変換ファクトリに設定されます。
|
No
|
|
factory.feature.*
|
変換ファクトリに設定されるファクトリ機能。完全修飾 URI である機能名は factory.feature. 接頭辞のあとに指定する必要があります。例:factory.feature.http://javax.xml.XMLConstants/feature/secure-processing
|
No
|
|
Factory.attribute.*
|
変換ファクトリに設定されるファクトリ属性。属性名は factory.attribute. 接頭辞のあとに指定する必要があります。例:factory.attribute.someVendorAttributename
|
NO
|
| validation |
True の場合、ソース文書が無効になり、例外が送出されます。False の場合、整形式の文書が強制されたとしても、検証が行われます。「XsltAction 検証」 を参照してください。
デフォルト値
. false
| No |
| schemaFile |
使用する入力スキーマファイル (XSD)。クラスパスに置かれている。「XsltAction 検証」 を参照してください。
| No |
| schemaLanguage |
使用する入力スキーマ言語。「XsltAction 検証」 を参照してください。
| No |
12.1.7.1. XsltAction 検証
- Disabled (デフォルト)これは、明示的に
falseに設定するか、省略され検証を無効にすることができます。<property name="validation" value="false"/>
- DTD
<property name="validation" value="true"/> <property name="schemaLanguage" value="http://www.w3.org/TR/REC-xml"/>
または<property name="validation" value="true"/> <property name="schemaLanguage" value=""/>
- W3C XML Schema または RELAX NG
<property name="validation" value="true"/>
または<property name="validation" value="true"/> <property name="schemaLanguage" value="http://www.w3.org/2001/XMLSchema"/>
または<property name="validation" value="true"/> <property name="schemaLanguage" value="http://relaxng.org/ns/structure/1.0"/>
- W3C XML Schema または schemaFile が含まれる RELAX NG
<property name="validation" value="true"/> <property name="schemaFile" value="/example.xsd"/>
または<property name="validation" value="true"/> <property name="schemaLanguage" value="http://www.w3.org/2001/XMLSchema"/> <property name="schemaFile" value="/example.xsd"/>
または<property name="validation" value="true"/> <property name="schemaLanguage" value="http://relaxng.org/ns/structure/1.0"/> <property name="schemaFile" value="/example.rng"/>
- XML が整形式で、有効な場合
- 変換が実行されます。
- パイプラインが継続されます。
- XML が不正な場合
- エラーはロギングがされます。
- SAXParseException -> ActionProcessingException
- パイプラインが停止されます。
- XML が整形式であるが無効な場合
- 検証が有効でない場合
- 変換が失敗します。
- パイプラインが継続されます。
- 検証が有効な場合
- エラーはロギングがされます。
- SAXParseException -> ActionProcessingException
- パイプラインが停止されます。
12.1.8. SmooksTransformer
重要
| クラス | org.jboss.soa.esb.actions.converters.SmooksTransformer |
表12.7 SmooksTransformer リソースの設定:
| プロパティ | 説明 | 必須 |
|---|---|---|
| resource-config | Smooks リソース設定ファイル。
| Yes |
表12.8 SmooksTransformer メッセージプロファイルプロパティ (オプション)
| プロパティ | 説明 | 必須 |
|---|---|---|
| from |
メッセージ交換参加者名、 メッセージ生成者
| No |
| from-type |
"from" メッセージ交換参加者によって作成されたメッセージタイプ/形式。
| No |
| to |
メッセージ交換参加者名、 メッセージ消費者
| No |
| to |
メッセージ交換参加者名、メッセージ消費者
| No |
| to-type |
“to”メッセージ交換参加者によって消費されたメッセージタイプ/形式。
| No |
例12.7 設定例: デフォルトの入力/出力
<action name="transform" class="org.jboss.soa.esb.actions.converters.SmooksTransformer">
<property name="resource-config" value="/smooks/config-01.xml" />
</action>例12.8 設定例: 名前付きの入力/出力
<action name="transform" class="org.jboss.soa.esb.actions.converters.SmooksTransformer">
<property name="resource-config" value="/smooks/config-01.xml" />
<property name="get-payload-location" value="get-order-params" />
<property name="set-payload-location" value="get-order-response" />
</action>例12.9 設定例:メッセージプロファイルの使用
<action name="transform" class="org.jboss.soa.esb.actions.converters.SmooksTransformer">
<property name="resource-config" value="/smooks/config-01.xml" />
<property name="from" value="DVDStore:OrderDispatchService" />
<property name="from-type" value="text/xml:fullFillOrder" />
<property name="to" value="DVDWarehouse_1:OrderHandlingService" />
<property name="to-type" value="text/xml:shipOrder" />
</action>Message.Body under their beanId の配下で Message.Body にバインドされます。詳細は、http://community.jboss.org/wiki/MessageTransformation を参照してください。
12.1.9. SmooksAction
重要
12.1.9.1. SmooksAction の設定
例12.10 SmooksAction
<action name="transform" class="org.jboss.soa.esb.smooks.SmooksAction">
<property name="smooksConfig" value="/smooks/order-to-java.xml" />
</action>表12.9 SmooksAction オプションとなる設定プロパティ
| プロパティ | 説明 | デフォルト値 |
|---|---|---|
| get-payload-location |
メッセージペイロードに含まれるメッセージボディの位置
| デフォルトのペイロード位置 |
| set-payload-location |
結果となるペイロードが配置されるメッセージボディの位置。
| デフォルトのペイロード位置 |
| mappedContextObjects |
ESB メッセージボディの EXECUTION_CONTEXT_ATTR_MAP_KEY マップにマッピングされるコンマ区切りの Smooks ExecutionContext オブジェクト。デフォルトは空の一覧です。オブジェクトはシリアライズできる必要があります。
| |
| resultType |
結果となるメッセージペイロードとして設定される結果のタイプ。「結果タイプの指定」 を参照してください。
| STRING |
| javaResultBeanId | resultType=JAVA の場合のみ該当
resultType が "JAVA" の場合に結果としてマッピングされる Smooks Bean コンテキスト beanId。指定されていない場合は、Bean コンテキスト Bean Map が JAVA の結果としてマッピングされます。
| |
| reportPath |
Smooks 実行レポートを生成するときのパスおよびファイル名。これは開発での使用を目的としており、本番稼働での使用は目的としていません。
|
12.1.9.2. メッセージ入力ペイロード
12.1.9.3. XML、EDI、CSV などの入力ペイロード
- 文字列
- InputStream
- Reader
- バイトアレイ
12.1.9.4. Java 入力ペイロード
Smooks.filterSourceが渡される JavaSource インスタンス上でsetEventStreamRequired(false)を呼び出すJavaSource javaSource = new JavaSource(orderBean); // Turn streaming off via the JavaSource... javaSource.setEventStreamRequired(false); smooks.filterSource(javaSource, result);
- あmたは、Smooks 設定の読み込み機能をオフにする
<?xml version="1.0"?> <smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd"> <reader> <features> <setOff feature="http://www.smooks.org/sax/features/generate-java-event-stream" /> </features> </reader> <!-- Other Smooks configurations e.g. a FreeMarker template... --> </smooks-resource-list>
- オブジェクトが Map の場合、Map インスタンスはテンプレートコンテキストになり、テンプレート内の bean 名に Map エントリキーを使用するだけでよくなります。
- Map 以外のオブジェクトは、JavaSource クラスがオブジェクトクラス SimpleName を取り、JavaBean プロパティ名をそこから作成します。これは、テンプレート作成に使用するコンテキスト bean の名前です。例えば、Bean クラス名は
com.acme.Orderで、テンプレート作成用のコンテキスト bean 名はorderになります。
12.1.9.5. 結果タイプの指定
例12.11 結果タイプの指定
<action name="transform" class="org.jboss.soa.esb.smooks.SmooksAction">
<property name="smooksConfig" value="/smooks/order-to-java.xml" />
<property name="resultType" value="JAVA" />
<property name="javaResultBeanId" value="order" />
</action>12.1.10. PersistAction
| 入力タイプ | メッセージ |
| 出力タイプ | 入力メッセージ |
| クラス | org.jboss.soa.esb.actions.MessagePersister |
表12.10 PersistAction のプロパティ
| プロパティ | 説明 | 必須 |
|---|---|---|
| classification |
メッセージが保存される場所を分類するために使用されます。メッセージプロパティ
org.jboss.soa.esb.messagestore.classification がメッセージで定義されている場合は、そのメッセージプロパティが代わりに使用されます。それ以外の場合は、デフォルト値がインスタンス作成時に提供されることがあります。
| Yes |
| message-store-class | MessageStore の実装
| Yes |
| terminal |
パイプラインを終了するためにアクションが使用される場合、この値は true (デフォルト値) に設定する必要があります。それ以外の場合は、この値を false に設定します (入力メッセージが処理から返されます)。
| No |
例12.12 PersistAction
<action name="PersistAction" class="org.jboss.soa.esb.actions.MessagePersister">
<property name="classification" value="test"/>
<property name="message-store-class"
value="org.jboss.internal.soa.esb.persistence.format.db.DBMessageStoreImpl"/>
</action>12.2. ビジネスプロセス管理
12.2.1. JBPM - BpmProcessor
| 入力タイプ | AbstractCommandVehicle.toCommandMessage() で生成される org.jboss.soa.esb.message.Message |
| 出力タイプ | Message – 入力メッセージと同じ |
| クラス | org.jboss.soa.esb.services.jbpm.actions.BpmProcessor |
- NewProcessInstanceCommand
- StartProcessCommand
- CancelProcessInstanceCommand
- GetProcessInstanceVariablesCommand
表12.11 BpmProcessor のプロパティ
| プロパティ | 説明 | 必須 |
|---|---|---|
| command |
呼び出される JBPM コマンド。必須の許容値:
| Yes |
| processdefinition |
process-definition-id プロパティが使用されない場合の New- および Start-ProcessInstanceCommands の必須プロパティ。このプロパティの値は JBPM にすでにデプロイされ、新しいインスタンスを作成したいプロセス定義を参照する必要があります。このプロパティは Signal- および CancelProcessInstance-Commands に適用されません。
| 場合による |
| process-definition-id |
processdefinition プロパティが使用されない場合の New- および Start-ProcessInstanceCommands の必須プロパティ。このプロパティの値は新しいインスタンスを作成したい JBPM の processdefintion id を参照する必要があります。このプロパティは Signal- および CancelProcessInstanceCommands に適用されません。
| 場合による |
| actor |
New- および StartProcessInstanceCommands のみに適用される JBPM actor id を指定するオプションプロパティ。
| No |
| key |
JBPM キーの値を指定するオプションプロパティ。たとえば、このキーの値として一意の請求書 id を渡すことができます。JBPM 側では、このキーは “ビジネス” キー id フィールドになります。このキーはプロセスインスタンスに対する文字列ベースのビジネスキープロパティです。ビジネスキーが提供される場合、ビジネスキーとプロセス定義の組み合わせは一意である必要があります。EsbMessage から必要な値を抽出するためにキーの値は MVEL 式を保持できます。たとえば、メッセージのボディに “businessKey”という名前の名前付きパラメーターがある場合は、“body.businessKey” を使用します。このプロパティは New- および StartProcessInstanceCommands に対してのみ使用されることに注意してください。
| No |
| transition-name |
オプションパラメーター。このプロパティは StartProcessInstance- および Signal Commands にのみ適用され、現在のノードから複数の移行が存在する場合にのみ使用されます。このプロパティが指定されていない場合は、ノードからデフォルトの移行が取得されます。デフォルトの移行は JBPM processdefinition.xml の該当するノードに対して定義された移行の一覧の最初の移行です。
| No |
| esbToBpmVars |
New- および StartProcessInstanceCommands、SignalCommand のオプションプロパティ。このプロパティは EsbMessage から抽出し、特定のプロセスインスタンスに対する JBPM コンテキストに設定する必要がある変数の一覧を定義します。この一覧はマッピングエレメントから構成されます。各マッピングエレメントは以下の属性を持つことができます。
| No |
12.3. スクリプト
12.3.1. GroovyActionProcessor
| クラス | org.jboss.soa.esb.actions.scripting.GroovyActionProcessor |
表12.12 GroovyActionProcessor のプロパティ
| プロパティ | 説明 | 必須 |
|---|---|---|
| script |
Groovy スクリプトへのパス (クラスパス上)。
| |
| supportMessageBasedScripting |
メッセージ内でスクリプトの使用を許可します。
| |
| cacheScript |
スクリプトをキャッシュします。 デフォルトの設定は
true です。
| No |
表12.13 GroovyAction Processor Script Binding の変数
| 変数 | 説明 |
|---|---|
| message |
メッセージ
|
| payloadProxy |
メッセージペイロードのユーティリティ (MessagePayloadProxy)
|
| config |
アクション設定 (ConfigTree)
|
| logger |
GroovyActionProcessor のスタティック Log4J Logger (Logger)。
|
例12.13 設定例
<action name="process" class="org.jboss.soa.esb.scripting.GroovyActionProcessor">
<property name="script" value="/scripts/myscript.groovy"/>
</action>12.3.2. ScriptingAction
| クラス | org.jboss.soa.esb.actions.scripting.ScriptingAction |
- JBoss ESB 4.8 には BSF 2.3.0 が含まれています。このバージョンは、BSF 2.4.0 に比べ言語サポートが少なくなっています (例えば、Groovy がない、非機能の Rhino など)。今後のバージョンには、Groovy と Rhino をサポートする BSF 2.4.0 が含まれる予定です。
- BSF はスクリプトをプリコンパイル、キャッシュ、および再使用する API を提供しません。このため、ScriptingAction のを実行するたびに再びコンパイルを行うことになります。パフォーマンス要件を評価する場合はこのことを考慮してください。
- アプリケーションに BeanShell スクリプトを含める場合は、.bsh の代わりに .beanshell 拡張子を使用することが推奨されます。.beanshell 拡張子を使用しないと、JBoss BSHDeployer がそのスクリプトを取得することがあります。
表12.14 ScriptingAction のプロパティ
| プロパティ | 説明 | 必須 |
|---|---|---|
| script |
スクリプトへのパス (クラスパス上)。
| |
| supportMessageBasedScripting |
メッセージ内でスクリプトの使用を許可します。
| |
| language |
オプションのスクリプト言語 (拡張機能の減少よりも優先されます)。
| No |
表12.15 ScriptingAction Processor Script Binding の変数
| 変数 | 説明 |
|---|---|
| message |
メッセージ
|
| payloadProxy |
メッセージペイロードのユーティリティ (MessagePayloadProxy)
|
| config |
アクション設定 (ConfigTree)
|
| logger |
ScriptingAction の静的な Log4J Logger (Logger)
|
例12.14 ScriptingAction
<action name="process" class="org.jboss.soa.esb.scripting.ScriptingAction">
<property name="script" value="/scripts/myscript.beanshell"/>
</action>12.4. サービス
12.4.1. EJBProcessor
| 入力タイプ | EJB のメソッド名とパラメータ |
| 出力タイプ | EJB 固有のオブジェクト |
| クラス | org.jboss.soa.esb.actions.EJBProcessor |
表12.16 EJBProcessor のプロパティ
| プロパティ | 説明 | 必須 |
|---|---|---|
| ejb3 |
これが EJB3.x セッション Bean の呼び出しの場合
| |
| ejb-name |
EJB の ID。ejb3 が true の場合はオプションです。
| |
| jndi-name |
関連する JNDI ルックアップです。
| |
| initial-context-factory |
JNDI ルックアップのメカニズムです。
| |
| provider-url |
関連するプロバイダです。
| |
| method |
呼び出す EJB メソッド名。
| |
| lazy-ejb-init |
EJB がデプロイメント時ではなくランタイム時に遅延して初期化されるべきかどうか。デフォルトは false。
| No |
| ejb-params |
メソッドを呼び出すときにメソッドが存在する入力メッセージの位置で使用するパラメーターの一覧。
| |
| esb-out-var |
出力の位置 (デフォルト値は DEFAULT_EJB_OUT)。
| No |
例12.15 EJB 2.x の設定例
<action name="EJBTest" class="org.jboss.soa.esb.actions.EJBProcessor">
<property name="ejb-name" value="MyBean" />
<property name="jndi-name" value="ejb/MyBean" />
<property name="initial-context-factory" value="org.jnp.interfaces.NamingContextFactory" />
<property name="provider-url" value="localhost:1099" />
<property name="method" value="login" />
<!-- Optional output location, defaults to "DEFAULT_EJB_OUT"
<property name="esb-out-var" value="MY_OUT_LOCATION"/> -->
<property name="ejb-params">
<!-- arguments of the operation and where to find them in the message -->
<arg0 type="java.lang.String">username</arg0>
<arg1 type="java.lang.String">password</arg1>
</property>
</action>例12.16 EJB 3.x の設定例
<action name="EJBTest" class="org.jboss.soa.esb.actions.EJBProcessor">
<property name="ejb3" value="true" />
<property name="jndi-name" value="ejb/MyBean" />
<property name="initial-context-factory" value="org.jnp.interfaces.NamingContextFactory" />
<property name="provider-url" value="localhost:1099" />
<property name="method" value="login" />
<!-- Optional output location, defaults to "DEFAULT_EJB_OUT"
<property name="esb-out-var" value="MY_OUT_LOCATION"/> -->
<property name="ejb-params">
<!-- arguments of the operation and where to find them in the message -->
<arg0 type="java.lang.String">username</arg0>
<arg1 type="java.lang.String">password</arg1>
</property>
</action>12.5. ルーティング
12.5.1. Aggregator
| クラス | org.jboss.soa.esb.actions.Aggregator |
[UUID] ":" [message-number] ":" [message-count]
表12.17 アグリゲータのプロパティ
| プロパティ | 説明 | 必須 |
|---|---|---|
| timeoutInMillis |
集約プロセスがタイムアウトするまでのミリ秒単位の時間です。
| No |
例12.17 設定例
<action class="org.jboss.soa.esb.actions.Aggregator" name="Aggregator">
<property name="timeoutInMillis" value="60000"/>
</action>
12.5.2. EchoRouter
12.5.3. HttpRouter
| クラス | org.jboss.soa.esb.actions.routing.http.HttpRouter |
表12.18 Apache Commons HttpRouter
| プロパティ | 説明 | 必須 |
|---|---|---|
| unwrap | true (デフォルト) の場合は送信前にメッセージオブジェクトからメッセージペイロードを抽出します。false の場合は、MessageType に従い、シリアライズされたメッセージを XML または Base64 でコンドードされた Java シリアライズオブジェクトとして送信します。
| No |
| endpointUrl |
メッセージが転送されるエンドポイント
| Yes |
| http-client-property |
HttpRouter は、HttpClientFactory を使用して HttpClient インスタンスを作成、設定します。ローカルのファイルシステム、クラスパス、URI でプロパティファイルを参照するファイルプロパティを使用することで、ファクトリ設定を指定します。これがどのように行われるか、以下の例を参照してください。ファクトリプロパティに関する詳細情報は、http://www.jboss.org/community/docs/DOC-9969 を参照してください。
| No |
| method |
現在 GET と POST のみのサポートです。
| Yes |
| responseType |
応答が返される形式を指定します。 STRING か BYTES になり、 デフォルト値は STRING です。
| No |
| headers |
リクエストに追加。複数の <header name="test" value="testvalue" /> 要素をサポートします。
| No |
| MappedHeaderList |
対象のエンドポイントに伝搬されるべきヘッダー名をコンマ区切りの一覧にしたもの。ヘッダーの値は、http-gateway から ESB に入るリクエストまたは、現在の ESB メッセージのプロパティ内にあるリクエストにある値をリトリーブします。
| No |
例12.18 設定例
<action name="httprouter" class="org.jboss.soa.esb.actions.routing.http.HttpRouter">
<property name="endpointUrl"value="http://host:80/blah">
<http-client-property name="file" value="/ht.props"/>
</property>
<property name="method" value="GET"/>
<property name="responseType" value="STRING"/>
<property name="headers">
<header name="blah" value="blahval" ></header>
</property>
</action>12.5.4. JMSRouter
| クラス | org.jboss.soa.esb.actions.routing.JMSRouter |
表12.19 JMSRouter
| プロパティ | 説明 | 必須 |
|---|---|---|
| unwrap | true の場合は送信前にメッセージオブジェクトからメッセージペイロードを抽出します。false (デフォルト値) の場合は、シリアル化されたメッセージオブジェクトが送信されます。
| No |
| jndi-context-factory |
使用する JNDI コンテキストファクトリ。デフォルト値は
org.jnp.interfaces.NamingContextFactory です。
| No |
| jndi-URL |
使用する JNDI URL。デフォルト値は
127.0.0.1:1099 です。
| No |
| jndi-pkg-prefix |
使用する JNDI 命名パッケージ接頭辞。デフォルト値は
org.jboss.naming:org.jnp.interfaces です。
| No |
| connection-factory |
使用する ConnectionFactory の名前です。 デフォルトは
ConnectionFactory です。
| No |
| persistent |
persistent: JMS DeliveryMody。
true (デフォルト値) または false を設定します。
| No |
| priority |
使用される JMS 優先度。デフォルト値は
javax.jms.Message.DEFAULT_PRIORITY です。
| No |
| time-to-live |
使用される JMS Time-To-Live。デフォルト値は
javax.jms.Message.DEFAULT_TIME_TO_LIVE です。
| No |
| security-principal |
JMS 接続の作成時に使用するセキュリティプリンシパル。
| Yes |
| security-credentials |
JMS 接続の作成時に使用するセキュリティクレデンシャル。
| Yes |
| property-strategy |
JMSPropertiesSetter interface の実装 (デフォルト値をオーバーライドする場合)。
| No |
| message-prop |
メッセージで設定されるプロパティには
message-prop という接頭辞が付けられます。
| No |
| jndi-prefixes |
コンマで区切った接頭辞の文字列。これら接頭辞を持つプロパティは JNDI 環境に追加されます。
| No |
| jndiName |
メッセージが送信されるべきキューまたはトピック名を定義します。
| No |
12.5.5. EmailRouter
| クラス | org.jboss.soa.esb.actions.routing.email.EmailRouter |
表12.20 EmailRouter プロパティ
| プロパティ | 説明 | 必須 |
|---|---|---|
| unwrap |
true の場合は送信前にメッセージオブジェクトからメッセージペイロードを抽出します。false (デフォルト値) の場合は、シリアル化されたメッセージオブジェクトが送信されます。
| |
| host |
SMTP サーバーのホスト名。指定されていない場合は、jbossesb-properties.xml のデフォルトプロパティ 'org.jboss.soa.esb.mail.smtp.host' が使用されます。
| |
| port |
SMTP サーバーのポート。指定されていない場合は、jbossesb-properties.xml のデフォルトプロパティ 'org.jboss.soa.esb.mail.smtp.port' が使用されます。
| |
| username |
SMTP サーバーのユーザー名。指定されていない場合は、jbossesb-properties.xml のデフォルトプロパティ 'org.jboss.soa.esb.mail.smtp.user' が使用されます。
| |
| password |
SMTP サーバーの上記ユーザー名に対するパスワード。指定されていない場合は、jbossesb-properties.xml のデフォルトプロパティ 'org.jboss.soa.esb.mail.smtp.password' が使用されます。
| |
| auth |
true の場合、AUTH command を使用してユーザー認証を試行します。指定されていない場合は、jbossesb-propertiesxml のデフォルトプロパティ 'org.jboss.soa.esb.mail.smtp.auth' が使用されます。
| |
| from |
送信元の e-メールアドレス
| |
| sendTo |
送信先の e-メールアカウント
| |
| subject |
E-メールの件名
| |
| messageAttachmentName |
メッセージペイロードを含む添付のファイル名 (オプション)。指定されない場合は、メッセージペイロードがメッセージボディに含まれます。
| |
| message |
電子メールメッセージを構成する ESB メッセージコンテンツに追加する文字列 (オプション)
| |
| ccTo |
カンマ区切り一覧形式の電子メールアドレス (オプション)
| |
| attachment |
送信メールに追加される添付ファイルを含む子要素
|
例12.19 設定例
<action name="send-email" class="org.jboss.soa.esb.actions.routing.email.EmailRouter">
<property name="unwrap" value="true" />
<property name="host" value="smtpHost" />
<property name="port" value="25" />
<property name="username" value="smtpUser" />
<property name="password" value="smtpPassword" />
<property name="from" value="jbossesb@xyz.com" />
<property name="sendTo" value="system2@xyz.com" />
<property name="subject" value="Message Subject" />
</action> 12.5.6. ContentBasedRouter
| クラス | org.jboss.soa.esb.actions.ContentBasedRouter |
- XPath: 単純な XPath ルール。アクションのインライン定義、または .properties 形式ファイルを外部から定義
- Drools: Drools ルールファイル (DSL)。XPath ベースの DSL に対する事前定義サポート
表12.21 ContentBasedRouter プロパティ
| プロパティ | 説明 | 必須 |
|---|---|---|
| cbrAlias |
コンテンツベースルーティングプロバイダーのエイリアス。対応値は、"Drools" (デフォルト)、 "Xpath"、"Regex"。
| |
| ruleSet |
外部定義のルールファイル。Drools ルールプロバイダーが使用されている場合は、Drools DSL ファイル。XPath または Regex プロバイダーが使用されている場合は、.properties ルールファイル。
| |
| ruleLanguage |
CBR 評価ドメイン固有言語 (DSL) ファイル。Drools ルールプロバイダーのみに該当
| |
| ruleReload |
ルールファイルを毎回再ロードするかどうかを示すフラグです。 デフォルトは “false” です。
| |
| ruleAuditType |
Drools に監査ロギングを実行させる任意のプロパティ。ログを Drools Eclipse プラグインに読み込ませ確認することができます。有効な値は CONSOLE、FILE、THREADED_FILE で、デフォルトでは監査ロギングが実行されます。
| |
| ruleAuditFile |
監査ロギングのファイルパスを定義する任意のプロパティ。FILE あるいは THREADED_FILE ruleAuditType のみに適用されます。デフォルトは "event" です。JBoss Drools は ".log" を自動で追加します。このファイルのデフォルトの場所は "." (現在の作業ディレクトリ、つまり JBoss では bin/ ディレクトリ) となっています。
| |
| ruleAuditInterval |
監査イベントを監査ログにフラッシュする頻度を定義する任意のプロパティ。これは THREADED_FILE ruleAuditType のみに適用されます。デフォルトは 1000 (ミリ秒) です。
| |
| destinations |
<route-to> 設定のコンテナープロパティ。ルールが外部定義される場合、この設定は以下の形式になります。
<route-to destination-name="express"
service-category="ExpressShipping" service-name="ExpressShippingService"/>
ルールが設定内にインライン定義されている場合、この設定は以下の形式を取ります (Drools プロバイダーへのサポートはなし)。
<route-to service-category="ExpressShipping"
service-name="ExpressShippingService" expression="/order[@statusCode='2']" />
| |
| namespaces |
XPath ルールプロバイダーなどで必要な <namespace> 設定のコンテナープロパティ。<namespace> 設定は以下の形式をとります。
<namespace prefix="ord" uri="http://acme.com/order" /> |
表12.22 ContentBasedRouter プロセスのメソッド
| プロパティ | 説明 | 必須 |
|---|---|---|
| process |
メッセージに集約データを追加しないでください。
|
12.5.7. StaticRouter
| クラス | org.jboss.soa.esb.actions.StaticRouter |
表12.23 StaticRouter のプロパティ
| プロパティ | 説明 |
|---|---|
| destinations |
<route-to> 構成のコンテナプロパティです。
<route-to destination-name="express" service-category="ExpressShipping"
service-name="ExpressShippingService"/>
|
表12.24 StaticRouter プロセスのメソッド
| method | 説明 |
|---|---|
process |
メッセージに集約データを追加しないでください。
|
例12.20 設定例 - StaticRouter
<action name="routeAction" class="org.jboss.soa.esb.actions.StaticRouter">
<property name="destinations">
<route-to service-category="ExpressShipping" service-name="ExpressShippingService"/>
<route-to service-category="NormalShipping" service-name="NormalShippingService"/>
</property>
</action>12.5.8. SyncServiceInvoker
| クラス | org.jboss.soa.esb.actions.SyncServiceInvoker |
表12.25 SyncServiceInvoker プロパティ
| プロパティ | 説明 | 必須 |
|---|---|---|
| service-category |
サービスカテゴリ
| Yes |
| service-name |
サービス名
| Yes |
| failOnException |
アクションが対象サービスの呼び出しからの例外で失敗させるかどうか。False に設定している場合は、アクションはパイプラインに入力メッセージを単に返して、サービス処理を継続できます。失敗のステータスを把握する必要がある場合は、このパラメーターを true に設定して、通常の "faultTo" の仕組みを使用してパイプラインが失敗できるようにします (デフォルトは true)。
| No |
| suspendTransaction |
このアクションは、トランザクションがアクティブな状態にある場合に実行されると失敗します。このプロパティを True に設定されている場合、トランザクションは一時停止される場合があります。デフォルトは、False です。
| No |
| ServiceInvokerTimeout |
呼び出しのタイムアウト (ミリ秒)。タイムアウトされると、例外が発生し "failOnException" 設定に従ったアクションが起こされます。デフォルトは 3000 です。
| No |
例12.21 設定例 - SyncServiceInvoker
<action name="route” class="org.jboss.soa.esb.actions.SyncServiceInvoker">
<property name="service-category" value="Services" />
<property name="service-name" value="OM" />
</action>12.5.9. StaticWireTap
| クラス | org.jboss.soa.esb.actions.StaticWireTap |
表12.26 StaticWireTap のプロパティ
| プロパティ | 説明 | 必須 |
|---|---|---|
| destinations |
<route-to> 構成のコンテナプロパティです。
<route-to destination-name="express" service-category="ExpressShipping"
service-name="ExpressShippingService"/>
|
表12.27 StaticWireTap プロセスのメソッド
| method | 説明 |
|---|---|
process |
メッセージに集約データを追加しないでください。
|
例12.22 設定例 - StaticWireTap
<action name="routeAction" class="org.jboss.soa.esb.actions.StaticWiretap">
<property name="destinations">
<route-to service-category="ExpressShipping" service-name="ExpressShippingService"/>
<route-to service-category="NormalShipping" service-name="NormalShippingService"/>
</property>
</action>12.5.10. Email WireTap
| クラス | org.jboss.soa.esb.actions.routing.email.EmailWiretap |
表12.28 Email WireTap プロパティ
| プロパティ | 説明 |
|---|---|
| host |
SMTP サーバーのホスト名。指定されていない場合は、jbossesb-properties.xml のデフォルトプロパティ 'org.jboss.soa.esb.mail.smtp.host' が使用されます。
|
| port |
SMTP サーバーのポート。指定されていない場合は、jbossesb-properties.xml のデフォルトプロパティ 'org.jboss.soa.esb.mail.smtp.port' が使用されます。
|
| username |
SMTP サーバーのユーザー名。指定されていない場合は、jbossesb-properties.xml のデフォルトプロパティ 'org.jboss.soa.esb.mail.smtp.user' が使用されます。
|
| password |
SMTP サーバーの上記ユーザー名に対するパスワード。指定されていない場合は、jbossesb-properties.xml のデフォルトプロパティ 'org.jboss.soa.esb.mail.smtp.password' が使用されます。
|
| auth |
true の場合、AUTH command を使用してユーザー認証を試行します。指定されていない場合は、jbossesb-propertiesxml のデフォルトプロパティ 'org.jboss.soa.esb.mail.smtp.auth' が使用されます。
|
| from |
送信元の e-メールアドレス
|
| sendTo |
送信先の e-メールアカウント
|
| subject |
E-メールの件名
|
| messageAttachmentName |
メッセージペイロードを含む添付のファイル名 (オプション)。指定されない場合は、メッセージペイロードがメッセージボディに含まれます。
|
| message |
電子メールメッセージを構成する ESB メッセージコンテンツに追加する文字列 (オプション).
|
| ccTo |
カンマ区切り一覧形式の電子メールアドレス (オプション)
|
| attachment |
送信メールに追加される添付ファイルを含む子要素
|
例12.23 設定例 - Email Wiretap
<action name="send-email" class="org.jboss.soa.esb.actions.routing.email.EmailWiretap">
<property name="host" value="smtpHost" />
<property name="port" value="25" />
<property name="username" value="smtpUser" />
<property name="password" value="smtpPassword" />
<property name="from" value="jbossesb@xyz.com" />
<property name="sendTo" value="systemX@xyz.com" />
<property name="subject" value="Important message" />
</action> 12.6. Notifier
| クラス | org.jboss.soa.esb.actions.Notifier |
例12.24 設定例 - Notifier
<action name="notify" class="org.jboss.soa.esb.actions.Notifier" okMethod="notifyOK">
<property name="destinations">
<NotificationList type="OK">
<target class="NotifyConsole" />
<target class="NotifyFiles" >
<file name="@results.dir@/goodresult.log" />
</target>
</NotificationList>
<NotificationList type="err">
<target class="NotifyConsole" />
<target class="NotifyFiles" >
<file name="@results.dir@/badresult.log" />
</target>
</NotificationList>
</property>
</action>12.6.1. NotifyConsole
| クラス | NotifyConsole |
例12.25 NotifyConsole
<target class="NotifyConsole" />
12.6.2. NotifyFiles
| クラス | NotifyFiles |
| 目的 | ESB メッセージのコンテンツを指定された一連のファイルに書き込むことによって通知を実行します。 |
| 属性 | なし |
| 子 | ファイル |
| 子属性 |
|
例12.26 NotifyFiles
<target class="NotifyFiles" > <file append="true" URI="anyValidURI"/> <file URI="anotherValidURI"/> </target>
12.6.3. NotifySqlTable
| クラス | NotifySqlTable |
| 目的 | 既存のデータベース表に記録を挿入することで通知を行います。 データベースの記録には ESB メッセージのコンテンツと、 オプションでネストされた <column> エレメントを使って指定される他の値が含まれます。 |
| 属性 |
|
| 子 | 列 |
| 子属性 |
|
例12.27 NotifySqlTable
<target class="NotifySqlTable" driver-class="com.mysql.jdbc.Driver" connection-url="jdbc:mysql://localhost/db" user-name="user" password="password" table="table" dataColumn="messageData"> <column name="aColumnlName" value="aColumnValue"/> </target>
12.6.4. NotifyQueues
| クラス | NotifyQueues |
| 目的 | ESB メッセージ (添付されたプロパティを含む) を JMS メッセージに変換し、JMS メッセージをキューのリストに送信することによって通知を実行します。追加のプロパティは <messageProp> エレメントを使用して添付できます。 |
| 属性 | なし |
| 子 | queue |
| 子属性 |
|
| 子 | messageProp |
| 子属性 |
|
例12.28 NotifyQueues
<target class="NotifyQueues" > <messageProp name="aNewProperty" value="theValue"/> <queue jndiName="queue/quickstarts_notifications_queue" /> </target>
12.6.5. NotifyTopics
| クラス | NotifyTopics |
| 目的 | ESB メッセージ (添付されたプロパティを含む) を JMS メッセージに変換し、JMS メッセージをトピックの一覧に公開することにより通知を実行します。追加のプロパティは <messageProp> エレメントを使用して添付できます。 |
| 属性 | なし |
| 子 | topic |
| 子属性 |
|
| 子 | messageProp |
| 子属性 |
|
例12.29 NotifyTopics
<target class="NotifyTopics" > <messageProp name="aNewProperty" value="theValue"/> <queue jndiName="queue/quickstarts_notifications_topic" /> </target>
12.6.6. NotifyEmail
| クラス | NotifyEmail |
| 目的 | ESB メッセージコンテンツ (オプションで任意の添付ファイルも) を含む電子メールを送信することにより通知を実行します。 |
| 属性 | なし |
| 子 | topic |
| 子属性 |
|
| 子 | 添付です。 Optional |
| 子テキスト | 添付されるファイルの名前 |
例12.30 NotifyEmail
<target class="NotifyEmail" from="person@somewhere.com" sendTo="person@elsewhere.com" subject="theSubject"> <attachment>attachThisFile.txt</attachment> </target>
12.6.7. NotifyFTP
| クラス | NotifyFTP |
| 目的 | ESB メッセージコンテンツを含むファイルを作成し、FTP を使用してリモートファイルシステムに転送することにより通知を実行します。 |
| 属性 | なし |
| 子 | ftp |
| 子属性 |
|
例12.31 NotifyFTP
<target class="NotifyFTP" >
<ftp URL="ftp://username:pwd@server.com/remote/dir" filename="someFile.txt" />
</target>12.6.8. NotifyFTPList
| クラス | NotifyFTPList |
| 目的 |
NotifyFTPList は NotifyFTP を継承し、単一のファイル名を取り、ESB メッセージオブジェクトにあるファイル名を一覧表示する機能を追加します。
メッセージペイロードにあるファイルには、ファイル一覧 (完全パス) が含まれている必要があります。この一覧は反復され、"listFiles" プロパティが false の場合、一覧内のファイルはすべて、設定された 配信先の FTP サーバーディレクトリに送信されます。"listFiles" プロパティが true の場合は、各行には変換予定のファイル名が含まれており、ファイルが一行ごとに読み込まれます。
そのため、以下を提供してください。
|
| 属性 | なし |
| 子 | ftp |
| 子属性 |
|
例12.32 NotifyFTP
<target class="NotifyFTPList">
<ftp URL="ftp://username:password@localhost/outputdir"
filename="{org.jboss.soa.esb.gateway.file}">
listFiles="true"
deletelistFile="true"
</target>12.6.9. NotifyTCP
| クラス | NotifyTCP |
| 目的 |
TCP 経由でメッセージ送信。各接続は通知の期間のみ保持されます。
文字列データペイロードの送信のみに対応。暗黙的 (文字列として)、またはバイトアレイとしてエンコード (byte[])
|
| 属性 | なし |
| 子 | デスティネーション (複数のデスティネーションに対応) |
| 子属性 |
|
例12.33 NotifyFTP
<target class="NotifyTcp" > <destination URI="tcp://myhost1.net:8899" /> <destination URI="tcp://myhost2.net:9988" /> </target>
12.7. Webservices/SOAP
12.7.1. SOAPProcessor
注記
12.7.1.1. SOAPProcessor アクション設定
<action name="JBossWSAdapter" class="org.jboss.soa.esb.actions.soap.SOAPProcessor">
<property name="jbossws-endpoint" value="ABI_OrderManager" />
<property name="jbossws-context" value="ABIV1OrderManager_war" />
<property name="rewrite-endpoint-url" value="true" />
</action>- jbossws-endpoint
- これは SOAPProcessor を公開する JBossWS エンドポイントです。必須。
- jbossws-context
- このオプションのプロパティは、Webservice のデプロイメントのコンテキスト名で、JBossWS エンドポイントを一意に特定するために使用することができます。
- rewrite-endpoint-url
- オプションの "rewrite-endpoint-url" プロパティは HTTP エンドポイントでの負荷分散をサポートします。この場合、Web サービスエンドポイントコンテナーは WSDL の HTTP(S) エンドポイントアドレスをロードバランサーのものに設定するよう構成されます。"rewrite-endpoint-url" プロパティは、このような状況で HTTP エンドポイントアドレスの書き換えを無効にするために使用できます。これは非 HTTP プロトコルには影響しません。デフォルトは true です。
12.7.1.2. 依存関係
- JBoss Application Server 4.2.3.GA
- soap.esb サービス。これはディストリビューションの lib フォルダーにあります。
12.7.1.3. Web サービスエンドポイントデプロイメント
12.7.1.3.1. エンドポイントの公開
12.7.2. SOAPClient
<action name="soap-wise-client-action" class="org.jboss.soa.esb.actions.soap.wise.SOAPClient">
<property name="wsdl" value="http://host:8080/OrderManagement?wsdl"/>
<property name="SOAPAction" value="http://host/OrderMgmt/SalesOrder"/>
</action>表12.29 SOAPClient オプションのプロパティ
| プロパティ | 説明 |
|---|---|
| wsdl |
使用される WSDL
|
| operationName |
webservice WSDL で指定したオペレーション名
|
| SOAPAction |
エンドポイントオペレーション。OperationName が優先されます。
|
| EndPointName |
起動された EndPoint。Web サービスは複数のエンドポイントを持つことができます。指定されない場合は、wsdl で最初に指定されたものが使用されます。
|
| SmooksRequestMapper |
要求に定義された java 対 java のマッピングを定義する smooks 設定ファイルを指定します。
|
| SmooksResponseMapper |
応答に対して定義された java 対 java のマッピングを定義するために smooks 設定ファイルを指定します。
|
| serviceName |
オブジェクト生成をキャッシュしたり、すでに生成されたオブジェクトを使用したりするために wise によって使用されるシンボル的なサービス名。提供されない場合、wise は wsdl のサーブレット名を使用します。
|
| username |
Web サービスが BASIC 認証 HTTP によって保護されている場合に使用されるユーザー名。
|
| password |
Web サービスが BASIC 認証 HTTP によって保護されている場合に使用されるパスワード。
|
| smooks-handler-config |
SOAP 要求または応答 (特にヘッダの) の変換が必要になることがよくあります。これは一部の標準 SOAP ハンドラを追加するだけで行えます。Wise は JAXWS Soap ハンドラ (smooks に基づいたカスタムのハンドラまたは事前定義されたハンドラ) をサポートします。
SOAP 要求の変換 (送信前) は SOAPClient アクションの Smooks 変換設定プロパティを設定することによってサポートされます。
|
| custom-handlers |
また、一連のカスタム標準 JAXWS Soap ハンドラを提供することもできます。このパラメータは SoapHandler インターフェースを実装するクラスの一覧を受け取ります。クラスは完全修飾名を提供し、セミコロンによって区切る必要があります。
|
| LoggingMessages |
送信された soap メッセージや受信された応答を参照することはデバッグに役立ちます。Wise は System.out. Boolean 値で交換されるすべてのメッセージを出力する JAX-WS ハンドラを使用することによってこの目的を達成します。
|
重要
- "WARN [SOAPClient] Received status code '500' on HTTP SOAP (POST) request to ....." を出力します。
- 不良を無視して、次のアクションに続くだけです。
12.7.2.1. SOAP 操作パラメーター
- デフォルトのボディ位置に設定された Map インスタンスとして使用されます (Message.getBody().add(Map))
- 名前付きボディ位置に設定された Map インスタンスとして使用されます (Message.getBody().add(String, Map))。ここで、ボディ位置の名前は "paramsLocation" アクションプロパティの値として指定されます。
- 任意のタイプの一連のオブジェクト。この場合は、Smooks 設定をアクション属性 SmooksRequestMapper で指定する必要があり、Smooks は java 対 java の変換に使用されます。
- 一連の文字列ベースのキー値ペア (<String, Object>)。ここでキーはキーの値が入力される wsdls (または生成されたクラス) で指定された SOAP パラメータの名前です。SOAP 応答メッセージ消費Consumption
- デフォルトのボディ位置 (Message.getBody().add(Map))
- 名前付きボディ位置 (Message.getBody().add(String, Map))。ここで、ボディ位置の名前は "responseLocation" アクションプロパティの値として指定されます。
- 一連の任意のタイプのオブジェクト。この場合は、smooks 設定をアクション属性 SmooksResponseMapper で指定する必要があり、smooks は java 対 java の変換に使用されます。
- 一連の文字列ベースのキー値ペア (<String, Object>)。ここで、キーはキーの値を入力する wsdls (または生成されたクラス) で指定された SOAP 回答の名前です。SOAP 要求/応答に対する JAX-WS ハンドラ
- webservice_consumer_wise は基本的な用途を示します。
- webservice_consumer_wise2 は、'SmooksRequestMapper' と 'SmooksResponseMapper' の使用方法を示します。
- webservice_consumer_wise3 は 'smooks-handler-config' の使用方法を示します。
- webservice_consomer_wise4 は 'custom-handlers' の用途を示します。
12.7.2.1.1. JAXB Annotation Introductions
12.7.2.2. クイックスタート
12.7.3. SOAPClient
12.7.3.1. エンドポイント操作の仕様
<action name="soapui-client-action" class="org.jboss.soa.esb.actions.soap.SOAPClient">
<property name="wsdl" value="http://localhost:18080/acme/services/RetailerCallback?wsdl"/>
<property name="operation" value="SendSalesOrderNotification"/>
</action>12.7.3.2. SOAP 要求メッセージの構築
- デフォルトのボディ位置に設定された Map インスタンスとして使用されます (Message.getBody().add(Map))
- 名前付きボディ位置の Map インスタンス (Message.getBody().add(String, Map))。ここで、そのボディ位置の名前は "get-payload-location" アクションプロパティの値として指定されます。
- OGNL フレームワークを使用してアクセスされる一連のオブジェクト (SOAP メッセージパラメーターに対する)。OGNL の使用の詳細については、以降で説明します。
- 文字列ベースのキー値ペア (<String, Object>)。ここで、キーはキーの値が入力される SOAP パラメーターを識別する OGNL 式です。OGNL の詳細については、以降で説明します。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cus="http://schemas.acme.com">
<soapenv:Header/>
<soapenv:Body>
<cus:customerOrder>
<cus:header>
<cus:customerNumber>123456</cus:customerNumber>
</cus:header>
</cus:customerOrder>
</soapenv:Body>
</soapenv:Envelope><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cus="http://schemas.active-endpoints.com/sample/customerorder/2006/04/CustomerOrder.xsd"
xmlns:stan="http://schemas.active-endpoints.com/sample/standardtypes/2006/04/StandardTypes.xsd">
<soapenv:Header/>
<soapenv:Body>
<cus:customerOrder>
<cus:items>
<cus:item>
<cus:partNumber>FLT16100</cus:partNumber>
<cus:description>Flat 16 feet 100 count</cus:description>
<cus:quantity>50</cus:quantity>
<cus:price>490.00</cus:price>
<cus:extensionAmount>24500.00</cus:extensionAmount>
</cus:item>
<cus:item>
<cus:partNumber>RND08065</cus:partNumber>
<cus:description>Round 8 feet 65 count</cus:description>
<cus:quantity>9</cus:quantity>
<cus:price>178.00</cus:price>
<cus:extensionAmount>7852.00</cus:extensionAmount>
</cus:item>
</cus:items>
</cus:customerOrder>
</soapenv:Body>
</soapenv:Envelope>12.7.3.3. SOAP 応答メッセージ消費
- デフォルトのボディ位置 (Message.getBody().add(Map))
- 名前付きボディ位置 (Message.getBody().add(String, Map))。ここでボディ位置の名前は "set-payload-location" アクションプロパティの値として指定されます。
- XStream ツールキットにより作成し、値が入力されるオブジェクトグラフ。また、JAXB と JAXB のアノテーション導入を使用して応答のアンマーシャル化のサポートを追加することも計画されています。
- 一連の文字列ベースのキー値ペア (<String, String>)。ここで、キーは SOAP 応答エレメントを識別する OGNL 式であり、値は SOAP メッセージからの値を表す文字列です。
- オプション 1 または 2 がアクション設定で指定されていない場合は、ロー SOAP 応答メッセージ (文字列) がメッセージに添付されます。
<action name="soapui-client-action" class="org.jboss.soa.esb.actions.soap.SOAPClient">
<property name="wsdl" value="http://localhost:18080/acme/services/RetailerService?wsdl"/>
<property name="operation" value="GetOrder"/>
<property name="get-payload-location" value="get-order-params" />
<property name="set-payload-location" value="get-order-response" />
<property name="responseXStreamConfig">
<alias name="customerOrder" class="com.acme.order.Order"
namespace="http://schemas.acme.com/services/CustomerOrder.xsd" />
<alias name="orderheader" class="com.acme.order.Header"
namespace="http://schemas.acme.com/services/CustomerOrder.xsd" />
<alias name="item" class="com.acme.order.OrderItem"
namespace="http://schemas.acme.com/services/CustomerOrder.xsd" />
</property>
</action><property name="responseXStreamConfig">
<fieldAlias name="header" class="com.acme.order.Order" fieldName="headerFieldName" />
<annotation class="com.acme.order.Order" />
</property><action name="soapui-client-action" class="org.jboss.soa.esb.actions.soap.SOAPClient">
<property name="wsdl" value="http://localhost:18080/acme/services/RetailerService?wsdl"/>
<property name="operation" value="GetOrder"/>
<property name="get-payload-location" value="get-order-params" />
<property name="set-payload-location" value="get-order-response" />
<property name="responseAsOgnlMap" value="true" />
</action>12.7.3.4. HttpClient 設定
<property name="wsdl" value="https://localhost:18443/active-bpel/services/RetailerCallback?wsdl">
<http-client-property name="file" value="/localhost-https-18443.properties" >
</http-client-property>
</property><property name="http-client-properties">
<http-client-property name="http.proxyHost" value="localhost"/>
<http-client-property name="http.proxyPort" value="8080"/>
</property>12.7.4. SOAPProxy
- クライアントとサービス間の疎結合を強化します。クライアントもサービスも相手の存在を認識していません。
- クライアントは、リモートサービスのホスト名 / IP アドレスへ直接接続できなくなります。
- クライアントは、インバウンド/アウトバウンドパラメーターを変更する修正済みの WSDL を確認します。少なくとも、クライアントが もとのプロキシ化されたエンドポイントではなく、ESB の公開するエンドポイントを参照するように、WSDL が微調整されます。
- SOAP エンベロープ/ボディの変換は、インバウンドのリクエストとアウトバウンドのレスポンス両方に対する ESB アクションチェーン経由で開始できます。
- クライアントが ESB にある 2 つ以上のプロキシエンドポイント (それぞれ、自身の WSDL または変換、ルーティング要件) に接続できるため、サービスのバージョニングが可能です。ESB は適切なメッセージを適切なエンドポイントに送信し、最終レスポンスを提供します。
- ContentBasedRouter 経由の複雑なコンテキストベースルーティング
- SOAPClient を使用して、ミラリングを行うわけではなく、外部の Web サービスを呼びだします。
- SOAPProducer は、内部デプロイされた JBoss WS サービスのみを実行します。
- HttpRouter は、簡単な WS プロキシ化には、過剰な手動設定が必要になります。
- EBWS は、SOAP エンベロープをストリッピングして、ボディにのみ渡します。
- Web サービスのプロデューサーおよびコンシューマーの両方となります。
- 必要なのは、外部 wsdl を参照するプロパティのみです。
- wsdl は、オプションの wsdlTransform プロパティを介して自動的に変換されます。
- SOAP は http とつながっているとされています。wsdl が読み込まれ、http トランスポートが定義されている場合は、それが使用されます。他のトランスポート (jms) についても検討が必要です。
- http を使用する場合、HttpRouter プロパティのいずれかがオプションでオーバーライドとして適用されます。
表12.30
| プロパティ | 説明 | 必須 |
|---|---|---|
| wsdlTransform |
柔軟な wsdl 変換ができるように <smooks-resource-list> xml 設定ファイル
| No |
| wsdlCharset |
UTF-8 でない場合、オリジナルの wsdl (インポートされたリソース) がエンコードされた文字セット。基盤のプラットフォームでサポートされたエンコーディングである場合、UTF-8 に変換されます。
| No |
| endpointUrl |
HttpRouter プロパティの例。ドメイン名を一致させることが SSL 証明書にとって重要な場合便利です。
| No |
| file |
Apache Commons HTTPClient プロパティファイル。SSL 経由で Web サービスへプロキシ化する場合に便利です。
| No |
| clientCredentialsRequired |
Basic 認証の認証情報がエンドクライアントから来る必要があるかどうか、ファイル内で指定された認証情報が代わりに使用されるかどうか。デフォルトは true です。
| No |
| wsdl |
WS エンドポイントが再書き込みされ、ESB からの新しい wsdl として公開されるオリジナルの wsdl url。
<definitions><service><port><soap:address ロケーション属性のプロトコルにあわせて、プロトコル固有の SOAPProxyTransport 実装を使用しています。
値は、5つの異種スキーマをベースに場所を参照します。
| Yes |
例12.34 設定例 - 基本的なシナリオ
<action name="proxy" class="org.jboss.soa.esb.actions.soap.proxy.SOAPProxy">
<property name="wsdl" value="http://host/foo/HelloWorldWS?wsdl"/>
</action>例12.35 設定例 - Basic 認証および SSL
<action name="proxy" class="org.jboss.soa.esb.actions.soap.proxy.SOAPProxy">
<property name="wsdl" value="https://host/foo/HelloWorldWS?wsdl"/>
<property name="endpointUrl" value="https://host/foo/HelloWorldWS"/>
<property name="file" value="/META-INF/httpclient-8443.properties"/>
<property name="clientCredentialsRequired" value="true"/>
</action>12.8. その他
12.8.1. SystemPrintln
System.out.println)。
| 入力タイプ | java.lang.String |
| クラス | org.jboss.soa.esb.actions.SystemPrintln |
| プロパティ |
|
例12.36 SystemPrintln
<action name="print-before" class="org.jboss.soa.esb.actions.SystemPrintln">
<property name="message" value="Message before action XXX" />
</action>12.8.2. SchemaValidationAction
| 入力タイプ | java.lang.String |
| クラス | org.jboss.soa.esb.actions.validation.SchemaValidationAction |
| プロパティ |
|
例12.37 SystemPrintln
<action name="val" class="org.jboss.soa.esb.actions.validation.SchemaValidationAction">
<property name="schema" value="/com/acme/validation/order.xsd"/>
</action>12.9. HttpClient 設定
# Configurators configurators=HttpProtocol,AuthBASIC # HttpProtocol config... protocol-socket-factory=org.apache.commons.httpclient.contrib.ssl.EasySSLProtocolSocketFactory keystore=/packages/jakarta-tomcat-5.0.28/conf/chap8.keystore keystore-passw=xxxxxx https.proxyHost=localhost https.proxyPort=443 # AuthBASIC config... auth-username=tomcat auth-password=tomcat authscope-host=localhost authscope-port=18443 authscope-realm=ActiveBPEL security realm
12.9.1. コンフィギュレーター
org.jboss.soa.esb.http.Configurator クラスの拡張、configure(HttpClient, Properties) メソッドの提供を行います。
表12.31 事前定義されたアクション
| コンフィギュレーター | 説明 | 必須 |
|---|---|---|
| HttpProtocol |
ソケットファクトリや SSL キーストア情報などの HttpClient ホスト、ポート、プロトコル情報の設定
| Yes |
| AuthBasic |
HttpClient に対する HTTP Basic 認証の設定
| No |
| AuthNTLM |
HttpClient に対する NTLM 認証の設定
| No |
12.9.1.1. HttpProtocol
表12.32 プロパティ
| プロパティ | 説明 | 必須 |
|---|---|---|
| HttpProtocol |
ソケットファクトリや SSL キーストア情報などの HttpClient ホスト、ポート、プロトコル情報の設定
| Yes |
| target-host-url |
http/https エンドポインの対象 URL
| Yes |
| https.proxyHost |
https 接続のプロキシホスト
| No |
| https.proxyPort |
Https 接続のプロキシポート、デフォルトのポートは 443
| No |
| http.proxyHost |
HTTP 接続のプロキシホスト
| No |
| http.proxyPort |
Http 接続のプロキシポート、デフォルトのポートは 80
| No |
| protocol-socket-factory |
ソケットファクトリのオーバーライド。
ProtocolSocketFactory または ProtocolSocketFactoryBuilder インターフェースの実装
http のデフォルト値は、httpclient
DefaultProtocolSocketFactory で、https のデフォルト値は、contributed StrictSSLProtocolSocketFactory です。
ESB コードベースで提供されている
ProtocolSocketFactoryBuilder の実装は、AuthSSLProtocolSocketFactoryBuilder と SelfSignedSSLProtocolSocketFactoryBuilder の 2 つです。それぞれ、AuthSSLProtocolSocketFactory ファクトリの設定と、自己署名の SSLContext を設定します。
| No |
| keystore |
キーストアの場所
| No |
| keystore-passw |
キーストアのパスワードまたは暗号化ファイル
| No |
| keystore-type |
キーストアのタイプ、デフォルトは jks
| No |
| truststore |
TrustStore の場所
| No |
| truststore-passw |
トラストストアのパスワードまたは暗号化ファイル
| No |
| truststore-type |
トラストストアのタイプ、デフォルトは jks
| No |
12.9.1.2. AuthBASIC
表12.33 プロパティ
| プロパティ | 説明 | 必須 |
|---|---|---|
| auth-username |
認証ユーザー名
| Yes |
| auth-password |
認証パスワード
| Yes |
| authscope-host |
認証スコープホスト
| Yes |
| authscope-port |
認証スコープポート
| Yes |
| authscope-domain |
認証スコープドメイン
| Yes |
12.9.1.3. AuthNTLM
表12.34 プロパティ
| プロパティ | 説明 | 必須 |
|---|---|---|
| ntauth-username |
認証ユーザー名
| Yes |
| ntauth-password |
認証パスワード
| Yes |
| ntauthscope-host |
認証スコープホスト
| Yes |
| ntauthscope-port |
認証スコープポート
| Yes |
| ntauthscope-domain |
認証スコープドメイン
| Yes |
| ntauthscope-realm |
認証スコープレルム
| No |
第13章 カスタムアクションの開発
- ライフサイクルアクション、
org.jboss.soa.esb.actions.ActionLifecycleまたはorg.jboss.soa.esb.actions.ActionPipelineProcessorを実装 - Java bean アクション、
org.jboss.soa.esb.actions.BeanConfiguredActionを実装 - 注釈付きのアクション
- レガシーアクション
- アクションがどのように設定されるか
- いつアクションがインスタンス化されるか、実装のスレッドセーフティについて
- ライフサイクルイベントの視覚性があるかどうか
- アクションメソッドが直接呼び出されるか、リフレクションで呼び出されるか
13.1. プロパティを使用したアクションの設定
PrintMessage アクションは出力内容を示す message という名前のプロパティや出力回数を示す repeatCount とうプロパティを受け取ることができます。多くの場合、jboss-esb.xml ファイル内のアクション設定は以下のようになります。
<action name="PrintAMessage" class="test.PrintMessage"> <property name="information" value="Hello World!" /> <property name="repeatCount" value="5" /> </action>
13.2. ライフサイクルアクション
org.jboss.soa.esb.actions.ActionLifecycle や org.jboss.soa.esb.actions.ActionPipelineProcessor) からきています。ActionLifecycle は、パイプラインライフサイクルメソッド (initialise と destroy) を実装し、ActionPipelineProcessor で process、processSuccess、processException などのメッセージ処理メソッドを含むようにこのインターフェースを拡張します。
initialise や destroy パイプラインのライフタイムの間、アクションがリソース管理を行えるように、メソッドをオーバーライドすることができます。たとえば、initialise メソッドで必要なリソースをキャッシュし、destroy メソッドで消去するなどです。
ConfigTree インスタンスを 1 つとるコンストラクターを定義する必要があります。これは、パイプライン内の特愛知のアクションの設定を表記します。
process メソッド以外の空のスタブメソッドを提供します。この 2 つのクラスは、org.jboss.soa.esb.actions.AbstractActionPipelineProcessor と org.jboss.soa.esb.actions.AbstractActionLifecycle で、以下のように使用できます。
public class ActionXXXProcessor extends AbstractActionPipelineProcessor {
public ActionXXXProcessor(final ConfigTree config) {
// extract configuration
}
public void initialise() throws ActionLifecycleException {
// Initialize resources...
}
public Message process(final Message message) throws ActionProcessingException {
// Process messages in a stateless fashion...
}
public void destroy() throws ActionLifecycleException {
// Cleanup resources...
}
}
13.3. Java Bean アクション
org.jboss.soa.esb.actions.BeanConfiguredAction マーカーインターフェースを実装する必要があります。たとえば、以下のクラスの動作は上記のものと同じです。
public class PrintMessage implements BeanConfiguredAction {
private String information;
private Integer repeatCount;
public setInformation(String information) {
this.information = information;
}
public setRepeatCount(Integer repeatCount) {
this.repeatCount = repeatCount;
}
public Message process(Message message) {
for (int i=0; i < repeatCount; i++) {
System.out.println(information);
}
}
}
注記
setRepeatCount() の Integer パラメーターは XML で指定された String 形式から自動的に変換されます。
BeanConfiguredAction メソッドは単純な引数を取るアクションに適しており、ConfigTree メソッドは XML 形式のデータを直接扱う必要がある場合に適しています
13.4. 注釈付きアクションクラス
action 実装をより簡単に構築できるアクションアノテーションがあります。これにより、インターフェースや抽象クラスの実装、ConfigTree タイプ (jboss-esb.xml ファイルの設定情報) の処理などの複雑な部分がなくなります。注釈付きアクションのインスタンスは、パイプラインごとにインスタンス化され (アクション毎の設定)、スレッドセーフでなければなりません。このパイプラインは常に、リフレクションを使用してアクションメソッドを使用して呼び出します。
- @Process
- @ConfigProperty
- @Initialize
- @Destroy
- @BodyParam
- @PropertyParam
- @AttachmentParam
- @OnSuccess
- @OnException
13.4.1. @Process
public class MyLogAction {
@Process
public void log(Message message) {
// log the message...
}
}
action としてクラスを特定します。クラス内に複数のメソッドがある場合、メッセージインスタンスを処理するのに使用するメソッドを特定します (または、メッセージの一部。これについては、@BodyParam、@PropertyParam and @AttachmentParam アノテーションの説明時に詳しくみていきます)。
action インスタンスを pipeline に設定するには、ロー/ベースレベルの action 実装と同じプロセスを使用します (AbstractActionPipelineProcessor を継承する、または ActionLifecycle を実装するもの、あるいはその他のサブタイプや抽象実装):
<service .....> <actions> <action name="logger" class="com.acme.actions.MyLogAction" /> </actions> </service>
action 実装が関連付けられている場合、process 属性を使用して、メッセージインスタンスの処理に使用するものはどれか指定します。
<service .....>
<actions>
<action name="logger" class="com.acme.actions.MyLogAction"
process="log" />
</actions>
</service>
13.4.2. @Process メソッドの戻り値
- void: これは、上記の Logger アクション実装にあるように、戻り値がないという意味です。
- message: これは ESB メッセージインスタンスです。
action pipeline上でアクティブな/現在のインスタンスになります。 - その他のタイプ。メソッドが ESB メッセージインスタンスを返さない場合、返されたオブジェクトインスタンスは、
action pipelineにある現在の ESB メッセージインスタンスに設定されます。メッセージがどこに設定されるかは、set-payload-location <action> 設定プロパティにより変わります。これは、通常のMessagePayloadProxyルールに従いデフォルト設定します。
13.4.3. @Process メソッドパラメーター
- メソッドパラメーターとして ESB メッセージインスタンスを指定
- 任意のパラメータータイプを 1 つ以上指定。Enterprise Service Bus フレームワークは、アクティブ/現在のパイプラインメッセージインスタンス内でそのタイプのデータを検索します。まず、メッセージボディ、次にプロパティ、最後に添付を検索し、そのパラメーターの値としてこのデータを渡します (該当するものが見つからない場合は
null)。
public class OrderPersister {
@Process
public OrderAck storeOrder(OrderHeader orderHeader,
OrderItems orderItems) {
// process the order parameters and return an ack...
}
}
OrderHeader や OrderItem オブジェクトインスタンスの作成や、現在のメッセージへの添付について pipeline の 1 つ前のアクションに左右されます (より現実的な実装では、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...
}
}
<actions>
<action name="decode" class="com.acme.orders.OrderDecoder" />
<action name="persist" class="com.acme.orders.OrderPersister" />
</actions>
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...
}
}
MessageDeliverException がスローされます。
13.4.4. @ConfigProperty
<action name="logger" class="com.acme.actions.MyLogAction">
<property name="logFile" value="logs/my-log.log" />
<property name="logLevel" value="DEBUG" />
</action>
AbstractActionPipelineProcessor の継承または、ActionLifecycle の実装)。これは、ConfigTree クラスと連携します (コンストラクター経由でアクションに提供します) 。アクションを実装するには、以下の手順に従います。
ConfigTreeインスタンスを提供するアクションクラスへコンストラクターを定義します。ConfigTreeインスタンスから該当のアクション設定プロパティをすべて取得します。- 必須のアクションプロパティを確認して、<action> 設定に指定されていない場所で例外をあげます。
- プロパティの全値を文字列 (
ConfigTreeで提供) から、アクション実装で使用される適切なタイプにデコーディングします。例えば、java.lang.Stringからjava.io.Fileに、java.lang.Stringから Boolean に、java.lang.Stringから long などにデコーディングします。 - 設定値が対象のプロパティタイプにデコーディングできない場合、例外を出します。
- 考えられる各種設定すべてに単体テストを実装して、さきほど表示したタスクが正しく完了するようにします。
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...
}
}
注記
ConfigTree クラスを処理したり、余分のコードを開発したりする必要がありません。
- フィールドの @ConfigProperty アノテーションで
use = Use.OPTIONALを指定 - フィールドの @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...
}
}
- name: これを使用して、アクションインスタンスで指定の名前のフィールドを生成する際に使用するアクション設定プロパティ名を明示的に指定します。
- choice: このフィールドを使用して、許容の設定値を制限します。これは、列挙型を使用することで可能です (LogLevel)
<action ...> <property name="log-file" value="logs/my-log.log" /> <property name="log-level" value="DEBUG" /> </action>
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...
}
}
13.4.5. プロパティの値のデコード
- プロパティタイプに単一引数の文字列コンストラクターがある場合、これを使用します。
- Primitive な場合、オブジェクトタイプの単一引数文字列コンストラクターを使用します。例えば、int の場合、整数のオブジェクトを使用します。
- 列挙型の場合
Enum.valueOfを使用して設定の文字列を列挙型の値に変換します。
13.4.6. @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...
}
}
注記
注記
注記
注記
ConfigTree パラメーターをオプションで指定可能です。これを行うと ConfigTree インスタンスを基本とするアクションにアクセスできるようになります。
13.4.7. @OnSuccess と @OnException
pipeline の中で、実行が成功した際、または失敗した際にこれらのメソッドを実行すべきか指定するため、これらのアノテーションを使用します。
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...
}
}
13.5. レガシーアクション
ConfigTreeパラメーターを 1 つとコンストラクターを提供することで、このアクションの設定を行います。- このパイプラインを経由するすべてのメッセージに対してインスタンス化されます。
- このアクションには、ライフサイクルメソッドの情報はありません。
processメソッドの呼び出しは、常にリフレクションで行われます。
第14章 コネクターおよびアダプター
14.1. はじめに
注記
14.2. ゲートウェイ
- ゲートウェイクラスはファイル、JMS メッセージ、SQL テーブルなどに含まれる任意のオブジェクトを取得できる一方で (各「ゲートウェイクラス」は特定のトランスポートに特化されています)、JBossESB リスナーはこのドキュメントの「メッセージ」セクションで説明されたように JBossESB 正規化メッセージのみを処理できます。ただし、これらのメッセージには任意のデータを含めることができます。
- 「メッセージ作成」アクションを実行するには 1 つのアクションクラスのみが呼び出されます。ESB リスナーはアクション処理パイプラインを実行できます。
- 「取得される」オブジェクトは ESB メッセージオブジェクトを返す単一の「compose クラス」 (アクション) を呼び出すために使用されます (このオブジェクトは ESB 対応サービスであるターゲットサービスに配信されます)。設定時に定義されたターゲットサービスはレジストリによって実行時に EPR (または EPR の一覧) に変換されます。基礎となるコンセプトはレジストリによって返された EPR は ESB メッセージのヘッダに含まれる 'toEPR' と類似するということですが、受信オブジェクトは「ESB 非対応」であり、toEPR を動的に決定することができないため、この値は設定時にゲートウェイに提供され、すべての送信メッセージに含まれます。
FileGateway は file-filter-class 設定属性を受け入れ、ゲートウェイが使用するファイルを選択する際に使用する FileFilter 実装を定義できるようになります。インスタンスが org.jboss.soa.esb.listeners.gateway.FileGatewayListener.FileFilterInit のタイプの場合、ユーザー定義の FileFilter インスタンスは、ゲートウェイが初期化します。この場合、init メソッドが呼び出され、ゲートウェイ ConfigTree インスタンスに渡されます。
FileFilter 実装が定義され、FileGateway により使用されます。あるいは、入力サフィックスがない場合、作業サフィックス、エラーサフィックス、ポストサフィックスと一致しない限り、どのファイルでも受け入れられます。
14.2.1. ゲートウェイデータマッピング
- 入力メッセージが JMS TextMessage である場合は、関連付けられた String がデフォルトで指定されたボディ部分に置かれます。ObjectMessage または BytesMessage である場合、コンテンツは Body 部分で指定された BytesBody.BYTES_LOCATION 内に置かれます。
- ローカルファイルゲートウェイ: コンテンツは BytesBody.BYTES_LOCATION で指定された Body 部分内に置かれます。
- Hibernate ゲートウェイ: コンテンツは ListenerTagNames.HIBERNATE_OBJECT_DATA_TAG で指定されたボディ部分内に置かれます。
- リモートファイルゲートウェイ: コンテンツは BytesBody.BYTES_LOCATION で指定されたボディ部分内に置かれます。
注記
14.2.2. ゲートウェイデータマッピングの変更方法
org.jboss.soa.esb.listeners.message.MessageComposerインターフェースのインスタンスは変換を行います。デフォルトの動作を変更するには、独自の compose メソッドと decompose メソッドを定義する適切な実装を提供します。新しいMessageComposer実装は composer-class 属性名を使用して設定ファイルで提供する必要があります。- これらの実装は作成クラスを定義するために反射的な方法を使用します。独自のメッセージ composer クラスを提供し、どのインスタンスを使用するかをゲートウェイに通知するために設定ファイルで composer-class 属性名を使用します。メッセージが必要な場合はクラスのどの操作を呼び出すかをゲートウェイに通知するために composer-process 属性を使用できます。このメソッドはオブジェクトを受け取り、メッセージを返す必要があります。指定されていない場合は、プロセスのデフォルト名が使用されます。
注記
14.3. JCA を介した接続
org.jboss.soa.esb.listeners.jca.InflowGateway クラスを実装する必要がある Java クラスです。
public interface InflowGateway
{
public void setServiceInvoker(ServiceInvoker invoker);
}
public class JmsEndpoint implements InflowGateway, MessageListener
{
private ServiceInvoker service;
private PackageJmsMessageContents transformer = new PackageJmsMessageContents();
public void setServiceInvoker(ServiceInvoker invoker)
{
this.service = invoker;
}
public void onMessage(Message message)
{
try
{
org.jboss.soa.esb.message.Message esbMessage = transformer.process(message);
service.deliverAsync(esbMessage);
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
}
ServiceInvoker を作成し、エンドポイントクラスの setServiceInvoker メソッドを呼び出します。次に ESB は JCA エンドポイントを有効にし、エンドポイントクラスインスタンスがメッセージを受信できる状態になります。JmsEndpoint の例では、インスタンスが JMS メッセージを受け取り ESB メッセージタイプに変換し、ターゲットサービスで呼び出す ServiceInvoker インスタンスを使用します。
注記
org.jboss.soa.esb.listeners.jca.JmsEndpoint 下に存在する状態で提供されます。このクラスを任意の JMS JCA インフローアダプタとともに何度も使用することができます。
14.3.1. 構成
jboss-esb.xml ファイルに設定されます。以下に例を示します。
<service category="HelloWorld_ActionESB"
name="SimpleListener"
description="Hello World">
<listeners>
<jca-gateway name="JMS-JCA-Gateway"
adapter="jms-ra.rar"
endpointClass="org.jboss.soa.esb.listeners.jca.JmsEndpoint">
<activation-config>
<property name="destinationType" value="javax.jms.Queue"/>
<property name="destination" value="queue/esb_gateway_channel"/>
</activation-config>
</jca-gateway>
...
</service>
<service category="HelloWorld_ActionESB"
name="SimpleListener"
description="Hello World">
<listeners>
<jca-gateway name="JMS-JCA-Gateway"
adapter="jms-ra.rar"
endpointClass="org.jboss.soa.esb.listeners.jca.JmsEndpoint">
<activation-config>
<property name="destinationType" value="javax.jms.Queue"/>
<property name="destination" value="queue/esb_gateway_channel"/>
</activation-config>
</jca-gateway>
...
</service>
表14.1 jca-gateway 設定属性
| 属性 | 必須 | 説明 |
|---|---|---|
| name | yes | ゲートウェイの名前 |
| アダプタ | yes | 使用しているアダプタの名前。JBoss では、デプロイした RAR のファイル名 (jms-ra.rar など) になります。 |
| endpointClass | yes | エンドポイントクラスの名前 |
| messagingType | no | アダプタのメッセージインターフェース。指定しない場合は、ESB がエンドポイントクラスに基づいた名前を付けます。 |
| 実行済み | no | デフォルトでは真に設定されます。JTA トランザクション内でメッセージを呼び出すかどうかを設定します。 |
14.3.2. 標準のアクティベーションプロパティのマッピング
表14.2 標準アクティベーションプロパティのマッピング
| 属性 | Location | 説明 |
|---|---|---|
| maxThreads | jms-listener | 同時に処理できる最大メッセージ数 |
| dest-name | jms-message-filter | JMS 宛先名 |
| dest-type | jms-message-filter | JMS 宛先タイプ、QUEUE または TOPIC |
| selector | jms-message-filter | JMS メッセージセレクター |
| providerAdapterJNDI | jms-jca-provider | プロバイダーアダプターの JNDI ロケーションは、JCA インフローが使用してリモートの JMS プロバイダーにアクセスできます。これは、JBoss 固有のインターフェースで、デフォルトの JCA インフローアダプターによりサポートされていますが、必要であれば、他のインフローアダプターによる使用も可能です。 |
ActivationMapper は、jbossesb-properties.xml ファイルを使うことでグローバルに指定されます。指定の JCA アダプターに使用するデフォルトのマッパーを定義します。設定するプロパティ名は org.jboss.soa.esb.jca.activation.mapper."adapter name"” で、値は ActivationMapper のクラス名です。
jms-ra.rar) のアクティベーション仕様でプロパティをマッピングする際に使用するデフォルトの ActivationMapper の設定を示しています。
<properties name="jca">
<property name="org.jboss.soa.esb.jca.activation.mapper.jms-ra.rar"
value="org.jboss.soa.esb.listeners.jca.JBossActivationMapper"/>
</properties>
<jms-listener name="listener" busidref="bus" maxThreads="100">
<property name="jcaActivationMapper" value="TestActivationMapper"/>
</jms-listener>
<jms-bus busid="bus">
<property name="jcaActivationMapper" value="TestActivationMapper"/>
<jms-message-filter dest-type="TOPIC" dest-name="DestName"/>
</jms-bus>
<jms-jca-provider name="provider" connection-factory="ConnectionFactory">
<property name="jcaActivationMapper" value="TestActivationMapper"/>
<jms-bus busid="bus">
<jms-message-filter dest-type="TOPIC" dest-name="DestName"/>
</jms-bus>
</jms-jca-provider>
付録A 付録 A: JAXB Annotation Introduction 設定の記述
- @XmlType (https://jaxb.dev.java.net/nonav/2.1.3/docs/api/javax/xml/bind/annotation/XmlType.html): “Class” 要素
- @XmlElement (https://jaxb.dev.java.net/nonav/2.1.3/docs/api/javax/xml/bind/annotation/XmlElement.html): Field” と “Method” 要素
- @XmlAttribute (https://jaxb.dev.java.net/nonav/2.1.3/docs/api/javax/xml/bind/annotation/XmlAttribute.html): “Field” と “Method” 要素
<?xml version = "1.0" encoding = "UTF-8"?>
<jaxb-intros xmlns="http://www.jboss.org/xsd/jaxb/intros">
<!--
The type namespaces on the customerOrder are
different from the rest of the message...
-->
<Class name="com.activebpel.ordermanagement.CustomerOrder">
<XmlType propOrder="orderDate,name,address,items" />
<Field name="orderDate">
<XmlAttribute name="date" required="true" />
</Field>
<Method name="getXYZ">
<XmlElement
namespace="http://org.jboss.esb/quickstarts/bpel/ABI_OrderManager"
nillable="true" />
</Method>
</Class>
<!-- More general namespace config for the rest of the message... -->
<Class name="com.activebpel.ordermanagement.*">
<Method name="get.*">
<XmlElement namespace="http://ordermanagement.activebpel.com/jaws" />
</Method>
</Class>
</jaxb-intros>付録B 添付資料 B: サービス指向アーキテクチャーの概要
- ミドルウェアプラットフォームに関係する者の間で同意が必要になります。
- これらの関係者間には暗黙的な (場合によっては明示的な) 信頼の欠如が存在します。
- ビジネスデータは機密性が高く、想定された受信者のみによって参照されるべきです。
- 組織間の対話処理では従来のミドルウェアで前提としていたことの多くが無効です。たとえば、トランザクションは長時間 (数時間または数日) 継続するため、2 フェーズコミットなどの従来のトランザクションプロトコルは適用できません。
- パートナと簡単に接続することにより、新しいビジネスチャンスが生まれます。
- ソフトウェア開発の時間を削減し、他の企業によって作成されたサービスを使用することにより時間とお金を削減します。
- 独自のサービスを簡単に利用できるようにすることにより収益ストリームが増加します。
B.1. SOA とは
- コスト削減: サービス同士が対話する方法によって達成されます。直接的なコスト効果は、向上した処理の生産性、効果的なソースオプション、現在のコストを可変モデルにシフトする大幅に拡張された機能をによってもたらされます。
- 標準に基づいた手法をとることにより、組織は以前よりも非常に迅速かつ簡単に情報/ビジネスプロセスを接続および共有できるようになります。標準的なフレームワークとインターフェースを提供することにより開発者の役割が単純化され IT 導入の生産性が大幅に向上します。個別機能の統合負荷を緩和し、環境内で高速な導入テクニックを適用することにより導入時間は大幅に短縮されます。
- Web サービスを使用すると、新しいビジネスモデルを実現でき新しいビジネスチャンスが生み出されます。Web サービスは従来の機能と利益に基づく方法とは大きく異なり価値と離散的なリターンを測定できる機能を提供します。通常の TCO (総所有コスト) モデルでは過去の投資から生まれた生涯の価値が考慮されません。コスト中心のこの観点により、これらの過去の投資を活用する多くのチャンスが失われ、結果的にほとんどの企業が必要性からではなく予見されたニーズのためにアーキテクチャーで冗長性を構築することになってしまいます。これらの同じ組織はインフラストラクチャーのオーバーヘッドによって調整されたアプリケーションのポートフォリオに IT 投資の価値を見出します。Web サービスに基づいた方法では、過去の IT 投資の生涯貢献度が考慮され、計画的なシステムの置き換えではなくこれらの投資の発展が促進されます。
- ビジネスアナリストはビジネスドメインの知識を増やしつつ開発ライフサイクルの高位の仕事に集中できます。
- 複数のチームが取り組むことができるコンポーネントベースのサービスに機能を分けることによって並列開発が可能になります。
- 品質保証や単体テストが効率的になります。エラーは開発ライフサイクルの初期に検出できます。
- 開発チームはリスクを増やさずに初期の要件から内容を変更することもできます。
- アーキテクチャー内のコンポーネントは再利用可能な資産でありその部品を再び作成する必要はありません。
- サービスの機能分解やビジネスプロセス関連の基盤コンポーネントで、柔軟性、今後の管理や統合のしやすさを保ちます。
- セキュリティルールはサービスレベルで実装されるため、企業内の多くのセキュリティ懸念事項を解決できます。
B.2. SOA の基本
- サービスプロバイダ
- サービスプロバイダはサービスへのアクセスを許可し、サービスの説明を作成し、サービスブローカに公開します。
- サービスリクエスター
- サービスリクエスターはサービスブローカーによって提供されたサービスの説明を検索することによってサービスを探します。また、リクエスタはサービスプロバイダーによって提供されるサービスにバインドします。
- サービスブローカ
- サービスブローカーはサービスの説明のレジストリをホストし、リクエスターをサービスプロバイダに関連付けます。
B.3. SOA の利点
B.3.1. 相互運用性
B.3.2. 効率性
B.3.3. 標準化
B.3.4. ステートフルおよびステートレスサービス
付録C 参考資料
推奨資料
Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions. 0321200683. Addison-Wesley Professional .
Enterprise Service Oriented Architectures. 140203704X. Springer .
Open Source SOA. 1933988541. Manning Publications Co .
SOA Design Patterns. 0136135161. Prentice Hall PTR .
付録D GNU General Public License 2.0
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
付録E 改訂履歴
| 改訂履歴 | |||||||
|---|---|---|---|---|---|---|---|
| 改訂 5.2.0-0.1.400 | 2013-10-31 | ||||||
| |||||||
| 改訂 5.2.0-0.1 | Tue Feb 5 2013 | ||||||
| |||||||
| 改訂 5.2.0-0 | Tue Jun 14 2011 | ||||||
| |||||||
| 改訂 5.1.0-0 | Mon Mar 7 2011 | ||||||
| |||||||
| 改訂 5.0.2-0 | Fri Jun 11 2010 | ||||||
| |||||||
| 改訂 5.0.1-0 | Tue Apr 20 2010 | ||||||
| |||||||
| 改訂 5.0.0-0 | Tue Feb 23 2010 | ||||||
| |||||||
