第117章 Netty


Netty コンポーネント

重要
Camel Netty コンポーネントは JBoss Fuse 6.3 以降非推奨となり、今後のリリースで削除されます。代わりに新しい Camel Netty4 コンポーネントの使用に切り替える必要があります。
Camel 2.3 の時点で利用可能
Camel の Netty コンポーネントは、Netty プロジェクトに基づくソケット通信コンポーネントです。Netty は NIO クライアントサーバーフレームワークです。これにより、プロトコルサーバーやクライアントなどのネットワークアプリケーションを迅速かつ簡単に開発できます。Netty は、TCP や UDP ソケットサーバーなどのネットワークプログラミングを大幅に簡素化および合理化します。
ヒント
新しい Netty 4 を使用する Netty4 コンポーネントがあります。このコンポーネントは古い Netty 3 ライブラリーを使用するため、このコンポーネントを使用することが推奨されます。
この Camel コンポーネントは、プロデューサーとコンシューマーエンドポイントの両方をサポートします。
Netty コンポーネントには複数のオプションがあり、多くの TCP/UDP 通信パラメーター(バッファーサイズ、keepAlive、tcpNoDelay など)を詳細に制御し、Camel ルートでの In-Only および In-Out の両方の通信を容易にします。
Maven ユーザーは、このコンポーネントの pom.xml に以下の依存関係を追加する必要があります。
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-netty</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
Copy to Clipboard Toggle word wrap

URI 形式

netty コンポーネントの URI スキームは以下のとおりです。
netty:tcp://localhost:99999[?options]
netty:udp://remotehost:99999/[?options]
Copy to Clipboard Toggle word wrap
このコンポーネントは、TCP と UDP の両方のプロデューサーおよびコンシューマーエンドポイントをサポートします。
URI にクエリーオプションは ?option=value&option=value&.. の形式で追加できます。

オプション

Expand
名前 デフォルト値 説明
keepAlive true 非アクティブのためにソケットが閉じられないように設定
tcpNoDelay true TCP プロトコルパフォーマンスを改善するための設定
backlog Camel 2.9.6/2.10.4/2.11: netty コンシューマー(server)のバックログを設定できます。バックログは、OS に応じてベストエフォートであることに注意してください。このオプションを 2005001000 などの値に設定すると、TCP スタックは accept キューが何であるかを示します。このオプションが設定されていない場合、バックログは OS の設定によって異なります。
broadcast false UDP でマルチキャストを選択するための設定
connectTimeout 10000 ソケット接続が利用可能になるまでの待機時間。値はミリ秒単位です。
reuseAddress true ソケット多重化を容易にするための設定
sync true エンドポイントを一方向または request-response として設定するための設定
同期 false Camel 2.10: 非同期ルーティングエンジンが使用さ れていないかどうか。その 非同期ルーティングエンジンが使用さ れ、true は同期処理を強制的に実行します。
ssl false SSL 暗号化をこのエンドポイントに適用するかどうかを指定するための設定
sslClientCertHeaders false Camel 2.12: 有効および SSL モードの場合、Netty コンシューマーはサブジェクト名、発行者名、シリアル番号、有効な日付範囲などのクライアント証明書が含まれるヘッダーで Camel メッセージ を強化します。
sendBufferSize 65536 バイト アウトバウンド通信中に使用される TCP/UDP バッファーサイズ。サイズはバイトです。
receiveBufferSize 65536 バイト インバウンド通信中に使用される TCP/UDP バッファーサイズ。サイズはバイトです。
option.XXX null Camel 2.11/2.10.4: 接頭辞として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 Camel 2.11.1: サーバー(NettyConsumer)が例外をキャッチする場合、このロギングレベルを使用してログに記録されます。
serverClosedChannelExceptionCaughtLogLevel DEBUG Camel 2.11.1: サーバー(NettyConsumer)が java.nio.channels.ClosedChannelException を取得する場合、このロギングレベルを使用してログに記録されます。これは、クライアントが突然切断され、Netty サーバーで閉じられた例外が発生する可能性があるため、閉じられたチャンネル例外を記録しないようにするために使用されます。
allowDefaultCodec true Camel 2.4: netty コンポーネントは、エンコーダー/ダンダーの両方が null で、テキストラインが false の場合にデフォルトのコーデックをインストールします。allowDefaultCodec を false に設定すると、netty コンポーネントがフィルターチェーンの最初の要素としてデフォルトの codec をインストールできなくなります。
textline false Camel 2.4: TCP にのみ使用されます。codec が指定されていない場合、このフラグを使用してテキスト行ベースのコーデックを示すことができます。指定されていない場合、または値が false の場合、Object Serialization は TCP 経由で想定されます。
delimiter LINE Camel 2.4: テキストラインコーデックに使用する区切り文字。使用できる値は LINE および NULL です。
decoderMaxLineLength 1024 Camel 2.4: テキストラインコーデックに使用する最大行の長さ。
autoAppendDelimiter true Camel 2.4: テキストラインコーデックを使用して送信する際に、不足している終了区切り文字を自動追加するかどうか。
encoding null Camel 2.4: テキストラインコーデックに使用するエンコーディング(文字セット名)。指定しない場合、Camel は JVM のデフォルト Charset を使用します。
workerCount null Camel 2.9: netty が nio モードで動作している場合、Netty は cpu_core_threads*2 である Netty のデフォルトの workerCount パラメーターを使用します。ユーザーはこの操作を使用して Netty からデフォルトの workerCount を上書きできます。
sslContextParameters null Camel 2.9: org.apache.camel.util.jsse.SSLContextParameters インスタンスを使用した SSL 設定。Using the JSSE Configuration Utility を参照してください。
receiveBufferSizePredictor null Camel 2.9: バッファーサイズ予測を設定します。詳細は Jetty のドキュメント および この メールスレッド を参照してください。
requestTimeout 0 Camel 2.11.1: リモートサーバーを呼び出すときに Netty プロデューサーのタイムアウトを使用できます。デフォルトでは、タイムアウトは使用されません。値はミリ秒単位です。requestTimeout オプションは Netty の ReadTimeoutHandler を使用してタイムアウトをトリガーします。Camel 2.16、2.12.1.3: は、CamelNettyRequestTimeout ヘッダーを設定してこの設定を上書きすることもできます。
needClientAuth false Camel 2.11: SSL の使用時にサーバーがクライアント認証を必要とするかどうかを設定します。
orderedThreadPoolExecutor true Camel 2.10.2: 順序付けされたスレッドプールを使用して、イベントが同じチャネルで順番に処理されるかどうか。詳細は、org.jboss.netty.handler.execution.OrderedMemoryAwareThreadPoolExecutor の netty javadoc の詳細を参照してください。
maximumPoolSize 16 Camel 2.10.2: 順序付けされたスレッドプールが使用されている場合のコアプールサイズ。
producerPoolEnabled true Camel 2.10.4/Camel 2.11: プロデューサーのみ。プロデューサープールが有効かどうか。重要: 同時実行性と信頼できるリクエスト/リプライを処理するのにプーリングが必要になるため、この機能をオフにしないでください。
producerPoolMaxActive -1 Camel 2.10.3: プロデューサーのみ。プールが割り当てることができるオブジェクト数の上限を設定します(クライアントに対してチェックするか、チェックアウトをアイドリングします)。制限なしには負の値を使用してください。
producerPoolMinIdle 0 Camel 2.10.3: プロデューサーのみ。エビクタースレッド(アクティブな場合)が新しいオブジェクトを生成する前に、プロデューサープールで許可されるインスタンスの最小数を設定します。
producerPoolMaxIdle 100 Camel 2.10.3: プロデューサーのみ。プール内のアイドリングインスタンスの数の上限を設定します。
producerPoolMinEvictableIdle 300000 Camel 2.10.3: プロデューサーのみ。アイドルオブジェクトのエビクターによるエビクションの対象となる前に、オブジェクトがプールでアイドル状態にある可能性のある最小時間(ミリ秒単位)を設定します。
bootstrapConfiguration null Camel 2.12: コンシューマーのみ。org.apache.camel.component.netty.NettyServerBootstrapConfiguration インスタンスを使用して Netty ServerBootstrap オプションを設定できます。これは、複数のコンシューマーで同じ設定を再利用するために使用できます。これにより、設定をより簡単に調整できます。
bossGroup null Camel 2.12: 明示的な org.jboss.netty.channel.socket.nio.BossPool を boss スレッドプールとして使用する。たとえば、スレッドプールを複数のコンシューマーと共有するには、以下を実行します。デフォルトでは、各コンシューマーには 1 コアスレッドを持つ独自の boss プールがあります。
workerGroup null Camel 2.12: 明示的な org.jboss.netty.channel.socket.nio.WorkerPool をワーカースレッドプールとして使用する。たとえば、スレッドプールを複数のコンシューマーと共有するには、以下を実行します。デフォルトでは、各コンシューマーには 2 x cpu count コアスレッドを持つ独自のワーカープールがあります。
channelGroup null Camel 2.17: 明示的な io.netty.channel.group.ChannelGroupを使用して、メッセージを複数のチャネルに広げるには。
networkInterface null Camel 2.12: コンシューマーのみ。UDP を使用する場合、このオプションを使用して、マルチキャストグループに参加する eth0 などの名前でネットワークインターフェイスを指定できます。
udpConnectionlessSending false
Camel 2.15: プロデューサーのみ。このオプションは、接続なしの UDP 送信をサポートします。これは genuine fire-and-forget です。UDP 送信試行は、PortUnreachableException 例外を受け取ります(受信ポートでリッスンしているものがない場合)。
clientMode false Camel 2.15: コンシューマーのみ。clientModetrue の場合、Netty コンシューマーは TCP クライアントとしてアドレスに接続します。
useChannelBuffer false Camel 2.16: プロデューサーのみ。useChannelBuffertrue の場合、Netty プロデューサーはメッセージ本文を channelBuffer に切り替えてから送信します。

レジストリーベースのオプション

Codec ハンドラーおよび SSL キーストアは、Spring XML ファイルの など、レジストリー に登録できます。渡すことができる値は次のとおりです。
Expand
名前 説明
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 クラス。org.jboss.netty.channel.ChannelDownStreamHandler をオーバーライドする必要があります。
encorders 使用するエンコーダーのリスト。コンマ区切りの値を持つ文字列を使用し、値をレジストリー で検索でき ます。Camel がルックアップする必要があることを認識できるように、値の前に # を付けることを忘れないでください。
decoder インバウンドペイロードの特別なマーシャリングを実行するために使用できるカスタム ChannelHandler クラス。Must override org.jboss.netty.channel.ChannelUpStreamHandler.decoder が定義されていない場合、Netty はデフォルトで ObjectDecoder クラスを介してシリアライズされた Java オブジェクトに設定されます。別の形式が想定される場合は、デコーダーを指定する必要があります。
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、バイナリー、およびシリアライズされたオブジェクトベースのペイロードを使用して、ソケットで要求を受信します。
  • それらをメッセージ交換としてルートに送信します。
コンシューマーモードは、一方向および要求応答ベースの操作の両方をサポートします。

Headers

Netty コンシューマーによって作成されたエクスチェンジについて、以下のヘッダーが入力されます。
Expand
ヘッダーのキークラス説明
NettyConstants.NETTY_CHANNEL_HANDLER_CONTEXT / CamelNettyChannelHandlerContextorg.jboss.netty.channel.ChannelHandlerContextChannelHandlerContext Netty によって受信される接続に関連付けられたインスタンス。
NettyConstants.NETTY_MESSAGE_EVENT / CamelNettyMessageEventorg.jboss.netty.channel.MessageEventMessageEvent Netty によって受信される接続に関連付けられたインスタンス。
NettyConstants.NETTY_REMOTE_ADDRESS / CamelNettyRemoteAddressjava.net.SocketAddress着信ソケット接続のリモートアドレス。
NettyConstants.NETTY_LOCAL_ADDRESS / CamelNettyLocalAddressjava.net.SocketAddress着信ソケット接続のローカルアドレス。
RouteBuilder builder = new RouteBuilder() {
  public void configure() {
    from("netty:udp://localhost:5155?sync=true")
      .process(new Processor() {
         public void process(Exchange exchange) throws Exception {
           Poetry poetry = (Poetry) exchange.getIn().getBody();
           poetry.setPoet("Dr. Sarojini Naidu");
           exchange.getOut().setBody(poetry);
         }
       }
    }
};
Copy to Clipboard Toggle word wrap

一方向通信を使用した TCP ベースの Netty コンシューマーエンドポイント

RouteBuilder builder = new RouteBuilder() {
  public void configure() {
       from("netty:tcp://localhost:5150")
           .to("mock:result");
  }
};
Copy to Clipboard Toggle word wrap

Request-Reply 通信を使用する SSL/TCP ベースの Netty コンシューマーエンドポイント

JSSE 設定ユーティリティーの使用

Camel 2.9 の時点で、Netty コンポーネントは を介して SSL/TLS 設定をサポートし http://camel.apache.org/camel-configuration-utilities.html ます。このユーティリティーは、作成する必要のあるコンポーネント固有のコードの量を大幅に減らし、エンドポイントおよびコンポーネントレベルで設定可能です。 以下の例は、Netty コンポーネントで ユーティリティーを使用する方法を示しています。

コンポーネントのプログラムによる設定

KeyStoreParameters ksp = new KeyStoreParameters();
ksp.setResource("/users/home/server/keystore.jks");
ksp.setPassword("keystorePassword");

KeyManagersParameters kmp = new KeyManagersParameters();
kmp.setKeyStore(ksp);
kmp.setKeyPassword("keyPassword");

SSLContextParameters scp = new SSLContextParameters();
scp.setKeyManagers(kmp);

NettyComponent nettyComponent = getContext().getComponent("netty", NettyComponent.class);
nettyComponent.setSslContextParameters(scp);
Copy to Clipboard Toggle word wrap

エンドポイントの Spring DSL ベースの設定

...
  <camel:sslContextParameters
      id="sslContextParameters">
    <camel:keyManagers
        keyPassword="keyPassword">
      <camel:keyStore
          resource="/users/home/server/keystore.jks"
          password="keystorePassword"/>
    </camel:keyManagers>
  </camel:sslContextParameters>...
...
  <to uri="netty:tcp://localhost:5150?sync=true&ssl=true&sslContextParameters=#sslContextParameters"/>
...
Copy to Clipboard Toggle word wrap

Jetty コンポーネントでの基本的な SSL/TLS 設定の使用

JndiRegistry registry = new JndiRegistry(createJndiContext());
registry.bind("password", "changeit");
registry.bind("ksf", new File("src/test/resources/keystore.jks"));
registry.bind("tsf", new File("src/test/resources/keystore.jks"));

context.createRegistry(registry);
context.addRoutes(new RouteBuilder() {
  public void configure() {
      String netty_ssl_endpoint =
         "netty:tcp://localhost:5150?sync=true&ssl=true&passphrase=#password"
         + "&keyStoreFile=#ksf&trustStoreFile=#tsf";
      String return_string =
         "When You Go Home, Tell Them Of Us And Say,"
         + "For Your Tomorrow, We Gave Our Today.";

      from(netty_ssl_endpoint)
       .process(new Processor() {
          public void process(Exchange exchange) throws Exception {
            exchange.getOut().setBody(return_string);
          }
       }
  }
});
Copy to Clipboard Toggle word wrap

SSLSession およびクライアント証明書へのアクセス

Camel 2.12 以降で利用可能
たとえば、クライアント証明書の詳細を取得する必要がある場合は、javax.net.ssl.SSLSession にアクセスできます。ssl=true の場合、Netty コンポーネントは以下のように SSLSession を Camel Message のヘッダーとして保存します。
SSLSession session = exchange.getIn().getHeader(NettyConstants.NETTY_SSL_SESSION, SSLSession.class);
// get the first certificate which is client certificate
javax.security.cert.X509Certificate cert = session.getPeerCertificateChain()[0];
Principal principal = cert.getSubjectDN();
Copy to Clipboard Toggle word wrap
needClientAuth=true を設定してクライアントを認証します。設定しないと、SSLSession はクライアント証明書に関する情報にアクセスできず、例外 javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated が発生する可能性があります。クライアント証明書の有効期限が切れている場合や無効な場合は、この例外が発生する場合もあります。
ヒント
sslClientCertHeaders オプションは true に設定でき、クライアント証明書に関する詳細が含まれるヘッダーで Camel Message を補完します。たとえば、サブジェクト名は、ヘッダー CamelNettySSLClientCertSubjectName で簡単に利用できます。

複数のコーデックの使用

特定のケースでは、エンコーダーとデコーダーのチェーンを netty パイプラインに追加する必要がある場合があります。multpile codecs を camel netty エンドポイントに追加するには、encoders およびdecoders URI パラメーターを使用する必要があります。encoder パラメーターおよびdecoder パラメーターと同様に、パイプラインに追加する必要のある ChannelUpstreamHandlers および ChannelDownstreamHandlers のリストへの参照を提供するために使用されます。エンコーダーを指定すると、デコーダーやデコーダーパラメーターと同様にエンコーダーパラメーターが無視されます。
重要
共有不可能なエンコーダー/デコーダーの使用について、上記を参照してください。
エンドポイントの作成時に解決できるように、コーデックのリストを Camel のレジストリーに追加する必要があります。
ChannelHandlerFactory lengthDecoder = ChannelHandlerFactories.newLengthFieldBasedFrameDecoder(1048576, 0, 4, 0, 4);

StringDecoder stringDecoder = new StringDecoder();
registry.bind("length-decoder", lengthDecoder);
registry.bind("string-decoder", stringDecoder);

LengthFieldPrepender lengthEncoder = new LengthFieldPrepender(4);
StringEncoder stringEncoder = new StringEncoder();
registry.bind("length-encoder", lengthEncoder);
registry.bind("string-encoder", stringEncoder);

List<ChannelHandler> decoders = new ArrayList<ChannelHandler>();
decoders.add(lengthDecoder);
decoders.add(stringDecoder);

List<ChannelHandler> encoders = new ArrayList<ChannelHandler>();
encoders.add(lengthEncoder);
encoders.add(stringEncoder);

registry.bind("encoders", encoders);
registry.bind("decoders", decoders);
Copy to Clipboard Toggle word wrap
Spring のネイティブコレクションサポートを使用して、アプリケーションコンテキストでコーデックリストを指定できます。
    <util:list id="decoders" list-class="java.util.LinkedList">
        <bean class="org.apache.camel.component.netty.ChannelHandlerFactories" factory-method="newLengthFieldBasedFrameDecoder">
            <constructor-arg value="1048576"/>
            <constructor-arg value="0"/>
            <constructor-arg value="4"/>
            <constructor-arg value="0"/>
            <constructor-arg value="4"/>
        </bean>
        <bean class="org.jboss.netty.handler.codec.string.StringDecoder"/>
    </util:list>

    <util:list id="encoders" list-class="java.util.LinkedList">
        <bean class="org.jboss.netty.handler.codec.frame.LengthFieldPrepender">
            <constructor-arg value="4"/>
        </bean>
        <bean class="org.jboss.netty.handler.codec.string.StringEncoder"/>
    </util:list>

    <bean id="length-encoder" class="org.jboss.netty.handler.codec.frame.LengthFieldPrepender">
        <constructor-arg value="4"/>
    </bean>
    <bean id="string-encoder" class="org.jboss.netty.handler.codec.string.StringEncoder"/>

    <bean id="length-decoder" class="org.apache.camel.component.netty.ChannelHandlerFactories" factory-method="newLengthFieldBasedFrameDecoder">
        <constructor-arg value="1048576"/>
        <constructor-arg value="0"/>
        <constructor-arg value="4"/>
        <constructor-arg value="0"/>
        <constructor-arg value="4"/>
    </bean>
    <bean id="string-decoder" class="org.jboss.netty.handler.codec.string.StringDecoder"/>

</beans>
Copy to Clipboard Toggle word wrap
Bean 名は、コンマ区切りリストとして、または List に含めるか、netty エンドポイント定義で使用できます。
                from("direct:multiple-codec").to("netty:tcp://localhost:{{port}}?encoders=#encoders&sync=false");
                
                from("netty:tcp://localhost:{{port}}?decoders=#length-decoder,#string-decoder&sync=false").to("mock:multiple-codec");
            }
        };
    }
}
Copy to Clipboard Toggle word wrap
または spring を使用します。
<camelContext id="multiple-netty-codecs-context" xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="direct:multiple-codec"/>
        <to uri="netty:tcp://localhost:5150?encoders=#encoders&ync=false"/>
    </route>
    <route>
        <from uri="netty:tcp://localhost:5150?decoders=#length-decoder,#string-decoder&ync=false"/>
        <to uri="mock:multiple-codec"/>
    </route>
</camelContext>
Copy to Clipboard Toggle word wrap

完了したらチャンネルを閉じる

サーバーとして動作する場合は、クライアントの変換が終了する場合などにチャネルを閉じることがあります。これを行うには、エンドポイントオプション disconnect=true を設定します。
ただし、以下のようにメッセージごとに Camel に指示することもできます。Camel に対してチャネルを閉じるよう指示するには、CamelNettyCloseChannelWhenComplete キーを持つヘッダーをブール値 true に追加する必要があります。たとえば、以下の例では、bye メッセージをクライアントに書き戻した後にチャンネルを閉じます。
        from("netty:tcp://localhost:8080").process(new Processor() {
            public void process(Exchange exchange) throws Exception {
                String body = exchange.getIn().getBody(String.class);
                exchange.getOut().setBody("Bye " + body);
                // some condition which determines if we should close
                if (close) {
                    exchange.getOut().setHeader(NettyConstants.NETTY_CLOSE_CHANNEL_WHEN_COMPLETE, true);
                }
            }
        });
Copy to Clipboard Toggle word wrap
Camel 2.5 で利用可能
カスタムチャネルパイプラインは、カスタムハンドラーを挿入してハンドラー/インターセプターチェーンを完全に制御します。これは、Netty Endpoint URL で指定しなくても、エンコーダーとデコーダーを簡単に指定します。
カスタムパイプラインを追加するには、カスタムチャネルパイプラインファクトリーを作成し、コンテキストレジストリー(JNDIRegistry、または camel-spring ApplicationContextRegistry など)でコンテキストに登録する必要があります。
カスタムパイプラインファクトリーは以下のように構築する必要があります。
  • Producer リンクされたチャネルパイプラインファクトリーは、ClientPipelineFactory の抽象クラスを拡張する必要があります。
  • Consumer リンクされたチャネルパイプラインファクトリーは、ServerPipelineFactory の抽象クラスを拡張する必要があります。
  • クラスは、カスタムハンドラー、エンコーダー、およびデコーダーを挿入するために、getPipeline ()メソッドを上書きする必要があります。getPipeline ()メソッドを上書きしない場合、ハンドラー、エンコーダー、またはデコーダーのないパイプラインがパイプラインに有線されます。
以下の例は、ServerChannel Pipeline ファクトリーを作成する方法を示しています。
カスタムパイプラインファクトリーの使用
public class SampleServerChannelPipelineFactory extends ServerPipelineFactory {
    private int maxLineSize = 1024;

    public ChannelPipeline getPipeline() throws Exception {
        ChannelPipeline channelPipeline = Channels.pipeline();

        channelPipeline.addLast("encoder-SD", new StringEncoder(CharsetUtil.UTF_8));
        channelPipeline.addLast("decoder-DELIM", new DelimiterBasedFrameDecoder(maxLineSize, true, Delimiters.lineDelimiter()));
        channelPipeline.addLast("decoder-SD", new StringDecoder(CharsetUtil.UTF_8));
        // here we add the default Camel ServerChannelHandler for the consumer, to allow Camel to route the message etc.
        channelPipeline.addLast("handler", new ServerChannelHandler(consumer));

        return channelPipeline;
    }
}
Copy to Clipboard Toggle word wrap
次に、カスタムチャネルパイプラインファクトリーをレジストリーに追加し、以下のように Camel ルートでインスタンス化/活用できます。
Registry registry = camelContext.getRegistry();
serverPipelineFactory = new TestServerChannelPipelineFactory();
registry.bind("spf", serverPipelineFactory);
context.addRoutes(new RouteBuilder() {
  public void configure() {
      String netty_ssl_endpoint =
         "netty:tcp://localhost:5150?serverPipelineFactory=#spf"
      String return_string =
         "When You Go Home, Tell Them Of Us And Say,"
         + "For Your Tomorrow, We Gave Our Today.";

      from(netty_ssl_endpoint)
       .process(new Processor() {
          public void process(Exchange exchange) throws Exception {
            exchange.getOut().setBody(return_string);
          }
       }
  }
});

Copy to Clipboard Toggle word wrap

Netty boss およびワーカースレッドプールの再利用

Camel 2.12 以降で利用可能
Netty には boss と worker の 2 種類のスレッドプールがあります。デフォルトでは、各 Netty コンシューマーおよびプロデューサーにはプライベートスレッドプールがあります。複数のコンシューマーまたはプロデューサー間でこれらのスレッドプールを再利用する場合は、スレッドプールを作成し、レジストリー に登録する必要があり ます
たとえば、Spring XML を使用する場合は、以下のように 2 つのワーカースレッドを持つ NettyWorkerPoolBuilder を使用して共有ワーカースレッドプールを作成できます。
  <!-- use the worker pool builder to create to help create the shared thread pool -->
  <bean id="poolBuilder" class="org.apache.camel.component.netty.NettyWorkerPoolBuilder">
    <property name="workerCount" value="2"/>
  </bean>

  <!-- the shared worker thread pool -->
  <bean id="sharedPool" class="org.jboss.netty.channel.socket.nio.WorkerPool"
        factory-bean="poolBuilder" factory-method="build" destroy-method="shutdown">
  </bean>
Copy to Clipboard Toggle word wrap
ヒント
boss スレッドプールの場合は、Netty コンシューマーには org.apache.camel.component.netty.NettyServerBossPoolBuilder ビルダーと、Netty 生成用の org.apache.camel.component.netty.NettyClientBossPoolBuilder があります。
Camel ルートでは、以下のように URIworkerPool オプションを設定することで、このワーカープールを参照できます。
    <route>
      <from uri="netty:tcp://localhost:5021?textline=true&ync=true&orkerPool=#sharedPool&rderedThreadPoolExecutor=false"/>
      <to uri="log:result"/>
      ...
    </route>
Copy to Clipboard Toggle word wrap
別のルートがある場合は、共有ワーカープールを参照できます。
    <route>
      <from uri="netty:tcp://localhost:5022?textline=true&ync=true&orkerPool=#sharedPool&rderedThreadPoolExecutor=false"/>
      <to uri="log:result"/>
      ...
    </route>
Copy to Clipboard Toggle word wrap
... など。

その他の参考資料

トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat