サンプルコード (FileToFileのCamelサンプル) | 2012-03-13 17:34 |
documents (OSC2015沖縄セミナー資料) | 2015-07-09 11:48 |
注意:このページは「 http://camel.apache.org/ 」のCamel ver.2.9.2時点での日本語訳です。 誤訳が含まれていますので、正確な情報が欲しい人は本家サイトを参照してください。
HTTP4コンポーネントはHTTPクライアントとして動作します。
Camel ver.2.9.2 ではHttpClient 4.1.3 ( http://hc.apache.org/ )を利用しています。
Mavenユーザは次のdependencyをpom.xmlに追加する必要があります。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-http4</artifactId> <version>x.x.x</version> <!-- use the same version as your Camel core version --> </dependency>
Camel-http4 vs camel-http Camel-http4 は HttpClient 4.x を使い、camel-http は HttpClient 3.x を使っています。
http4:hostname[:port][/resourceUri][?options]
portのデフォルト値はHTTPで80、HTTPSで443になります。
ユーザーはクエリオプションをURIに次のフォーマットで追加する事ができます。
camel-http4 vs camel-jetty ユーザーはHTTP4コンポーネントを使ってエンドポイントの送信側だけは作る事ができます。しかし、Camelルートの入力としては使えません。Camelルートの入力としてHTTPサーバを使ったHTTPエンドポイントを置きたい場合はJettyコンポーネントを使います。
名前 | デフォルト値 | 説明 |
x509HostnameVerifier | BrowserCompatHostnameVerifier | Camel 2.7以降:ユーザーはRegistryにある異なったorg.apache.http.conn.ssl.X509HostnameVerifierインスタンスを参照する事ができます。例えば、org.apache.http.conn.ssl.StrictHostnameVerifier や org.apache.http.conn.ssl.AllowAllHostnameVerifier. |
throwExceptionOnFailure | true | リモートサーバからの失敗レスポンスの時、HttpOperationFailedException を投げるのを無効にするオプション。これはHTTPステータスコードにかかわらずユーザーが全てのレスポンスを取得する事ができます。 |
bridgeEndpoint | false | trueの場合、HttpProducerはExchange.HTTP_URIヘッダを無視する事ができます。そしてエンドポインのURIをリクエストとして使います。さらに、全ての失敗レスポンス戻りをHttpProducerに送り出させる為にthrowExcpetionOnFailure をfalseにセットするかもしれません。もしtrueに設定した場合、content-encodingが"gzip"の場合にHttpProducerとCamelServletはgzip処理をスキップします。 |
disableStreamCache | false | このオプションをfalseにセットした場合、DefaultHttpBindingはリクエスト入力ストリームをストリームキャッシュにコピーして、メッセージボディにセットします。これでマルチ読み込みをサポートできます。そうでない場合、DefaultHttpBindingはリクエストの入力ストリームをメッセージボディに直接的にセットします。 |
httpBindingRef | null | Registry内の org.apache.camel.component.http.HttpBindingを参照する。httpBinding オプションをかわりに使う事をおすすめする |
httpBinding | null | カスタムorg.apache.camel.component.http.HttpBinding.に使う |
httpClientConfigurerRef | null | Registry内の org.apache.camel.component.http.HttpClientConfigurerを参照する。httpClientConfigurerオプションを代わりに使う事をおすすめする。 |
httpContext | null | Camel 2.9.2以降: |
httpContextRef | null | Camel 2.9.2以降: |
httpClientConfigurer | null | |
httpClient.XXX | null | |
clientConnectionManager | null | |
transferException | false | |
maxTotalConnections | 200 | |
connectionsPerRoute | 20 | |
sslContextParametersRef | null | Camel 2.8以降: |
Camel 2.8.0以降
名前 | デフォルト値 | 説明 |
authUsername | null | 認証用のユーザー名 |
authPassword | null | 認証用のパスワード |
authDomain | null | 認証用のドメイン名 |
authHost | null | 認証用のホスト名 |
proxyAuthHost | null | プロキシホスト名 |
proxyAuthPort | null | プロキシポート名 |
proxyAuthScheme | null | プロキシスキーム |
proxyAuthUsername | null | プロキシ認証用のユーザー名 |
proxyAuthPassword | null | プロキシ認証用のパスワード |
proxyAuthDomain | null | プロキシドメイン名 |
proxyAuthNtHost | null | プロキシNTホスト名 |
名前 | デフォルト値 | 説明 |
httpBinding | null | カスタムorg.apache.camel.component.http.HttpBindingに使用 |
httpClientConfigurer | null | カスタムorg.apache.camel.component.http.HttpClientConfigurerに使用 |
httpConnectionManager | null | カスタムorg.apache.commons.httpclient.HttpConnectionManager.に使用 |
httpContext | null | Camel 2.9.2以降:リクエスト実行時にカスタムorg.apache.http.protocol.HttpContextに使用 |
x509HostnameVerifier | null | Camel 2.7以降:カスタムorg.apache.http.conn.ssl.X509HostnameVerifier.に使用 |
sslContextParameters | null | Camel 2.8以降:コンポーネントレベルでカスタムSSL/TLS設定オプションを設定。より詳細は「JSSE設定ユーティリティを使用」を参照 |
名前 | デフォルト値 | 説明 |
Exchange.HTTP_URI | String | 呼び出す用のURI。エンドポイントに直接的にセットして既存のURIを上書きします。 |
Exchange.HTTP_PATH | String | リクエストURIパス。このヘッダはHTTP_URIと一緒にリクエストURIを構築する為に使われます。 |
Exchange.HTTP_QUERY | String | URIパラメータ。エンドポイント上に直接設定して既存のURIパラメータを上書きします。 |
Exchange.HTTP_RESPONSE_CODE | int | 外部サーバからのHTTPレスポンスコード。OKの場合は200です。 |
Exchange.HTTP_CHARACTER_ENCODING | String | 文字エンコーディング |
Exchange.CONTENT_TYPE | String | HTTP content type. content typeを指定する為にメッセージのINとOUt両方にセットされます。例えばtext/html |
Exchange.CONTENT_ENCODING | String | HTTP contentエンコーディング。contentエンコーディングを指定する為に、メッセージのINとOUTにセットされます。例えばgzip |
Camelは外部サーバからのHTTPレスポンスをボディのOUTに保存します。メッセージのINからの全てのヘッダはメッセージのOUTにコピーされます。 これで流れているヘッダは温存されます。そして、CamelはHTTPレスポンスヘッダをメッセージヘッダのOUTに追加します。
CamelはHTTPレスポンスコードに従ってハンドリングします。
throwExceptionOnFailure オプションにあるthrowExceptionOnFailureは、レスポンスコードによって投げられるHttpOperationFailedExceptionを止める為にfalseに設定する事ができます。これはリモートサーバからの全てのレスポンスを許可する事になります。
この例外は次の情報を含んでいます
次のアルゴリズムは、HTTPメソッドとしてGETかPOSTを決める際に使われます。
ユーザはここにある2つのCamelタイプコンバーターを使ってアクセスする事ができます。
注:ユーザーはリクエストレスポンスをプロセッサーからだけでは無く、camel-jettyやcamel-cxfエンドポイントの後でも取得できます。
HttpServletRequest request = exchange.getIn().getBody(HttpServletRequest.class); HttpServletRequest response = exchange.getIn().getBody(HttpServletResponse.class);
ユーザーはエンドポイントURIからHTTPプロデューサのURIを直接セットする事ができます。次のルートでは、Camelは外部サーバoldhostをHTTPを使って呼び出します。
from("direct:start") .to("http4://oldhost");
Spring環境のサンプル
<camelContext xmlns="http://activemq.apache.org/camel/schema/spring"> <route> <from uri="direct:start"/> <to uri="http4://oldhost"/> </route> </camelContext>
ユーザーはHTTPエンドポイントURIに対してメッセージ上のHTTPConstants.HTTP_URIのヘッダーキーを使って上書きする事ができます。
from("direct:start") .setHeader(HttpConstants.HTTP_URI, constant("http://newhost")) .to("http4://oldhost");
上記の例では、Camelはエンドポイントがhttp4://oldhostと設定されているにもかかわらず、http://newhostを呼び出します。
Constantsのクラスの場所は org.apache.camel.component.http4.Constants
httpプロデューサはHTTPサーバに送信するためのURIパラメータをサポートしています。このURIパラーメータは直接エンドポイントURIにセットするか Exchange.HTTP_QUERYヘッダーキーをメッセージにセットする事ができます。
from("direct:start") .to("http4://oldhost?order=123&detail=short");
もしくはヘッダでオプションを指定
from("direct:start") .setHeader(Exchange.HTTP_QUERY, constant("order=123&detail=short")) .to("http4://oldhost");
HTTP4コンポーネントはHTTPリクエストメソッドをメッセージヘッダの設定で設定する方法を提供しています。サンプルはこれです。
from("direct:start") .setHeader(Exchange.HTTP_METHOD, constant(org.apache.camel.component.http4.HttpMethods.POST)) .to("http4://www.google.com") .to("mock:results");
このメソッドはstring constatntsを使って少し短く書く事ができます。
.setHeader("CamelHttpMethod", constant("POST"))
Spring環境での例
<camelContext xmlns="http://activemq.apache.org/camel/schema/spring"> <route> <from uri="direct:start"/> <setHeader headerName="CamelHttpMethod"> <constant>POST</constant> </setHeader> <to uri="http4://www.google.com"/> <to uri="mock:results"/> </route> </camelContext>
HttpSOTimeoutTestユニットテストを参照。
HTTP4コンポーネントはプロキシを設定する方法を提供しています
from("direct:start") .to("http4://oldhost?proxyAuthHost=www.myproxy.com&proxyAuthPort=80");
また、proxyAuthUsernameとproxyAuthPasswordオプションを使ったプロキシ認証もサポートしています。
システムプロパティの衝突を避けるために、CamelContextかURIを使ってプロキシ設定だけをセットする事ができます。
Jara DSL:
context.getProperties().put("http.proxyHost", "172.168.18.9"); context.getProperties().put("http.proxyPort" "8080");Spring XML:
<camelContext> <properties> <property key="http.proxyHost" value="172.168.18.9"/> <property key="http.proxyPort" value="8080"/> </properties> </camelContext>Camelは最初にJavaシステムかCamelContextプロパティ設定をセットします。そしてもし指定されていたらエンドポイントプロキシオプションをセットします。 これでユーザーはシステムプロパティをエンドポイントオプションで上書きする事ができます。
データを送信するためにPOSTを使う時、Exchangeプロパティを使ってcharsetを設定する事ができます。
exchange.setProperty(Exchange.CHARSET_NAME, "ISO-8859-1");
このサンプルではGoogleホームページを10秒毎にポーリングして、message.htmlファイルにページを書き出します。
from("timer://foo?fixedRate=true&delay=0&period=10000") .to("http4://www.google.com") .setHeader(FileComponent.HEADER_FILE_NAME, "message.html") .to("file:target/google");
このサンプルでは、Webブラウザでユーザーが入力したような完全なURIエンドポイントを使っています。色々なURIパラメータは もちろんちょうどユーザーがWebブラウザでやっているのと同じようにセパレータとして&文字を使う事ができます。
// we query for Camel at the Google page template.sendBody("http4://www.google.com/search?q=Camel", null);
Map headers = new HashMap(); headers.put(HttpProducer.QUERY, "q=Camel&lr=lang_en"); // we query for Camel and English language at Google template.sendBody("http4://www.google.com/search", null, headers);
上記のヘッダ値の注意点として、?を頭につけません。そして&文字は通常のようにパラメータの分離として使えます。
ユーザーはHTTP4コンポーネントからHTTPレスポンスコードを取得する事ができます。これはHttpProducer.HTTP_RESPONSE_CODEの メッセージヘッダのOUTから値を取得できます。
Exchange exchange = template.send("http4://www.google.com/search", new Processor() { public void process(Exchange exchange) throws Exception { exchange.getIn().setHeader(HttpProducer.QUERY, constant("hl=en&q=activemq")); } }); Message out = exchange.getOut(); int responseCode = out.getHeader(HttpProducer.HTTP_RESPONSE_CODE, Integer.class);
クッキーを無効化するために、ユーザーはURIオプションを追加する事でHTTP Clientにクッキー無効化をセットする事ができます。
httpClient.cookiePolicy=ignoreCookies
ユーザーがHTTPプロデューサに対してもっとコントロールが必要な場合、ユーザーはHttpComponentを使う必要があります。 これはカスタム動作を提供する様々なクラスをセットする事ができます。
エンドユーザーのレポートによると、HTTPSを使って認証する所で問題が発生しました。
この問題は最終的には解決して、HTTPSサーバがHTTPコード401を返していませんでした。
次のURIオプションを設定する事で解決しました。:
httpClient.authenticationPreemptive=true
プログラム的にコンポーネントの設定
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); HttpComponent httpComponent = getContext().getComponent("http4", HttpComponent.class); httpComponent.setSslContextParameters(scp);
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="https4://127.0.0.1/mail/?sslContextParametersRef=sslContextParameters"/>...
KeyStore keystore = ...; KeyStore truststore = ...; SchemeRegistry registry = new SchemeRegistry(); registry.register(new Scheme("https", 443, new SSLSocketFactory(keystore, "mypassword", truststore)));
ユーザーがこれをSpring DSLを使って行うには、ユーザーはURIを使って自分のHttpClientConfigurerを指定する事ができます。例として:
<bean id="myHttpClientConfigurer" class="my.https.HttpClientConfigurer"> </bean> <to uri="https4://myhostname.com:443/myURL?httpClientConfigurer=myHttpClientConfigurer"/>
ユーザーがHttpClientConfigurerを実装して自分のkeystoreとtruststoreを設定している限り、これは動作します。