第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&.. の形式で追加できます。
オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
| 名前 | デフォルト値 | 説明 |
|---|---|---|
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
|
> 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 は、以下のオプションを提供します。
| 名前 | デフォルト値 | 説明 |
|---|---|---|
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>
<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 への参照で提供できます。