ESB Mule NIO
MINA を元にしたプロトコル用のトランスポートです。
特長:
- 長期間接続する場合、永久接続する場合、大量データを転送する場合、ストリーミングする場合などの有効なプロトコルです
- スレッド利用を最適化しています(全てのコネクションを複数のスレッドで管理)
- Minaライブラリを使っているために、Minaを使ってシステムとESB Muleの統合を容易にします。
- Minaが急速に発展して、性能も改善されています。このようなMinaの改善はこのトランスポートにも反映されます。
 |
このページはまだ作成中です。 |
クイック・スタート
ESB MuleからMinaプロトコルは簡単に使えます。
エンドポイント・アドレスの接頭辞を「mina://」にし、protoclFactoryプロパティを指定します:
<inbound-router>
<endpoint name="simpleProtocolIn" address="mina:>
<properties>
<property name="protocolFactory" value="org.mule.providers.mina.codec.codecs.SimpleTextLineCodecFactory" />
</properties>
</endpoint>
</inbound-router>
上の例は、localhostのポート8888を使ってサーバを起動します(アドレス・プロパティにmina://localhost:8888と指定されているため)。
「protocolFactory」の定義も含まれています。指定されたクラスは、接続されたクライアントから受信したバイト・ストリームをコード・ディコードします。この例では、トランスポートから提供されているcodecを使うように指定しています。
例
簡単なテストを行うには、以下のESB Mule設定を利用してESB Muleを起動します:
<mule-descriptor name="SimpleProtocol" implementation="org.mule.components.simple.EchoComponent">
<inbound-router>
<endpoint address="mina: synchronous="true">
<properties>
<property name="protocolFactory" value="org.mule.providers.mina.codec.codecs.SimpleTextLineCodecFactory" />
</properties>
</endpoint>
</inbound-router>
</mule-descriptor>
ESB Muleを起動して、putty(コネクション・タイプ:raw)又はnetcatを使ってlocalhost:8888に接続します。文字列を入力して「Enter」キーを押下します。入力した文字列が戻されて表示します。
非同期通信
前の例では、ポートを監視し、改行区切りのメッセージを受取る、山びこコンポーネントを作成しました。簡単なように聞こえるけど、実際にはかなり強力です。この例に問題なく多く(千単位)のクライアントを接続することが可能です。多くのクライアントを接続できる理由は、Minaは接続クライアント毎に新しいスレッドを生成しないかれです。その結果、トランスポートが同時管理できるコネクション数を制限することが不要になります。
ただし、例で多くのクライアント接続が可能な理由は、EchoComponentが簡単でCPUをそんなに使わないからです(ディスクI/OやデータベースI/Oもありません)。
実際の多くのコンポーネントはI/O処理をするため、スレッドが待機します。I/O処理が終わるまで、他スレッドは待機することになります。
多くのコンポーネントはネットワーク及びディスクを利用するため、スレッドの待機を回避するためには、別の方法が必要です。
解決は簡単です:
<mule-descriptor name="SimpleProtocol" implementation="org.mule.components.simple.EchoComponent">
<inbound-router>
<endpoint address="mina: synchronous="false">
<properties>
<property name="protocolFactory" value="org.mule.providers.mina.codec.codecs.SimpleTextLineCodecFactory" />
</properties>
</endpoint>
</inbound-router>
<outbound-router>
<router className="org.mule.routing.outbound.OutboundPassThroughRouter">
<endpoint address="mina: />
</router>
</outbound-router>
</mule-descriptor>
ただ、「synchronous="false"」と設定し、受信ルータ(inbound-router)と送信ルータ(outbound-router)に同じアドレスを設定します。この設定により、コンポーネントは非同期で呼び出され、Minaが使っているスレッドと別のスレッドで接続されます。
非同期処理の場合は、リクエストとレスポンスが分離されているために、送信ルータ(outbound-router)も定義する必要があります。もっと正確に言うと、リクエスト-レスポンスはありません - ディスパッチのみがあります。
サーバに接続されているクライアントがメッセージを送信すると、ESB Muleは関連したイベントを発行しますが、返事を待ちません。返事が予測される場合は、正しくクライアントの戻るようにルートを設定する必要があります。
勿論、受信(inbound)エンドポイントと送信(outbound)エンドポイントの間に多くのコンポーネントを置くことができます:
<mule-descriptor name="SimpleProtocol" implementation="org.mule.components.simple.EchoComponent">
<inbound-router>
<endpoint address="mina: synchronous="false">
<properties>
<property name="protocolFactory" value="org.mule.providers.mina.codec.codecs.SimpleTextLineCodecFactory" />
</properties>
</endpoint>
</inbound-router>
<outbound-router>
<router className="org.mule.routing.outbound.OutboundPassThroughRouter">
<endpoint address="vm: />
</router>
</outbound-router>
</mule-descriptor>
<mule-descriptor name="One" implementation="org.mule.components.simple.BridgeComponent"
inboundEndpoint="vm: outboundEndpoint="vm://two" />
<mule-descriptor name="Two" implementation="org.mule.components.simple.BridgeComponent"
inboundEndpoint="vm: outboundEndpoint="vm://three" />
<mule-descriptor name="Three" implementation="org.mule.components.simple.BridgeComponent"
inboundEndpoint="vm: outboundEndpoint="mina://localhost:8889" />
この例では、送信ルータ(outbound-router)を「vm://one」に置き換えました。最後のコンポーネント(「Three」)のoutboundEndpointに注目してください - 最終的にクライアントへレスポンスを返します。
メッセージは次のように転送されます:接続されているクライアント -> Mina -> SimpleProtocolコンポーネント -> One Component -> Two Component -> Three Component -> Mina -> 接続されているコンポーネント。
同期対非同期
TODO
設定
TODO
作者
Marco D'Alia - minamule at madarco .it
www.madarco.net