10.17. HTTP ゲートウェイの設定
HTTP ゲートウェイは JBoss Enterprise SOA Platform の Application Server の HTTP コンテナーを使用して HTTP エンドポイントを公開するため、多くの設定はコンテナーレベルで管理されます。これらはバインド/ポートアドレス、SSL などです。
以下のコードは、サービスに <http-gateway> を設定する最も簡単な方法を示しています(プロバイダー設定は必要ありません)。
上記の設定では、
デフォルト の HTTP バスプロバイダーを使用します。これは、busrefid 属性を定義しないためです。サービスカテゴリーと名前を使用して、次の形式の HTTP エンドポイントアドレスを構築します。
http://<host>:<port>/<.esbname>/http/Vehicles/Cars
http://<host>:<port>/<.esbname>/http/Vehicles/Cars
<.esbname> トークンは、.esb 拡張のない .esb デプロイメントの名前です。アドレスの http トークンにも注意してください。これは、すべての <http-gateway> エンドポイントに使用されるハードコーディングされた名前空間の接頭辞です。
<http-gateway> は urlPattern もサポートしています。
これにより、サービスの HTTP エンドポイントが公開され、以下のアドレスにあるすべての HTTP 要求が取得されます。
http://<host>:<port>/<.esbname>/http/esb-cars/*
http://<host>:<port>/<.esbname>/http/esb-cars/*
allowedPorts プロパティーを使用して、特定のサービスを 1 つ以上の HTTP ポートに制限できます。これを行うには、以下のように問題のポートのコンマ区切りリストを作成します。
<http-gateway name="Http" urlPattern="esb-cars/*">
<property name="allowedPorts" value="8080,8081">
</http-gateway>
<http-gateway name="Http" urlPattern="esb-cars/*">
<property name="allowedPorts" value="8080,8081">
</http-gateway>
これにより、サービスの HTTP エンドポイントが公開され、以下のポート下のすべての HTTP 要求のみがキャプチャーされます(他のすべてのポートは HTTP ステータスコード 404 - Not Found を受け取ります)。
- http://<host>:8080/*
- http://<host>:8081/*
<http-gateway> は通常、要求 MIME タイプに基づいて HTTP 要求のペイロードをデコードできます。
jbossesb-properties.xml ファイルの core:org.jboss.soa.esb.mime.text.types 設定プロパティーを使用して、ペイロードを文字列としてデコードするか、またはアクションでデコードするサービスを使用するかどうかを決定します。
"core:org.jboss.soa.esb.mime.text.types" 設定プロパティーは、"text" (文字)MIME タイプのセミコロンで区切られたリストであり、デフォルトセットは次のように設定されます(ワイルドカードのサポートに注意)。
- text/*
- application/xml
- application/*-xml
<http-gateway> は、テキストペイロードをデコードする際に要求の文字エンコーディングを使用します。
<http-gateway> は payloadAs 属性もサポートします。これは、上記のデフォルトの MIME タイプベースの動作の上書きとして使用できます。この属性を使用すると、ペイロードを BYTES または string として処理するようにゲートウェイを明示的に指示できます。
HTTP 要求には、サービスが必要とする可能性のあるデータペイロードに加えて、他の多くの情報が含まれています。 この情報は、ゲートウェイによりメッセージの HttpRequest オブジェクトインスタンスに保存されます。 アクション内でこのコードを使用して、その情報にアクセスします。
HttpRequest requestInfo = HttpRequest.getRequest(message);
HttpRequest requestInfo = HttpRequest.getRequest(message);
HttpRequest は、(ゲッターメソッドを介して)以下のプロパティーセットを公開します。
| プロパティー | Description |
|---|---|
| queryParams | クエリーパラメーターが含まれる java.util.Map<String, String[]>。 値は String[] であるため、多値パラメーターをサポートすることに注意してください。 |
| ヘッダー | リクエストヘッダーが含まれる java.util.List<HttpHeader>。 |
| authType | エンドポイントを保護するために使用される認証スキームの名前。認証されていない場合は null です。CGI 変数 AUTH_TYPE の値と同じです。 |
| characterEncoding | この要求の本文で使用される文字エンコーディングの名前。要求が文字エンコーディングを指定しない場合は null。 |
| contentType | 要求の本文のコンテンツタイプ(MIME タイプ)、またはタイプが不明な場合は null。 CGI 変数 CONTENT_TYPE の値と同じです。 |
| contextPath | 要求のコンテキストを示す要求 URI の部分。 コンテキストパスは常にリクエスト URI で最初に行われます。 パスは / 文字で始まりますが、/ 文字で終わりません。 デフォルトの(root)コンテキストのエンドポイントの場合、これは "" を返します。 コンテナーはこの文字列をデコードしません。 (Servlet Spec を参照してください。) |
| pathInfo | この要求時にクライアントが送信する URL に関連付けられた追加のパス情報。追加のパス情報はエンドポイントパスに従いますが、クエリー文字列の前には / 文字で始まります。追加パス情報がない場合は、このメソッドは null を返します。CGI 変数 PATH_INFO の値と同じです。(Servlet Spec を参照してください。) |
| pathInfoToken | pathInfo のトークンが含まれる List<String>。 |
| queryString | クエリー文字列(サーブレット仕様を参照) |
| requestURI | プロトコル名からクエリー文字列までのこの要求 URL の一部。Web コンテナーはこの文字列をデコードしません。(サーブレット仕様 を参照してください) |
| requestPath | エンドポイントを呼び出すこのリクエスト URL の一部。追加のパス情報やクエリー文字列は含まれません。CGI 変数 SCRIPT_NAME の値と同じです。urlPattern が/*であった場合、このメソッドは http のみを返します。(サーブレット仕様 を参照してください) |
| localAddr | 要求が受信したインターフェイスの IP アドレス。 |
| localName | 要求が受信した IP インターフェイスのホスト名。 |
| メソッド | HTTP メソッド |
| protocol | HTTP プロトコルの名前とバージョン |
| remoteAddr | 要求を送信したクライアントまたは最後のプロキシーの IP アドレス。CGI 変数 REMOTE_ADDR の値と同じです。 |
| remoteHost | 要求を送信したクライアントまたは最後のプロキシーの完全修飾名。エンジンが(パフォーマンスを向上させるために)ホスト名を解決できないか、または選択しない場合、これは IP アドレスのドット付き文字列の形式になります。CGI 変数 REMOTE_HOST の値と同じです。 |
| remoteuser | この要求を行うユーザーのログイン(ユーザーが認証されている場合)、またはユーザーが認証されていない場合は null。ユーザー名が後続の各要求と共に送信されるかどうかは、クライアントと認証のタイプによって異なります。CGI 変数 REMOTE_USER の値と同じです。 |
| contentLength | リクエストボディーと入力ストリームで利用可能になった長さ(バイト単位)。長さが不明な場合は -1。HTTP サーブレットの場合、CGI 変数 CONTENT_LENGTH の値と同じです。 |
| requestSessionId | クライアントによって指定されたセッション ID。指定されていない場合は null。 |
| scheme | 使用されているスキーム(http または https のいずれか)。 |
| serverName | 要求が送信されたサーバーのホスト名。Host ヘッダー値の ":" より前の部分(存在する場合)、または解決されたサーバー名、またはサーバー IP アドレスになります。 |
デフォルトでは、このゲートウェイは関連するサービスを同期的に呼び出し、サービス応答ペイロードを HTTP 応答として返します。
HTTP ゲートウェイは常に同期 HTTP クライアントに同期応答を返すため、単語の絶対意味では非同期ではありません。 デフォルトでは、ゲートウェイはアクションパイプラインを同期的に呼び出し、同期サービスの応答をゲートウェイからの HTTP 応答として返します。
このゲートウェイの観点からの非同期応答動作は、アクションパイプラインの非同期呼び出し後にゲートウェイが同期 HTTP 応答を返すことを意味します(つまり、同期サービス呼び出しではありません)。 サービスを非同期的に呼び出すため、同期 HTTP 応答の一部としてサービス応答を返すことはできません。 したがって、非同期応答を行う方法を示すゲートウェイを設定する必要があります。
非同期動作を設定するには、<asyncHttpResponse> 要素を <http-gateway> に追加します。
上記のように設定されている場合、ゲートウェイは HTTP ステータス 200 (OK)でゼロ長 HTTP 応答ペイロードを返します。
非同期応答 HTTP ステータスコードは、<asyncResponse> 要素に statusCode 属性を設定することで、(デフォルトの 200 から)設定できます。
<listeners>
<http-gateway name="Http" urlPattern="esb-cars/*">
<asyncResponse statusCode="202" />
</http-gateway>
</listeners>
<listeners>
<http-gateway name="Http" urlPattern="esb-cars/*">
<asyncResponse statusCode="202" />
</http-gateway>
</listeners>
上記のように、非同期応答のゼロ長ペイロードは(デフォルトでは)を返します。 これは、<asyncResponse> 要素に <payload> 要素を指定して上書きできます。
| プロパティー | Description | 必須 |
|---|---|---|
| classpathResource |
応答ペイロードが含まれるクラスパス上のファイルへのパスを指定します。
| 必須 |
| contentType |
classpathResource 属性で指定されたペイロードデータのコンテンツ/mime タイプを指定します。
| 必須 |
| characterEncoding |
classpathResource 属性で指定されたデータの文字エンコーディング。
| オプション |
ゲートウェイが関連サービスの HttpRequest オブジェクトインスタンスを作成する方法と一貫性があり、関連するサービスは、同期 HTTP ゲートウェイ呼び出しでゲートウェイの HttpResponse オブジェクトを作成できます。
サービスのアクションでこのコードを使用して、応答メッセージに HttpResponse インスタンスを作成および設定します。
HttpResponse オブジェクトには、発信 HTTP ゲートウェイの応答にマップされる以下のプロパティーを含めることができます。
| プロパティー | Description |
|---|---|
| responseCode |
ゲートウェイ応答に設定する HTTP 応答/ステータスコード()。http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
|
| contentType |
レスポンスペイロード MIME タイプ。
|
| encoding |
応答ペイロードのコンテンツエンコーディング。
|
| 長さ |
応答ペイロードのコンテンツの長さ。
|
| ヘッダー |
リクエストヘッダーが含まれる java.util.List<HttpHeader>。
|
注記
このクラスは HttpRouter などの内部アクションでも使用されるため、HttpResponse クラスの使用は効率的であるため、このゲートウェイを使用してプロキシー操作を簡単に実行できます。
注記
応答ペイロードコンテンツエンコーディングは、HttpResponse インスタンスを介して HTTP 応答ステータスコード(ulink url="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html" />)として設定することもできます。
デフォルトでは、このゲートウェイは同期サービス呼び出しが完了するまで 30,000 ミリ秒(30 秒)待機してから ResponseTimeoutException を発生させます。 デフォルトのタイムアウトを上書きするには、synchronousTimeout プロパティーを設定します。
動作パイプラインの例外を、Madoop 設定を介して特定の HTTP 応答コードにマップできます。マッピングはトップレベル <http-provider> で指定でき、<http-gateway> で直接指定することもできます。これにより、<http-provider> でグローバルに定義された例外マッピングのリスナーごとのオーバーライドが可能になります。 以下は、<http-gateway> 設定に直接行われた例外マッピングの例です。
<http-gateway name="http-gateway"> <exception> <mapping class="com.acme.AcmeException" status="503" /> </exception> </http-gateway>
<http-gateway name="http-gateway">
<exception>
<mapping class="com.acme.AcmeException" status="503" />
</exception>
</http-gateway>
<http-provider> レベルでの例外マッピングの設定はまったく同じです。
また、"{exception-class}={http-status-code}" マッピングを含む単純な .properties 形式のファイルであるマッピングファイルを設定することもできます。 ファイルはクラスパスで検索され、.ESB デプロイメント内にバンドルされる必要があります。 これは以下のように設定されます(<http-provider>)が設定されます。