第242章 Netty4 HTTP コンポーネント
Camel バージョン 2.14 以降で利用可能
netty4-http コンポーネントは、Netty4 による HTTP トランスポートを容易にする Netty4 コンポーネントの拡張機能です。
この camel コンポーネントは、プロデューサーエンドポイントとコンシューマーエンドポイントの両方をサポートします。
情報: ストリーム。Netty はストリームベースです。つまり、受信した入力はストリームとして Camel に送信されます。つまり、ストリームのコンテンツを 一度 だけ読み取ることができます。もし、メッセージボディーが空のように見える場合や、何度もデータにアクセスする必要がある場合 (例: マルチキャストや再配送エラー処理)、ストリームキャッシュを使用するか、何度再読み込みしても安全な String
にメッセージボディーを変換する必要があります。Netty4 HTTP は、io.netty.handler.codec.http.HttpObjectAggregator
を使用してストリーム全体をメモリーに読み込み、完全な http メッセージ全体をビルドすることに注意してください。ただし、結果のメッセージは、一度読み取り可能なストリームベースのメッセージのままです。
Maven ユーザーは、このコンポーネントの pom.xml
に以下の依存関係を追加する必要があります。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-netty4-http</artifactId> <version>x.x.x</version> <!-- use the same version as your Camel core version --> </dependency>
情報: InputStream。InputStream
がメッセージボディーとして使用され、大きなデータストリーム (たとえば、> 2 GB) を読み書きする必要がある場合は、disableStreamCache
パラメーターを true
に設定してストリーミングサポートを使用する必要があります。
例 1: サーバーへの大きなデータストリームのアップロード
// Upload a large data stream to the server from("direct:upstream-call") .bean(Helper.class, "prepareStream") .to("netty-http:http://localhost:{{port}}/upstream?disableStreamCache=true") .log("get ${body}"); // Read a large data stream from the client from("netty-http:http://0.0.0.0:{{port}}/upstream?disableStreamCache=true") .bean(Helper.class, "processStream") .to("mock:stream-size");
例 2: サーバーからの大きなデータストリームのダウンロード
// Download a large data stream from the server from("direct:download-call") .to("netty-http:http://localhost:{{port}}/downstream?disableStreamCache=true") .bean(Helper.class, "asyncProcessStream") .log("get ${body}"); // Write a large data stream to the client from("netty-http:http://0.0.0.0:{{port}}/downstream?disableStreamCache=true") .bean(Helper.class, "prepareStream");
ダウンロードの例では、基になるストリームハンドラーをブロックしないように、他のスレッドで InputStream
から読み取る必要があります (asyncProcessStream
を参照)。
public static void processStream(Exchange exchange) throws Exception { InputStream is = exchange.getIn().getBody(InputStream.class); byte[] buffer = new byte[1024]; long read = 0; long total = 0; while ((read = is.read(buffer, 0, buffer.length)) != -1) { total += read; } exchange.getIn().setBody(new Long(total)); } public static CompletableFuture<Void> asyncProcessStream(Exchange exchange) { return CompletableFuture.runAsync(() -> { try { processStream(exchange); } catch (Exception e) { exchange.setException(e); } }); }
242.1. URI 形式
netty コンポーネントの URI スキームは次のとおりです。
netty4-http:http://0.0.0.0:8080[?options]
URI には、?option=value&option=value&…
の形式でクエリーオプションを追加できます。
情報: クエリーパラメーターとエンドポイントオプション。Camel が URI クエリーパラメーターとエンドポイントオプションをどのように認識するのか疑問に思われるかもしれません。たとえば、次のようにエンドポイント URI を作成できます - netty4-http:http//example.com?myParam=myValue&compression=true
。この例では、myParam
がHTTP パラメーターであり、compression
が Camel エンドポイントオプションです。このような状況で Camel が使用するストラテジーは、利用可能なエンドポイントオプションを解決し、それらを URI から削除することです。これは、前述の例の場合、圧縮
エンドポイントオプションが解決され、ターゲット URL から削除されるため、Netty HTTP プロデューサーによってエンドポイントに送信される HTTP リクエストが http//example.com?myParam=myValue
のようになることを意味します。また、動的ヘッダー (CamelHttpQuery
など) を使用してエンドポイントオプションを指定できないことにも注意してください。エンドポイントオプションは、エンドポイント URI 定義レベル (DSL 要素 to
または from
など) でのみ指定できます。