Fuse 6 is no longer supported
As of February 2025, Red Hat Fuse 6 is no longer supported. If you are using Fuse 6, please upgrade to Red Hat build of Apache Camel.第118章 Netty4
Netty4 コンポーネント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Camel の Netty4 コンポーネントは、Netty プロジェクトバージョン 4 に基づくソケット通信コンポーネントです。Netty は NIO クライアントサーバーフレームワークです。これにより、プロトコルサーバーやクライアントなどの
netwServerInitializerFactoryork
アプリケーションを迅速かつ簡単に開発できます。Netty4 は、TCP や UDP ソケットサーバーなどのネットワークプログラミングを大幅に簡素化および合理化します。
この Camel コンポーネントは、プロデューサーとコンシューマーエンドポイントの両方をサポートします。
Netty コンポーネントには複数のオプションがあり、多くの TCP/UDP 通信パラメーター(バッファーサイズ、keepAlive、tcpNoDelay など)を詳細に制御し、Camel ルートでの In-Only および In-Out の両方の通信を容易にします。
Maven ユーザーは、このコンポーネントの以下の依存関係を
pom.xml
に追加する必要があります。
Camel on EAP デプロイメント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
このコンポーネントは、Red Hat JBoss Enterprise Application Platform (JBoss EAP) コンテナー上で簡素化されたデプロイメントモデルを提供する Camel on EAP (Wildfly Camel) フレームワークによってサポートされます。このモデルの詳細は、Deploying into a Web Server の Apache Camel on JBoss EAP の章を参照してください。
URI 形式 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
netty コンポーネントの URI スキームは以下のとおりです。
netty4:tcp://localhost:99999[?options] netty4:udp://remotehost:99999/[?options]
netty4:tcp://localhost:99999[?options]
netty4:udp://remotehost:99999/[?options]
このコンポーネントは、TCP と UDP の両方のプロデューサーおよびコンシューマーエンドポイントをサポートします。
以下の形式で URI にクエリーオプションを追加できます。
?option=value&option=value&...
オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
名前
|
デフォルト値
|
説明
|
---|---|---|
keepAlive
|
true
|
非アクティブのためにソケットが閉じられないように設定
|
tcpNoDelay
|
true
|
TCP プロトコルパフォーマンスを改善するための設定
|
backlog
|
|
netty コンシューマー(サーバー)にバックログを設定できます。バックログは、OS に応じてベストエフォートであることに注意してください。このオプションを
200 、500 または 1000 などの値に設定すると、TCP スタックはaccept キューの長さを指定します。このオプションが設定されていない場合、バックログは OS の設定によって異なります。
|
broadcast
|
false
|
UDP でマルチキャストを選択するための設定
|
connectTimeout
|
10000
|
ソケット接続が利用可能になるまでの待機時間。値はミリ秒単位です。
|
reuseAddress
|
true
|
ソケット多重化を容易にするための設定
|
sync
|
true
|
エンドポイントを一方向または request-response として設定するための設定
|
synchronous
|
false
|
|
ssl
|
false
|
SSL 暗号化をこのエンドポイントに適用するかどうかを指定するための設定
|
sslClientCertHeaders
|
false
|
有効および SSL モードの場合、Netty コンシューマーはサブジェクト名、発行者名、シリアル番号、有効な日付範囲などのクライアント証明書に関する情報で Camel Message を補完します。
|
sendBufferSize
|
65536 bytes
|
アウトバウンド通信中に使用される TCP/UDP バッファーサイズ。サイズはバイトです。
|
receiveBufferSize
|
65536 bytes
|
インバウンド通信中に使用される TCP/UDP バッファーサイズ。サイズはバイトです。
|
option.XXX
|
null
|
"option." を接頭辞として使用して、追加の netty オプションを設定できます。たとえば、"option.child.keepAlive=false" は netty オプション "child.keepAlive=false" を設定します。使用可能なオプションについては、Netty のドキュメントを参照してください。
|
corePoolSize
|
10
|
コンポーネントの起動時に割り当てられるスレッドの数。デフォルトは 10 です。注記: このオプションは Camel 2.9.2 以降から削除されます。Netty のデフォルト設定に依存するため、
|
maxPoolSize
|
100
|
このエンドポイントに割り当てることができるスレッドの最大数。デフォルトは 100 です。注記: このオプションは Camel 2.9.2 以降から削除されます。Netty のデフォルト設定に依存するため、
|
disconnect
|
false
|
使用直後に Netty チャネルから切断(閉じる)するかどうか。コンシューマーとプロデューサーの両方に使用できます。
|
lazyChannelCreation
|
true
|
チャネルは、Camel プロデューサーの開始時にリモートサーバーが稼働していない場合に例外を回避するために遅延して作成できます。
|
transferExchange
|
false
|
TCP にのみ使用されます。ボディーだけでなく、ネットワーク経由でエクスチェンジを転送することができます。以下のフィールドは転送されます:ボディー、Out body、Fault ボディー、In headers、Out ヘッダー、Fault ヘッダー、エクスチェンジプロパティー、エクスチェンジ例外。これには、オブジェクトがシリアライズ可能である必要があります。Camel はシリアル化できないオブジェクトを除外し、WARN レベルでログに記録します。
|
disconnectOnNoReply
|
true
|
sync が有効になっている場合、このオプションは NettyConsumer を指示します。この場合、返信の応答がない場合、このオプションは NettyConsumer を切断します。
|
noReplyLogLevel
|
WARN
|
sync が有効になっている場合、このオプションは NettyConsumer を決定し、送信応答がない場合に使用するロギングレベルを指定します。値:
FATAL, ERROR, INFO, DEBUG, OFF
|
serverExceptionCaughtLogLevel
|
WARN
|
サーバー(NettyConsumer)が例外をキャッチする場合、このロギングレベルを使用してログに記録されます。
|
serverClosedChannelExceptionCaughtLogLevel
|
DEBUG
|
サーバー(NettyConsumer)が
java.nio.channels.ClosedChannelException をキャッチすると、このログレベルを使用してログに記録されます。これは、クライアントが突然切断され、Netty サーバーで閉じられた例外が発生する可能性があるため、閉じられたチャンネル例外を記録しないようにするために使用されます。
|
allowDefaultCodec
|
true
|
netty コンポーネントは、エンコーダー/ダンダーが null で、テキストラインが false の場合にデフォルトのコーデックをインストールします。allowDefaultCodec を false に設定すると、netty コンポーネントがフィルターチェーンの最初の要素としてデフォルトの codec をインストールできなくなります。
|
textline
|
false
|
TCP にのみ使用されます。codec が指定されていない場合、このフラグを使用してテキスト行ベースのコーデックを示すことができます。指定されていない場合、または値が false の場合、Object Serialization は TCP 経由で想定されます。
|
delimiter
|
LINE
|
テキストラインコーデックに使用する区切り文字。使用できる値は
LINE および NULL です。
|
decoderMaxLineLength
|
1024
|
テキストラインコーデックに使用する最大行の長さ。
|
autoAppendDelimiter
|
true
|
テキストラインコーデックを使用して送信する際に、不足している終了区切り文字を自動追加するかどうか。
|
encoding
|
null
|
テキストラインコーデックに使用するエンコーディング(文字セット名)。指定しない場合、Camel は JVM のデフォルト Charset を使用します。
|
workerCount
|
null
|
netty が nio モードで機能する場合、Netty は cpu_core_threads*2 のデフォルトの workerCount パラメーターを使用します。ユーザーはこの操作を使用して Netty からデフォルトの workerCount を上書きできます。
|
sslContextParameters
|
null
|
org.apache.camel.util.jsse.SSLContextParameters インスタンスを使用した SSL 設定。Security Guide および Using the JSSE Configuration Utility の Configuring Transport Security for Camel Components の章 を参照してください。
|
receiveBufferSizePredictor
|
null
|
バッファーサイズ予測を設定します。詳細は Jetty のドキュメント および この メールスレッド を参照してください。
|
requestTimeout
|
0
|
リモートサーバーを呼び出すときに Netty プロデューサーのタイムアウトを使用できます。デフォルトでは、タイムアウトは使用されません。値はミリ秒単位です。
requestTimeout は Netty の ReadTimeoutHandler を使用してタイムアウトをトリガーします。Camel 2.16、2.12.1.3: は、CamelNettyRequestTimeout ヘッダーを設定してこの設定を上書きすることもできます。
|
needClientAuth
|
false
|
SSL の使用時にサーバーがクライアント認証を必要とするかどうかを設定します。
|
usingExecutorService
|
true
|
executorService を使用して camel ルート内でメッセージを処理するかどうかは、executorService を NettyComponent から設定できます。
|
maximumPoolSize
|
16
|
順序付けされたスレッドプールが使用されている場合のコアプールサイズ。注記: これは 、Camel 2.15 から 2.14.1 以降
NettyComponent レベルに設定できます。
|
producerPoolEnabled
|
true
|
プロデューサーのみ。プロデューサープールが有効かどうか。重要: 同時実行性と信頼できるリクエスト/リプライを処理するのにプーリングが必要になるため、この機能をオフにしないでください。
|
producerPoolMaxActive
|
-1
|
プロデューサーのみ。プールが割り当てることができるオブジェクト数の上限を設定します(クライアントに対してチェックするか、チェックアウトをアイドリングします)。制限なしには負の値を使用してください。
|
producerPoolMinIdle
|
0
|
プロデューサーのみ。エビクタースレッド(アクティブな場合)が新しいオブジェクトを生成する前に、プロデューサープールで許可されるインスタンスの最小数を設定します。
|
producerPoolMaxIdle
|
100
|
プロデューサーのみ。プール内のアイドリングインスタンスの数の上限を設定します。
|
producerPoolMinEvictableIdle
|
300000
|
プロデューサーのみ。アイドルオブジェクトのエビクターによるエビクションの対象となる前に、オブジェクトがプールでアイドル状態にある可能性のある最小時間(ミリ秒単位)を設定します。
|
bootstrapConfiguration
|
null
|
コンシューマーのみ。
org.apache.camel.component.netty4.NettyServerBootstrapConfiguration インスタンスを使用して Netty ServerBootstrap オプションを設定できます。これは、複数のコンシューマーで同じ設定を再利用するために使用できます。これにより、設定をより簡単に調整できます。
|
bossGroup
|
null
|
boss スレッドプールとして明示的な
io.netty.channel.EventLoopGroup を使用します。たとえば、スレッドプールを複数のコンシューマーと共有するには、以下を実行します。デフォルトでは、各コンシューマーには 1 コアスレッドを持つ独自の boss プールがあります。
|
workerGroup
|
null
|
明示的な
io.netty.channel.EventLoopGroup をワーカースレッドプールとして使用するには、以下を実行します。たとえば、スレッドプールを複数のコンシューマーと共有するには、以下を実行します。デフォルトでは、各コンシューマーには 2 x cpu count コアスレッドを持つ独自のワーカープールがあります。
|
channelGroup
|
null
|
Camel 2.17: 明示的な io.netty.channel.group.ChannelGroup を使用して、メッセージを複数のチャネルに広げるには。
|
networkInterface
|
null
|
コンシューマーのみ。UDP を使用する場合、このオプションを使用して、マルチキャストグループに参加する
eth0 などの名前でネットワークインターフェイスを指定できます。
|
clientInitializerFactory
|
null
|
Camel 2.15: カスタムクライアントイニシャライザーファクトリーを使用して、チャネルのパイプラインを制御します。詳細につていは以下をご覧ください |
serverInitializerFactory
|
null
|
Camel 2.15: カスタムサーバーイニシャライザーファクトリーを使用して、チャネルのパイプラインを制御します。詳細につていは以下をご覧ください |
clientPipelineFactory
|
null
|
非推奨: 代わりに clientInitializerFactory を使用してください。
|
serverPipelineFactory
|
null
|
非推奨: 代わりに serverInitializerFactory を使用してください。
|
udpConnectionlessSending
|
false
|
Camel 2.15: プロデューサーのみ。このオプションは、接続なしの UDP 送信をサポートします。これは genuine fire-and-forget です。UDP 送信試行は、PortUnreachableException 例外を受け取ります(受信ポートでリッスンしているものがない場合)。
|
clientMode
|
false
|
Camel 2.15: コンシューマーのみ。clientMode が true の場合、Netty コンシューマーは TCP クライアントとしてアドレスに接続します。
|
reconnect
|
true
|
Camel 2.16: コンシューマーのみ。コンシューマーで clientMode でのみ使用され、コンシューマーは切断時に自動的に再接続を試みます。
|
reconnectInterval
|
10000
|
Camel 2.16: コンシューマーのみ。reconnect および clientMode が有効な場合に使用されます。再接続を試行する間隔(ミリ秒単位)。
|
useByteBuf
|
false
|
Camel 2.16: プロデューサーのみ。useByteBuf が true の場合、Netty プロデューサーはメッセージ本文を ByteBuf に変換してから送信してください。
|
udpByteArrayCodec
|
false
|
Camel 2.16: UDP プロトコルを使用すると、このオプションを true にすると、デフォルトのオブジェクトシリアル化コーデックではなく、バイト配列としてデータが送信されます。
|
reuseChannel
|
false
|
Camel 2.17: プロデューサーのみ。このオプションを使用すると、プロデューサーはエクスチェンジの処理ライフサイクルで同じ Netty チャネルを再利用できます。これは、Camel ルートでサーバーを複数回呼び出す必要があり、同じネットワーク接続を使用する場合に使用できます。これを使用する場合、エクスチェンジが完了するまでチャンネルは接続プールに戻されません。disconnect オプションが true に設定されている場合は切断されます。再利用された Channel は、鍵 NettyConstants#NETTY_CHANNEL を使用してエクスチェンジプロパティーとしてエクスチェンジプロパティーとして保存されます。これにより、ルーティング中にチャネルを取得して使用することができます。
|
レジストリーベースのオプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Codec ハンドラーおよび SSL キーストアは、Spring XML ファイルの など、レジストリー に登録できます。渡すことができる値は次のとおりです。
名前
|
説明
|
---|---|
passphrase
|
SSH を使用して送信されたペイロードの暗号化/復号化に使用するパスワード設定
|
keyStoreFormat
|
ペイロードの暗号化に使用されるキーストア形式。設定されていない場合、デフォルトは JKS です。
|
securityProvider
|
ペイロードの暗号化に使用するセキュリティープロバイダー。設定されていない場合、デフォルトは SunX509 です。
|
keyStoreFile
|
非推奨: 暗号化に使用されるクライアント側の証明書キーストア
|
trustStoreFile
|
非推奨: 暗号化に使用されるサーバー側の証明書キーストア
|
keyStoreResource
|
Camel 2.11.1: 暗号化に使用されるクライアント側の証明書キーストア。はクラスパスからデフォルトでロードされますが、別のシステムからリソースを読み込むには、
"classpath:" 、"file:" 、または "http:" の接頭辞を付けることができます。
|
trustStoreResource
|
Camel 2.11.1: 暗号化に使用されるサーバー側の証明書キーストア。はクラスパスからデフォルトでロードされますが、別のシステムからリソースを読み込むには、
"classpath:" 、"file:" 、または "http:" の接頭辞を付けることができます。
|
sslHandler
|
SSL ハンドラーを返すために使用できるクラスへの参照
|
encoder
|
アウトバウンドペイロードの特別なマーシャリングを実行するために使用できるカスタム
ChannelHandler クラス。io.netty.channel.ChannelInboundHandlerAdapter を上書きする必要があります。
|
encoders
|
使用するエンコーダーのリスト。コンマ区切りの値を持つ文字列を使用し、値をレジストリー で検索でき ます。Camel がルックアップする必要があることを認識できるように、値の前に # を付けることを忘れないでください。
|
decoder
|
インバウンドペイロードの特別なマーシャリングを実行するために使用できるカスタム
ChannelHandler クラス。io.netty.channel.ChannelOutboundHandlerAdapter を上書きする必要があります。
|
decoders
|
使用するデコーダーのリスト。コンマ区切りの値を持つ文字列を使用し、値をレジストリー で検索でき ます。Camel がルックアップする必要があることを認識できるように、値の前に # を付けることを忘れないでください。
|
重要: 共有不可能なエンコーダー/デコーダーの使用について以下をお読みください。
共有不可能なエンコーダーまたはデコーダーの使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
エンコーダーまたはデコーダーが共有できない場合(たとえば、@Shareable クラスアノテーションがある場合)、エンコーダー/デコーダーは
org.apache.camel.component.netty.ChannelHandlerFactory
インターフェイスを実装し、newChannelHandler
メソッドで新規インスタンスを返します。これにより、エンコーダー/デコーダーを安全に使用できるようになります。そうでない場合、Netty コンポーネントはエンドポイントの作成時に WARN をログに記録します。
Netty コンポーネントは、
org.apache.camel.component.netty.ChannelHandlerFactories
ファクトリークラスを提供します。このクラスには、一般的に使用されるメソッドが多数あります。
Netty エンドポイントとの間でメッセージを送信する リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Netty プロデューサー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Producer モードでは、コンポーネントは TCP または UDP プロトコル(オプションの SSL サポートあり)を使用して、ソケットエンドポイントにペイロードを送信する機能を提供します。
プロデューサーモードは、一方向および要求応答ベースの操作の両方をサポートします。
Netty コンシューマー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Consumer モードでは、コンポーネントは以下を行う機能を提供します。
- TCP または UDP プロトコル(任意の SSL サポートあり)を使用して、指定したソケットでリッスンします。
- text/xml、バイナリー、およびシリアライズされたオブジェクトベースのペイロードを使用して、ソケットで要求を受信します。
- それらをメッセージ交換としてルートに送信します。
コンシューマーモードは、一方向および要求応答ベースの操作の両方をサポートします。
使用例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Request-Reply およびシリアライズされたオブジェクトペイロードを使用した UDP Netty エンドポイント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
一方向通信を使用した TCP ベースの Netty コンシューマーエンドポイント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
複数のコーデックの使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
特定のケースでは、エンコーダーとデコーダーのチェーンを netty パイプラインに追加する必要がある場合があります。multpile codecs を camel netty エンドポイントに追加するには、encoders およびdecoders URI パラメーターを使用する必要があります。encoder パラメーターおよびdecoder パラメーターと同様に、パイプラインに追加する必要のある ChannelUpstreamHandlers および ChannelDownstreamHandlers のリストへの参照を提供するために使用されます。エンコーダーを指定すると、デコーダーやデコーダーパラメーターと同様にエンコーダーパラメーターが無視されます。
重要
共有不可能なエンコーダー/デコーダーの使用について、上記を参照してください。
エンドポイントの作成時に解決できるように、コーデックのリストを Camel のレジストリーに追加する必要があります。
Spring のネイティブコレクションサポートを使用して、アプリケーションコンテキストでコーデックリストを指定できます。
Bean 名は、コンマ区切りリストとして、または List に含めるか、netty エンドポイント定義で使用できます。
from("direct:multiple-codec").to("netty4:tcp://localhost:{{port}}?encoders=#encoders&sync=false"); from("netty4:tcp://localhost:{{port}}?decoders=#length-decoder,#string-decoder&sync=false").to("mock:multiple-codec");
from("direct:multiple-codec").to("netty4:tcp://localhost:{{port}}?encoders=#encoders&sync=false");
from("netty4:tcp://localhost:{{port}}?decoders=#length-decoder,#string-decoder&sync=false").to("mock:multiple-codec");
または spring を使用します。
完了したらチャンネルを閉じる リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
サーバーとして動作する場合は、クライアントの変換が終了する場合などにチャネルを閉じることがあります。これは、エンドポイントのオプション
disconnect=true
を設定するだけで実行できます。
ただし、以下のようにメッセージごとに Camel に指示することもできます。Camel に対してチャネルを閉じるよう指示するには、
CamelNettyCloseChannelWhenComplete
キーが true
のヘッダーをブール値 値に追加する必要があります。たとえば、以下の例では、bye メッセージをクライアントに書き戻した後にチャンネルを閉じます。
作成されたパイプラインを完全に制御するためのカスタムチャネルパイプラインファクトリーの追加 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
カスタムチャネルパイプラインは、カスタムハンドラーを挿入してハンドラー/インターセプターチェーンを完全に制御します。これは、Netty Endpoint URL で指定しなくても、エンコーダーとデコーダーを簡単に指定します。
カスタムパイプラインを追加するには、カスタムチャネルパイプラインファクトリーを作成し、コンテキストレジストリー(JNDIRegistry、または camel-spring ApplicationContextRegistry など)でコンテキストに登録する必要があります。
カスタムパイプラインファクトリーは以下のように構築する必要があります。
- Producer リンクされたチャネルパイプラインファクトリーは、抽象クラス
ClientInitializerFactory
を拡張する必要があります。 - Consumer linked チャネルパイプラインファクトリーは、抽象クラス
ServerInitializerFactory
を拡張する必要があります。 - クラスは、
initChannel()
メソッドをオーバーライドして、カスタムハンドラー、エンコーダー、およびデコーダーを挿入する必要があります。initChannel()
メソッドをオーバーライドしない場合は、ハンドラー、エンコーダー、またはデコーダーがないパイプラインを作成し、パイプラインにワイヤリングします。
以下の例は、
ServerInitializerFactory
ファクトリーを作成する方法を示しています。
例118.1 サーバーイニシャライザーファクトリーの使用
カスタムサーバーイニシャライザーファクトリーをレジストリーに追加し、以下のように Camel ルートでインスタンス化/活用できます。
Netty boss およびワーカースレッドプールの再利用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Camel 2.12 以降で利用可能
Netty には boss と worker の 2 種類のスレッドプールがあります。デフォルトでは、各 Netty コンシューマーおよびプロデューサーにはプライベートスレッドプールがあります。複数のコンシューマーまたはプロデューサー間でこれらのスレッドプールを再利用する場合は、スレッドプールを作成し、レジストリー に登録する必要があり ます。
たとえば、Spring XML を使用する場合は、以下のように 2 つのワーカースレッドを持つ
NettyWorkerPoolBuilder
を使用して共有ワーカースレッドプールを作成できます。
ヒント
boss スレッドプールの場合、Netty コンシューマーの
org.apache.camel.component.netty4.NettyServerBossPoolBuilder
ビルダーがあり、Netty が生成する org.apache.camel.component.netty4.NettyClientBossPoolBuilder
があります。
Camel ルートでは、以下のように URI で
workerPool
オプションを設定することで、このワーカープールを参照できます。
<route> <from uri="netty4:tcp://localhost:5021?textline=true&sync=true&workerPool=#sharedPool&usingExecutorService=false"/> <to uri="log:result"/> ... </route>
<route>
<from uri="netty4:tcp://localhost:5021?textline=true&sync=true&workerPool=#sharedPool&usingExecutorService=false"/>
<to uri="log:result"/>
...
</route>
別のルートがある場合は、共有ワーカープールを参照できます。
<route> <from uri="netty4:tcp://localhost:5022?textline=true&sync=true&workerPool=#sharedPool&usingExecutorService=false"/> <to uri="log:result"/> ... </route>
<route>
<from uri="netty4:tcp://localhost:5022?textline=true&sync=true&workerPool=#sharedPool&usingExecutorService=false"/>
<to uri="log:result"/>
...
</route>
... など。