241.6. 例
241.6.1. Request-Reply とシリアライズされたオブジェクトペイロードを使用する UDP Netty エンドポイント
RouteBuilder builder = new RouteBuilder() {
public void configure() {
from("netty4:udp://0.0.0.0: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);
}
}
}
};241.6.2. 一方向通信を使用する TCP ベースの Netty コンシューマーエンドポイント
RouteBuilder builder = new RouteBuilder() {
public void configure() {
from("netty4:tcp://0.0.0.0:5150")
.to("mock:result");
}
};241.6.3. Request-Reply 通信を使用する SSL/TCP ベースの Netty コンシューマーエンドポイント
JSSE 設定ユーティリティーの使用
Camel 2.9 の時点で、Netty コンポーネントは Camel JSSE Configuration Utility を介した SSL/TLS 設定をサポートしています。 このユーティリティーは、記述する必要があるコンポーネント固有のコードの量を大幅に削減し、エンドポイントおよびコンポーネントレベルで設定できます。 次の例は、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("netty4", NettyComponent.class);
nettyComponent.setSslContextParameters(scp);エンドポイントの 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="netty4:tcp://0.0.0.0:5150?sync=true&ssl=true&sslContextParameters=#sslContextParameters"/>
...Netty4-Jetty コンポーネントでの基本的な SSL/TLS 設定の使用 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 =
"netty4:tcp://0.0.0.0: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);
}
}
}
});SSLSession とクライアント証明書へのアクセスを取得する
たとえば、クライアント証明書に関する詳細を取得する必要がある場合は、javax.net.ssl.SSLSession にアクセスできます。ssl=true の場合、以下に示すように、Netty4 コンポーネントは SSLSession を Camel メッセージのヘッダーとして保存します。
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();
クライアントを認証するには、必ず needClientAuth=true を設定してください。そうしないと、SSLSession はクライアント証明書に関する情報にアクセスできず、例外 javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated が発生する可能性があります。クライアント証明書の有効期限が切れているか、有効でない場合などにも、この例外が発生する可能性があります。
オプション sslClientCertHeaders をtrue に設定すると、Camel メッセージがクライアント証明書に関する詳細を含むヘッダーで強化されます。たとえば、サブジェクト名はヘッダー CamelNettySSLClientCertSubjectName ですぐに利用できます。
241.6.4. 複数のコーデックの使用
場合によっては、エンコーダーとデコーダーのチェーンを netty パイプラインに追加する必要があります。複数のコーデックを 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);Spring のネイティブコレクションサポートを使用して、アプリケーションコンテキストでコーデックリストを指定できます。
<util:list id="decoders" list-class="java.util.LinkedList">
<bean class="org.apache.camel.component.netty4.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="io.netty.handler.codec.string.StringDecoder"/>
</util:list>
<util:list id="encoders" list-class="java.util.LinkedList">
<bean class="io.netty.handler.codec.LengthFieldPrepender">
<constructor-arg value="4"/>
</bean>
<bean class="io.netty.handler.codec.string.StringEncoder"/>
</util:list>
<bean id="length-encoder" class="io.netty.handler.codec.LengthFieldPrepender">
<constructor-arg value="4"/>
</bean>
<bean id="string-encoder" class="io.netty.handler.codec.string.StringEncoder"/>
<bean id="length-decoder" class="org.apache.camel.component.netty4.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="io.netty.handler.codec.string.StringDecoder"/>Bean 名は、netty エンドポイント定義でコンマ区切りのリストとして使用するか、リストに含めることができます。
from("direct:multiple-codec").to("netty4:tcp://0.0.0.0:{{port}}?encoders=#encoders&sync=false");
from("netty4:tcp://0.0.0.0:{{port}}?decoders=#length-decoder,#string-decoder&sync=false").to("mock:multiple-codec");または XML 経由。
<camelContext id="multiple-netty-codecs-context" xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="direct:multiple-codec"/>
<to uri="netty4:tcp://0.0.0.0:5150?encoders=#encoders&sync=false"/>
</route>
<route>
<from uri="netty4:tcp://0.0.0.0:5150?decoders=#length-decoder,#string-decoder&sync=false"/>
<to uri="mock:multiple-codec"/>
</route>
</camelContext>