Red Hat Training

A Red Hat training course is available for Red Hat Fuse

141.17. 高度な使用方法

HTTP プロデューサーをさらに制御する必要がある場合は、さまざまなクラスを設定してカスタム動作を提供できる HttpComponent を使用する必要があります。

141.17.1. MaxConnectionsPerHost の設定

HTTP コンポーネントには、特定のコンポーネントのさまざまなグローバル設定を設定できる org.apache.commons.httpclient.HttpConnectionManager があります。
グローバルとは、コンポーネントが作成するすべてのエンドポイントが同じ共有 HttpConnectionManager を持つことを意味します。したがって、ホストごとの最大接続数に別の値を設定する場合は、通常使用するエンドポイント URI では なく、HTTP コンポーネントで定義する必要があります。ですから、次のようになります。

まず、Spring XML で http コンポーネントを定義します。はい、同じスキーム名 http を使用します。それ以外の場合、Camel は自動検出し、デフォルト設定でコンポーネントを作成します。必要なのは、これを却下して、オプションを設定できるようにすることです。以下のサンプルでは、最大接続数をデフォルトの 2 ではなく 5 に設定しています。

そして、ルートで通常どおりに使用できます。

141.17.2. プリエンプティブ認証の使用

あるエンドユーザーが、HTTPS での認証に問題があると報告しました。HTTPS サーバーが HTTP コード 401 Authorization Required を返さないことを発見したとき、問題は最終的に解決されました。解決策は、次の URI オプションを設定することでした: httpClient.authenticationPreemptive=true

141.17.3. リモートサーバーからの自己署名証明書の受け入れ

Apache Commons HTTP API でこれを行う方法を概説するいくつかのコードを含むメーリングリストディスカッションのこの リンク を参照してください。

141.17.4. HTTP クライアントの SSL の設定

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

Camel 2.8 の時点で、HTTP4 コンポーネントは Camel JSSE Configuration Utility を介した SSL/TLS 設定をサポートしています。  このユーティリティーは、記述する必要があるコンポーネント固有のコードの量を大幅に削減し、エンドポイントおよびコンポーネントレベルで設定できます。  次の例は、HTTP4 コンポーネントでユーティリティーを使用する方法を示しています。

このコンポーネントで使用される Apache HTTP クライアントのバージョンは、グローバルなプロトコルレジストリーから SSL/TLS 情報を解決します。  このコンポーネントは、Camel JSSE 設定ユーティリティーの使用をサポートするために、HTTP クライアントのプロトコルソケットファクトリーの実装 org.apache.camel.component.http.SSLContextParametersSecureProtocolSocketFactory を提供します。  次の例は、プロトコルレジストリーを設定し、登録されたプロトコル情報をルートで使用する方法を示しています。

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);

ProtocolSocketFactory factory =
    new SSLContextParametersSecureProtocolSocketFactory(scp);

Protocol.registerProtocol("https",
        new Protocol(
        "https",
        factory,
        443));

from("direct:start")
        .to("https://mail.google.com/mail/").to("mock:results");

Apache HTTP クライアントを直接設定する

基本的に camel-http コンポーネントは Apache HTTP クライアントの上に構築されており、カスタム org.apache.camel.component.http.HttpClientConfigurer を実装して、http クライアントを完全に制御する必要がある場合に設定を行うことができます。

ただし、キーストアとトラストストアを指定する だけ の場合は、Apache HTTP HttpClientConfigurer を使用してこれを行うことができます。次に例を示します。

Protocol authhttps = new Protocol("https", new AuthSSLProtocolSocketFactory(
  new URL("file:my.keystore"), "mypassword",
  new URL("file:my.truststore"), "mypassword"), 443);

Protocol.registerProtocol("https", authhttps);

次に、HttpClientConfigurer を実装するクラスを作成し、上記の例に従ってキーストアまたはトラストストアを提供する https プロトコルを登録する必要があります。次に、キャメルルートビルダークラスから次のように接続できます。

HttpComponent httpComponent = getContext().getComponent("http", HttpComponent.class);
httpComponent.setHttpClientConfigurer(new MyHttpClientConfigurer());

Spring DSL を使用してこれを行う場合、URI を使用して HttpClientConfigurer を指定できます。以下に例を示します。

<bean id="myHttpClientConfigurer"
 class="my.https.HttpClientConfigurer">
</bean>

<to uri="https://myhostname.com:443/myURL?httpClientConfigurerRef=myHttpClientConfigurer"/>

上記のように HttpClientConfigurer を実装し、キーストアとトラストストアを設定する限り、問題なく動作します。