第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>

情報: InputStreamInputStream がメッセージボディーとして使用され、大きなデータストリーム (たとえば、> 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 など) でのみ指定できます。