第80章 Jetty


Jetty コンポーネント

警告
プロデューサーは非推奨になりました。使用しないでください。jetty をコンシューマーとしてのみ使用することが推奨されます(例:jetty)。
jetty コンポーネントは、HTTP 要求を使用し、生成するための HTTP ベースの エンドポイント を提供します。つまり、Jetty コンポーネントは単純な Web サーバーとして動作します。Jetty は http クライアントとしても使用でき、Camel でプロデューサーとして使用することもできます。
ストリーム
Jetty はストリームベースであり、受信する入力がストリームとして Camel に送信されます。つまり、ストリームのコンテンツを 1 度 だけ読み取ることができます。メッセージボディーが空である、または Exchange.HTTP_RESPONSE_CODE データを複数回アクセスする必要がある場合(たとえば、マルチキャストまたは再配信エラー処理)、Stream Caching を使用するか、メッセージボディーを複数回再読み取りできる String に変換する必要があります。
Maven ユーザーは、このコンポーネントの pom.xml に以下の依存関係を追加する必要があります。
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jetty</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

URI 形式

jetty:http://hostname[:port][/resourceUri][?options]
URI にクエリーオプションは ?option=value&option=value&.. の形式で追加できます。

オプション

Expand
名前 デフォルト値 説明
sessionSupport false Jetty のサーバー側でセッションマネージャーを有効にするかどうかを指定します。
httpClient.XXX null Jetty の HttpClient の設定。たとえば、httpClient.idleTimeout=30000 を設定すると、アイドルタイムアウトは 30 秒に設定されます。
httpClient null このエンドポイントによって作成されたすべてのプロデューサーに共有 org.eclipse.jetty.client.HttpClient を使用します。このオプションは、特別な状況でのみ使用してください。
httpClientMinThreads null Camel 2.11: プロデューサーのみ: HttpClient スレッドプールの最小スレッド数に値を設定します。この設定は、コンポーネントレベルに設定された設定を上書きします。最小サイズと最大サイズの両方を設定する必要があることに注意してください。設定しない場合は、Jetty のスレッドプールで使用される min 8 スレッドにデフォルト設定されます。
httpClientMaxThreads null Camel 2.11: プロデューサーのみ: HttpClient スレッドプールの最大スレッド数に値を設定します。この設定は、コンポーネントレベルに設定された設定を上書きします。最小サイズと最大サイズの両方を設定する必要があることに注意してください。設定しない場合は、Jetty のスレッドプールで使用される最大 16 スレッドにデフォルト設定されます。
httpBindingRef null レジストリーの org.apache.camel.component.http.HttpBinding への参照。HttpBinding を使用して、コンシューマーに応答を書き込む方法をカスタマイズできます。
jettyHttpBindingRef null Camel 2.6.0+: レジストリーの org.apache.camel.component.jetty.JettyHttpBinding への参照。JettyHttpBinding を使用すると、プロデューサーに対して応答の作成方法をカスタマイズできます。
matchOnUriPrefix false 完全に一致するものが見つからない場合に、CamelServlet が URI 接頭辞と一致することでターゲットコンシューマーの検索を試みるかどうか。How do I let Jetty match wildcards を参照してください。
handlers null レジストリー(Spring ApplicationContextなど)の org.mortbay.jetty.Handler インスタンスのコンマ区切りの一覧を指定します。これらのハンドラーは Jetty サーブレットコンテキストに追加されます(セキュリティーを追加するためなど)。
chunked true Camel 2.2: このオプションが false の場合、Jetty サーブレットが HTTP ストリーミングを無効にし、応答に content-length ヘッダーを設定します。
enableJmx false Camel 2.3: このオプションが true の場合、このエンドポイントに対して Jetty JMX サポートが有効になります。
disableStreamCache false Camel 2.3: Jetty からの raw 入力ストリームがキャッシュされているかどうかを判断します(Camel はストリームをファイル、ストリームキャッシュ)キャッシュにストリームします。http://camel.apache.org/stream-caching.htmlデフォルトでは、Camel は Jetty 入力ストリームをキャッシュして複数回読み取りし、Camel がストリームからすべてのデータを取得できるようにします。ただし、ファイルや他の永続ストアに直接ストリーミングするなど、raw ストリームにアクセスする必要がある場合などにこのオプションを true に設定できます。DefaultHttpBinding は、要求入力ストリームをストリームキャッシュにコピーし、このオプションが false の場合、ストリームを複数回読み取るようにメッセージボディーに配置します。Jetty を使用してエンドポイントをブリッジ/プロキシーする場合は、メッセージペイロードを複数回読み取る必要がない場合は、このオプションを有効にしてパフォーマンスを向上することを検討してください。
throwExceptionOnFailure true リモートサーバーからの応答が失敗した場合に HttpOperationFailedException を出力することを無効にするオプション。これにより、HTTP ステータスコードに関するすべての応答を取得できます。
transferException false Camel 2.6: 有効で、エクスチェンジ がコンシューマー側で処理に失敗した場合、発生した例外が応答で application/x-java-serialized-object コンテンツタイプとしてシリアライズされた場合は、以下を行います。プロデューサー側では、例外がデシリアライズされ、HttpOperationFailedException ではなくそのまま出力されます。原因となった例外はシリアライズする必要があります。
bridgeEndpoint false
&gt; Camel 2.1: オプションが true の場合、HttpProducer は Exchange.HTTP_URI ヘッダーを無視し、リクエストにエンドポイントの URI を使用します。また、throwExceptionOnFailure を false に設定して、HttpProducer がすべての障害応答を返信するようにすることもできます。Camel 2.3: オプションが true の場合、content-encoding が gzip の場合、HttpProducer および CamelServlet は gzip 処理をスキップします。ブリッジ時に最適化するために disableStreamCache を true に設定することも検討してください。
enableMultipartFilter true Camel 2.5: Jetty org.eclipse.jetty.servlets.MultiPartFilter が有効かどうか。マルチパートリクエストもプロキシー/ブリッジされるように、エンドポイントをブリッジする場合にはこの値を false に設定する必要があります。
multipartFilterRef null Camel 2.6: カスタムの multipart フィルターの使用を許可します。注記: multipartFilterRef を設定すると、enableMultipartFilter の値が true に強制されます。
filterInit.xxx null Camel 2.17: フィルターの設定 InitParametersたとえば、filterInit.parameter=value を設定すると、フィルター init メソッドを呼び出す際に、パラメーターを使用することができます。
filtersRef null Camel 2.9: リストに格納され、レジストリーで検索できるカスタムフィルターを使用できます。
continuationTimeout null Camel 2.6: Jetty をコンシューマー(サーバー)として使用する場合にタイムアウトをミリ秒単位で設定できます。デフォルトでは Jetty は 30000 を使用します。<= 0 の値を使用すると有効期限 が切れることはありません。タイムアウトが発生すると、リクエストは期限切れになり、Jetty は http エラー 503 をクライアントに返します。このオプションは、非同期ルーティングエンジンで Jetty を使用する場合のみ使用されます
useContinuation true Camel 2.6: Jetty サーバーの Jetty 継続を 使用するかどうか。
sslContextParametersRef null 非推奨 : Camel 2.8: レジストリーの org.apache.camel.util.jsse.SSLContextParameters への参照。この参照は、コンポーネントレベルで設定済みの SSLContextParameters を上書きします。Security Guide および 「JSSE 設定ユーティリティーの使用」 の Configuring Transport Security for Camel Components を参照して ください。
sslContextParameters null Camel 2.17: レジストリーの org.apache.camel.util.jsse.SSLContextParameters への参照。この参照は、コンポーネントレベルで設定済みの SSLContextParameters を上書きします。Security Guide および 「JSSE 設定ユーティリティーの使用」 の Configuring Transport Security for Camel Components を参照して ください。
traceEnabled false この Jetty コンシューマーに対して HTTP TRACE を有効にするかどうかを指定します。デフォルトでは、TRACE はオフになっています。
optionsEnabled false Camel 2.17: この Jetty コンシューマーに対して HTTP OPTIONS を有効にするかどうかを指定します。デフォルトでは、OPTIONS はオフになっています。
headerFilterStrategy null Camel 2.11: レジストリー の org.apache.camel.spi.HeaderFilterStrategy のインスタンスへの 参照。これは、新しい create HttpJettyEndpoint にカスタム headerFilterStrategy を適用するために使用されます。
httpMethodRestrict
null
Camel 2.11: コンシューマーのみ: GET/POST/PUT など、HttpMethod が一致する場合にのみ消費を許可するために使用されます。Camel 2.15 以降 では、複数のメソッドをコンマで区切って指定できます。
responseBufferSize null Camel 2.12: javax.servlet.ServletResponse でカスタムバッファーサイズを使用するには、以下を行います。
proxyHost
null
Camel 2.11: Jetty クライアントによって使用される http プロキシーホスト URL のみ
proxyPort
null
Camel 2.11: Jetty クライアントによって使用される http プロキシーポートのみプロデューサー
sendServerVersion
true
Camel 2.13: オプションが true の場合、jetty は要求を送信するクライアントに jetty バージョン情報のあるサーバーヘッダーを送信します。なお、他の camel-jetty エンドポイントが同じポートを共有していないことを確認してください。それ以外の場合は、このオプションが期待どおりに機能しない可能性があります。
sendDateHeader
false
Camel 2.14: オプションが true の場合、jetty サーバーはリクエストを送信するクライアントに日付ヘッダーを送信します。なお、他の camel-jetty エンドポイントが同じポートを共有していないことを確認してください。それ以外の場合は、このオプションが期待どおりに機能しない可能性があります。
enableCORS
false
Camel 2.15: オプションが true の場合、Jetty サーバーは、すぐに使用できる CORS をサポートする CrossOriginFilter を設定します。
okStatusCodeRange
200-299
Camel 2.16: プロデューサーのみ。正常な応答と見なされるステータスコード。値は含まれます。範囲は、構文 from-to を使用して定義する必要があります。

メッセージヘッダー

Camel は HTTP コンポーネントと同じメッセージヘッダーを使用します。Camel 2.2 では、(Exchange.HTTP_CHUNKED,CamelHttpChunked)ヘッダーを使用して camel-jetty コンシューマーでチェンドエンコーディングをオンまたはオフにします。
Camel は すべて の request.parameter および request.headers も設定します。たとえば、URL http://myserver/myserver?orderid=123 を持つクライアントリクエストの場合、エクスチェンジには orderid という名前のヘッダー(値が 123)が含まれます。
Camel 2.2.0 以降では、Get Method だけでなく、他の HTTP メソッドからもメッセージヘッダーから request.parameter を取得できます。

使用方法

Jetty コンポーネントは、コンシューマーエンドポイントとプロデューサーエンドポイントの両方をサポートします。他の HTTP エンドポイントへ生成するもう 1 つのオプションは、HTTP コンポーネントを使用することです。

コンポーネントオプション

JettyHttpComponent は、以下のオプションを提供します。
Expand
名前 デフォルト値 説明
enableJmx false Camel 2.3: このオプションが true の場合、このエンドポイントに対して Jetty JMX サポートが有効になります。
sslKeyPassword null コンシューマーのみ: SSL 使用時のキーストアのパスワード。
sslPassword null コンシューマーのみ: SSL を使用する場合のパスワード。
sslKeystore null コンシューマーのみ: キーストアへのパス。
minThreads null Camel 2 .5 コンシューマーのみ: サーバースレッドプールの最小スレッド数に値を設定します。
maxThreads null Camel 2 .5 コンシューマーのみ: サーバースレッドプールの最大スレッド数に値を設定します。
threadPool null Camel 2 .5 コンシューマーのみ: サーバーにカスタムスレッドプールを使用します。
sslSocketConnectors null Camel 2.3 Consumer のみ: ポート番号固有の SSL コネクターごとに含まれるマップ。詳細は、SSL サポート のセクションを参照してください。
socketConnectors null Camel 2. 5 コンシューマーのみ: ポート番号固有の HTTP コネクターごとに含まれるマップ。sslSocketConnectors と同じ原則を使用するため、SSL サポート のセクションを参照してください。
sslSocketConnectorProperties null Camel 2. 5 コンシューマーのみ一般的な SSL コネクタープロパティーが含まれるマップ。
socketConnectorProperties null Camel 2. 5 コンシューマーのみ一般的な HTTP コネクタープロパティーが含まれるマップ。sslSocketConnectorProperties と同じ principle を使用します。
httpClient null 非推奨: プロデューサーのみ:jetty プロデューサーでカスタム HttpClient を使用します。このオプションは Camel 2.11 以降から削除されます。代わりに、エンドポイントに オプションを設定できます。
httpClientMinThreads null プロデューサーのみ: HttpClient スレッドプールの最小スレッド数に値を設定します。最小サイズと最大サイズの両方を設定する必要があることに注意してください。
httpClientMaxThreads null プロデューサーのみ: HttpClient スレッドプールの最大スレッド数に値を設定します。最小サイズと最大サイズの両方を設定する必要があることに注意してください。
httpClientThreadPool null 非推奨: プロデューサーのみ: クライアントにカスタムスレッドプールを使用します。このオプションは Camel 2.11 以降から削除されます。
sslContextParameters null Camel 2.8: コンポーネントレベルでカスタム SSL/TLS 設定オプションを設定するには、以下を実行します。詳細は、「JSSE 設定ユーティリティーの使用」 を参照してください。
requestBufferSize null Camel 2.11. 2: Jetty コネクターでリクエストバッファーサイズのカスタム値を設定できます。
requestHeaderSize null Camel 2.11. 2: Jetty コネクターでリクエストヘッダーサイズのカスタム値を設定します。
responseBufferSize null Camel 2.11. 2: Jetty コネクターで応答バッファーサイズのカスタム値を設定できます。
responseHeaderSize null Camel 2.11. 2: Jetty コネクターで応答ヘッダーサイズのカスタム値を設定します。
proxyHost
null
Camel 2.12.2/2.11.3 http プロキシーを使用します。
proxyPort
null
Camel 2.12.2/2.11.3: http プロキシーを使用するには、以下を実行します。
errorHandler
null
Camel 2.15: このオプションは、Jetty サーバーが使用する ErrorHandler を設定するために使用されます。
allowJavaSerializedObject
false
Camel 2.16.1/2.15.5: リクエストが context-type=application/x-java-serialized-object を使用している場合に Java のシリアル化を許可するかどうか。これはデフォルトでオフになっています。警告: このオプションを有効にすると、Java はリクエストから受信したデータを Java にデシリアライズし、セキュリティーリスクとなる可能性があることに注意してください。

プロデューサーの例

警告
プロデューサーは非推奨になりました。使用しないでください。jetty をコンシューマーとしてのみ使用することが推奨されます(例:jetty)。
以下は、HTTP リクエストを既存の HTTP エンドポイントに送信する方法の基本的な例です。
Java DSL で
from("direct:start").to("jetty://http://www.google.com");
Spring XML で または を使用します。
<route>
    <from uri="direct:start"/>
    <to uri="jetty://http://www.google.com"/>
<route>

コンシューマーの例

以下の例では、 http://localhost:8080/myapp/myservice で HTTP サービスを公開するルートを定義します。
from("jetty:http://localhost:{{port}}/myapp/myservice").process(new MyBookService());
localhost の使用
URL で localhost を指定すると、Camel はローカルの TCP/IP ネットワークインターフェイスでのみエンドポイントを公開するため、操作するマシンからアクセスすることはできません。
特定のネットワークインターフェイスで Jetty エンドポイントを公開する必要がある場合は、このインターフェイスの数値の IP アドレスをホストとして使用する必要があります。すべてのネットワークインターフェイスで Jetty エンドポイントを公開する必要がある場合は、0.0.0.0 アドレスを使用する必要があります。
ヒント
URI 接頭辞全体をリッスンするに は、Jetty がワイルドカードと一致させる方法 を参照してください。
ヒント
実際には HTTP によってルートを公開し、すでにサーブレットがある場合は、代わりに Servlet Transport を参照する必要があります。
このビジネスロジックは MyBookService クラスに実装され、HTTP リクエストの内容にアクセスし、応答を返します。注記: コードがユニットテストの一部であるため、この例では assert 呼び出しが表示されます。
public class MyBookService implements Processor {
    public void process(Exchange exchange) throws Exception {
        // just get the body as a string
        String body = exchange.getIn().getBody(String.class);

        // we have access to the HttpServletRequest here and we can grab it if we need it
        HttpServletRequest req = exchange.getIn().getBody(HttpServletRequest.class);
        assertNotNull(req);

        // for unit testing
        assertEquals("bookid=123", body);

        // send a html response
        exchange.getOut().setBody("<html><body>Book 123 is Camel in Action</body></html>");
    }
}
以下の例は、URI パラメーター 1 つを含むすべての要求をエンドポイント mock: one にルーティングし、他のすべてのリクエストを mock:other にルーティングするコンテンツベースのルートを示しています。
from("jetty:" + serverUri)
    .choice()
    .when().simple("${header.one}").to("mock:one")
    .otherwise()
    .to("mock:other");
そのため、クライアントが HTTP リクエスト http://serverUri?one=hello を送信すると、Jetty コンポーネントは HTTP リクエストパラメーターをエクスチェンジの in.header にコピーします。次に、Simple 言語を使用して、このヘッダーを含むエクスチェンジを特定のエンドポイントへルーティングし、他のすべてのエクスチェンジを別のエンドポイントにルーティングすることができます。Simple\-\-- など、 El OGNL\--we よりも強力な言語を使用している場合は、パラメーター値をテストし、ヘッダー値に基づいてルーティングを行うこともできます。

セッションサポート

セッションサポートオプション sessionSupport を使用すると、HttpSession オブジェクトを有効にし、エクスチェンジの処理中にセッションオブジェクトにアクセスできます。たとえば、以下のルートはセッションを有効にします。
<route>
    <from uri="jetty:http://0.0.0.0/myapp/myservice/?sessionSupport=true"/>
    <processRef ref="myCode"/>
<route>
myCode プロセッサー は、Spring bean 要素でインスタンス化できます。
<bean id="myCode"class="com.mycompany.MyCodeProcessor"/>
プロセッサーの実装は、以下のように HttpSession にアクセスできます。
public void process(Exchange exchange) throws Exception {
    HttpSession session = exchange.getIn(HttpMessage.class).getRequest().getSession();
    ...
}

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

Camel 2.8 以降、Jetty コンポーネントは Camel JSSE 設定ユーティリティーを介して SSL/TLS 設定をサポートします。このユーティリティーは、作成する必要のあるコンポーネント固有のコードの量を大幅に減らし、エンドポイントおよびコンポーネントレベルで設定可能です。 たとえば、Security GuideのConfiguring Transport Security for Camel Componentsの章を参照してくださいSecurity Guide のSecuring the Camel Jetty Component の章を参照してください

エンドポイントの 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="jetty:https://127.0.0.1/mail/?sslContextParametersRef=sslContextParameters"/>
...

Jetty の直接設定

Jetty は、追加設定なしで SSL サポートを提供します。Jetty が SSL モードで実行できるようにするには、https:// prefix--- で URI をフォーマットします。以下に例を示します。
<from uri="jetty:https://0.0.0.0/myapp/myservice/"/>
また、jetty は、正しい SSL 証明書を読み込むためにキーストアをロードする場所と、使用するパスワードを把握しておく必要があります。以下の JVM システムプロパティーを設定します。
Camel 2.2 まで
  • jetty.ssl.keystore は、Jetty サーバー自身の X.509 証明書をキー エントリー に含める Java キー ストアファイルの場所を指定します。キーエントリーは、X.509 証明書(実際には 公開鍵)と関連する秘密鍵を保存します。
  • jetty.ssl.password キーストアファイルへのアクセスに必要なストアパスワード(これはキー ストア コマンドの \-storepass オプションに指定されたパスワードと同じです)。
  • jetty.ssl.keypassword キーストアの証明書のキーエントリーにアクセスするために使用されるキーパスワード(これはキー ストア コマンドの \-keypass オプションに指定されたパスワードと同じです)。
Camel 2.3 以降
  • org.eclipse.jetty.ssl.keystore は、キー エントリー に Jetty サーバー自体の X.509 証明書が含まれる Java キー ストアファイルの場所を指定します。キーエントリーは、X.509 証明書(実際には 公開鍵)と関連する秘密鍵を保存します。
  • org.eclipse.jetty.ssl.password キーストアファイルへのアクセスに必要なストアパスワード(これはキー ストア コマンドの \-storepass オプションに指定されたパスワードと同じです)。
  • org.eclipse.jetty.ssl.keypassword キーストアの証明書のキーエントリーにアクセスするために使用されるキーパスワード(これはキー ストア コマンドの \-keypass オプションに指定されたパスワードと同じです)。
Jetty エンドポイントに SSL を設定する方法は、Jetty サイト( http://docs.codehaus.org/display/JETTY/How+to+configure+SSL)を参照してください。
一部の SSL プロパティーは Camel によって直接公開されませんが、Camel は基礎となる SslSocketConnector を公開します。これにより、クライアント証明書を必要とする相互認証の needClientAuth や、クライアントが証明書を必要としない相互認証には wantClientAuth などのプロパティーを設定できます。さまざまな Camel バージョンには若干の違いがあります。
Camel 2.2 まで
<bean id="jetty" class="org.apache.camel.component.jetty.JettyHttpComponent">
    <property name="sslSocketConnectors">
        <map>
            <entry key="8043">
                <bean class="org.mortbay.jetty.security.SslSocketConnector">
                    <property name="password"value="..."/>
                    <property name="keyPassword"value="..."/>
                    <property name="keystore"value="..."/>
                    <property name="needClientAuth"value="..."/>
                    <property name="truststore"value="..."/>
                </bean>
            </entry>
        </map>
    </property>
</bean>
Camel 2.3, 2.4
<bean id="jetty" class="org.apache.camel.component.jetty.JettyHttpComponent">
    <property name="sslSocketConnectors">
        <map>
            <entry key="8043">
                <bean class="org.eclipse.jetty.server.ssl.SslSocketConnector">
                    <property name="password"value="..."/>
                    <property name="keyPassword"value="..."/>
                    <property name="keystore"value="..."/>
                    <property name="needClientAuth"value="..."/>
                    <property name="truststore"value="..."/>
                </bean>
            </entry>
        </map>
    </property>
</bean>
\* from Camel 2.5 we switch to use SslSelectChannelConnector *
<bean id="jetty" class="org.apache.camel.component.jetty.JettyHttpComponent">
    <property name="sslSocketConnectors">
        <map>
            <entry key="8043">
                <bean class="org.eclipse.jetty.server.ssl.SslSelectChannelConnector">
                    <property name="password"value="..."/>
                    <property name="keyPassword"value="..."/>
                    <property name="keystore"value="..."/>
                    <property name="needClientAuth"value="..."/>
                    <property name="truststore"value="..."/>
                </bean>
            </entry>
        </map>
    </property>
</bean>
上記のマップでキーとして使用する値は、Jetty がリッスンするように設定するポートです。

一般的な SSL プロパティーの設定

Camel 2.5 で利用可能
(上記のように)ポート番号固有の SSL ソケットコネクターではなく、すべての SSL ソケットコネクターに適用される一般的なプロパティーを設定できるようになりました(ポート番号をエントリーとして追加しない)。
<bean id="jetty" class="org.apache.camel.component.jetty.JettyHttpComponent">
    <property name="sslSocketConnectorProperties">
        <map>
            <entry key="password"value="..."/>
            <entry key="keyPassword"value="..."/>
            <entry key="keystore"value="..."/>
            <entry key="needClientAuth"value="..."/>
            <entry key="truststore"value="..."/>
        </map>
    </property>
</bean>

X509Certificate への参照を取得する方法

Jetty は、以下のようにコードからアクセスできる HttpServletRequest に証明書への参照を保存します。
HttpServletRequest req = exchange.getIn().getBody(HttpServletRequest.class);
X509Certificate cert = (X509Certificate) req.getAttribute("javax.servlet.request.X509Certificate")

一般的な HTTP プロパティーの設定

Camel 2.5 で利用可能
(上記のように)ポート番号固有の HTTP ソケットコネクターではなく、すべての HTTP ソケットコネクターに適用される一般的なプロパティーを設定できるようになりました(ポート番号をエントリーとして追加しない)。
<bean id="jetty" class="org.apache.camel.component.jetty.JettyHttpComponent">
    <property name="socketConnectorProperties">
        <map>
            <entry key="acceptors" value="4"/>
            <entry key="maxIdleTime" value="300000"/>
        </map>
    </property>
</bean>

Obtaining X-Forwarded-For header with HttpServletRequest.getRemoteAddr()

HTTP 要求が Apache サーバーで処理され、mod_proxy で Jetty に転送された場合、元のクライアント IP アドレスは X-Forwarded-For ヘッダーに、HttpServletRequest.getRemoteAddr() は Apache プロキシーのアドレスを返します。
Jetty には転送されたプロパティーがあり、X-Forwarded-For から値を取得し、HttpServletRequest remoteAddr プロパティーに配置します。このプロパティーはエンドポイント設定から直接は利用できませんが、socketConnectors プロパティーを使用して簡単に追加できます。
<bean id="jetty" class="org.apache.camel.component.jetty.JettyHttpComponent">
    <property name="socketConnectors">
        <map>
            <entry key="8080">
                <bean class="org.eclipse.jetty.server.nio.SelectChannelConnector">
                    <property name="forwarded" value="true"/>
                </bean>
            </entry>
        </map>
    </property>
</bean>
これは、既存の Apache サーバーがドメインの TLS 接続を処理し、それらを内部でアプリケーションサーバーにプロキシーする場合に便利です。

HTTP ステータスコードを返すデフォルトの動作

HTTP ステータスコードのデフォルト動作は、応答の書き込み方法を処理し、HTTP ステータスコードも設定する org.apache.camel.component.http.DefaultHttpBinding クラスによって定義されます。
エクスチェンジが正常に処理されると、200 HTTP ステータスコードが返されます。例外でエクスチェンジが失敗すると、500 HTTP ステータスコードが返され、スタックトレースがボディーで返されます。返す HTTP ステータスコードを指定する場合は、OUT メッセージの Exchange.HTTP_RESPONSE_CODE ヘッダーにコードを設定します。

Customizing HttpBinding

デフォルトでは、Camel は org.apache.camel.component.http.DefaultHttpBinding を使用して応答の作成方法を処理します。必要に応じて、独自の HttpBinding クラスを実装するか、DefaultHttpBinding を拡張し、適切なメソッドを上書きすることで、この動作をカスタマイズできます。
以下の例は、例外が返される方法を変更するために DefaultHttpBinding をカスタマイズする方法を示しています。
public class MyHttpBinding extends DefaultHttpBinding {

    @Override
    public void doWriteExceptionResponse(Throwable exception, HttpServletResponse response) throws IOException {
        // we override the doWriteExceptionResponse as we only want to alter the binding how exceptions is
        // written back to the client. 

        // we just return HTTP 200 so the client thinks its okay
        response.setStatus(200);
        // and we return this fixed text
        response.getWriter().write("Something went wrong but we dont care");
    }
}
次に、バインディングのインスタンスを作成し、以下のように Spring レジストリーに登録することができます。
<bean id="mybinding"class="com.mycompany.MyHttpBinding"/>
次に、ルートを定義するときにこのバインディングを参照できます。
<route><from uri="jetty:http://0.0.0.0:8080/myapp/myservice?httpBindingRef=mybinding"/><to uri="bean:doSomething"/></route>

Jetty ハンドラーおよびセキュリティー設定

エンドポイントで Jetty ハンドラーの一覧を設定できます。これは、高度な Jetty セキュリティー機能を有効にするのに役立ちます。これらのハンドラーは、以下のように Spring XML で設定されます。
<-- Jetty Security handling -->
<bean id="userRealm" class="org.mortbay.jetty.plus.jaas.JAASUserRealm">
    <property name="name" value="tracker-users"/>
    <property name="loginModuleName" value="ldaploginmodule"/>
</bean>

<bean id="constraint" class="org.mortbay.jetty.security.Constraint">
    <property name="name" value="BASIC"/>
    <property name="roles" value="tracker-users"/>
    <property name="authenticate" value="true"/>
</bean>

<bean id="constraintMapping" class="org.mortbay.jetty.security.ConstraintMapping">
    <property name="constraint" ref="constraint"/>
    <property name="pathSpec" value="/*"/>
</bean>

<bean id="securityHandler" class="org.mortbay.jetty.security.SecurityHandler">
    <property name="userRealm" ref="userRealm"/>
    <property name="constraintMappings" ref="constraintMapping"/>
</bean>
Camel 2.3 以降では、 以下のように Jetty ハンドラーのリストを設定できます。
<-- Jetty Security handling -->
<bean id="constraint" class="org.eclipse.jetty.util.security.Constraint">
    <property name="name" value="BASIC"/>
    <property name="roles" value="tracker-users"/>
    <property name="authenticate" value="true"/>
</bean>

<bean id="constraintMapping" class="org.eclipse.jetty.security.ConstraintMapping">
    <property name="constraint" ref="constraint"/>
    <property name="pathSpec" value="/*"/>
</bean>

<bean id="securityHandler" class="org.eclipse.jetty.security.ConstraintSecurityHandler">
    <property name="authenticator">
        <bean class="org.eclipse.jetty.security.authentication.BasicAuthenticator"/>
    </property>
    <property name="constraintMappings">
        <list>
            <ref bean="constraintMapping"/>
        </list>
    </property>
</bean>
注記
Blueprint XML 構文(Apache Karaf コンテナー)では、ref 要素を <ref component-id="constraintMapping"/> として指定する必要があります。
次に、エンドポイントを以下のように定義できます。
from("jetty:http://0.0.0.0:9080/myservice?handlers=securityHandler")
より多くのハンドラーが必要な場合は、ハンドラー オプションを Bean ID のコンマ区切りリストに設定します。
このサンプルを Apache Karaf コンテナーにデプロイする場合、以下の Java パッケージをインポートするように Bundle ヘッダーを設定する必要があります。
org.eclipse.jetty.security
org.eclipse.jetty.util.security
org.eclipse.jetty.security.authentication
たとえば、Maven POM では、felix-maven-plugin プラグインを以下の Import-Package 要素で設定できます。
<Import-Package>
      org.eclipse.jetty.security,
      org.eclipse.jetty.util.security,
      org.eclipse.jetty.security.authentication
</Import-Package>

カスタム HTTP 500 リプライメッセージを返す方法

Camel Jetty が応答するデフォルトのリプライメッセージの代わりに、問題が発生した場合にカスタムリプライメッセージを返す必要がある場合があります。カスタム HttpBinding を使用してメッセージマッピングを制御できますが、多くの場合、Camel の Exception Clause を使用してカスタムリプライメッセージを構築する方が簡単です。たとえば、ここに示すとおり、Dude something wrong with HTTP error code 500 が返されます。
from("jetty://http://localhost:{{port}}/myserver")
    // use onException to catch all exceptions and return a custom reply message
    .onException(Exception.class)
        .handled(true)
        // create a custom failure response
        .transform(constant("Dude something went wrong"))
        // we must remember to set error code 500 as handled(true)
        // otherwise would let Camel thing its a OK response (200)
        .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(500))
    .end()
    // now just force an exception immediately
    .throwException(new IllegalArgumentException("I cannot do this"));

マルチパートフォームのサポート

Camel 2.3.0 以降、camel-jetty は追加設定なしで、multipart フォームへのサポートになります。送信されたフォームデータはメッセージヘッダーにマッピングされます。camel-jetty は、アップロードされたファイルごとに添付ファイルを作成します。ファイル名は、添付の名前にマッピングされます。コンテンツタイプは、添付ファイル名のコンテンツタイプとして設定されます。この例では、こちらを参照してください。
// Set the jetty temp directory which store the file for multi part form
// camel-jetty will clean up the file after it handled the request.
// The option works rightly from Camel 2.4.0
getContext().getProperties().put("CamelJettyTempDir", "target");

from("jetty://http://localhost:{{port}}/test").process(new Processor() {

    public void process(Exchange exchange) throws Exception {
        Message in = exchange.getIn();
        assertEquals("Get a wrong attachement size", 1, in.getAttachments().size());
        // The file name is attachment id
        DataHandler data = in.getAttachment("NOTICE.txt");

        assertNotNull("Should get the DataHandle NOTICE.txt", data);
        // This assert is wrong, but the correct content-type (application/octet-stream)
        // will not be returned until Jetty makes it available - currently the content-type
        // returned is just the default for FileDataHandler (for the implentation being used)
        //assertEquals("Get a wrong content type", "text/plain", data.getContentType());
        assertEquals("Got the wrong name", "NOTICE.txt", data.getName());

        assertTrue("We should get the data from the DataHandle", data.getDataSource()
            .getInputStream().available() > 0);

        // The other form date can be get from the message header
        exchange.getOut().setBody(in.getHeader("comment"));
    }

});

Jetty JMX サポート

Camel 2.3.0 以降、camel-jetty はエンドポイント設定のコンポーネントおよびエンドポイントレベルでの Jetty の JMX 機能の有効化をサポートします。コンポーネントが Camel コンテキストに登録されている MBeanServer への参照を提供するため、このコンポーネントで JMX サポートを有効にするには、JMX を Camel コンテキスト内で有効にする必要があります。camel-jetty コンポーネントは特定のプロトコル/ホスト/ポートペアリングの Jetty リソースをキャッシュして再利用するため、この設定オプションは、プロトコル/ホスト/ポートのペアを使用するために最初のエンドポイントの作成時にのみ評価されます。たとえば、以下の XML フラグメントから作成された 2 つのルートがある場合、JMX サポートは https://0.0.0.0 でリッスンするすべてのエンドポイントに対して有効のままになります。
<from uri="jetty:https://0.0.0.0/myapp/myservice1/?enableJmx=true"/>
<from uri="jetty:https://0.0.0.0/myapp/myservice2/?enableJmx=false"/>
camel-jetty コンポーネントは、Jetty MBeanContainer の直接設定も提供します。Jetty は MBean 名を動的に作成します。Camel コンテキストの外部で Jetty の別のインスタンスを実行し、インスタンス間で同じ MBeanServer を共有する場合は、Jetty MBean を登録するときに名前が競合しないように、両方のインスタンスを同じ MBeanContainer への参照で提供できます。
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

Theme

© 2026 Red Hat
トップに戻る