Comments
Transcript
Hints & Tips WebSphere Message Broker
WebSphere Message Broker Hints & Tips 目次 HTTPリクエストの受信の仕組み HTTPとMQのプロトコル変換 エラー処理の実装 その他考慮点 2 Copyright ISE Co,.Ltd HTTPリクエストの受信の仕組み 3 Copyright ISE Co,.Ltd HTTPリクエストの受信の仕組み メッセージ・フローの開始点はHTTP Inputノード メッセージ・フローはHTTPリクエスト受信用の内部キューにメッセージがPUTされると、 フローを開始 メッセージ・フローがGet waitしている内部キューにHTTPリクエストを書き込む仲介役 がHTTPリスナー HTTPリスナー Webサービス・リクエスターとメッセージ・フローの通信を中継 HTTPリスナーはキューを介してメッセージ・フローと連携 –メッセージ・フローはHTTPリクエスト用のキュー(SYSTEM.BROKER.WS.INPUT)をGet Waitする HTTPリスナーは、ブローカーごとに1つ起動され、実行グループ(DataFlowEngine)とは別の プロセス(biphttplistener)で起動 メッセージ・フローはHTTPリスナーからの要求をHTTPInputノードで受け、 HTTPReplyノードで応答を返却 4 Copyright ISE Co,.Ltd HTTPリスナーと メッセージ・フロー HTTPリスナーの設定項目 Listenポートはブローカーの属性で設定. デフォルトは7080 mqsicreatebroker、mqsichangebrokerの-Pオプションで設定 HTTPリスナーのThreadPoolSizeは200 変更時はmqsichangepropertiesでHTTPConnectorのmaxThreadsに値を設定 Webサービス・リクエスター HTTPリクエスト HTTPリスナー(biphttplistener) ゲートウェイ(スレッド) HTTPレスポンス 実行グループ(DataFlowEngine) メッセージ・フロー1(スレッド) MQPUT MQGET WAIT : SYSTEM.BROKER.WS.INPUT メッセージ・フロー2(スレッド) SYSTEM.BROKER.WS.REPLY 5 Copyright ISE Co,.Ltd HTTPとMQのプロトコル変換 6 Copyright ISE Co,.Ltd HTTPとMQのプロトコル変換 WMBを介することで、既存のMQアプリケーションをWebサービス・プロバイダーとして公開 可能 Webサービス・リクエスターはHTTPプロトコルでWMBへアクセス MQアプリケーションはMQプロトコルでメッセージを送信/受信 WMBでHTTPとMQのプロトコル変換を実施 「リクエスト・フロー」ではHTTP要求を、MQメッセージに変換し、既存アプリケーションに送信 「リプライ・フロー」ではアプリケーションの返答をMQで受信し、HTTPリプライに変換してリクエスターに送信 リクエストとリプライの関連付けは、内部的にHTTPリスナとメッセージ・フロー間でRequestIdによって行う (詳しくは後述) WebSphere Message Broker HTTPリスナー <リクエスト・フロー> CWF/MQ SOAP/HTTP Webサービス リクエスター MQアプリケーション <リプライ・フロー> Reply.Q 7 Copyright ISE Co,.Ltd リクエスト・フローでの設定項目① コンテキスト情報の引継ぎ HTTPInputノードで受信したメッセージにはMQメッセージで必要となるコンテキスト情報がない フローの中で明示的にセットするか、デフォルトで自動的に付加する設定が必要となる MQOutputノードの「メッセージ・コンテキスト」プロパティで設定 以下のいずれかの値に設定 –すべて設定 –IDを設定 –デフォルト フロー内で明示的に値を設定する IDのみフロー内で明示的に値を設定する(その他は自動設定) すべての値を自動的に設定させる デフォルトの「すべてを渡す」では、MQRC_CONTEXT_HANDLE_ERROR(2097)のエラーが発生 明示的に値を設定する場合は、合わせて、Computeノードで値の設定を実装する必要がある 8 Copyright ISE Co,.Ltd リクエスト・フローでの設定項目② メッセージのフォーマット変換 Computeノードを使用して、フォーマット変換処理を実装 必要となる設定項目 リクエストとリプライの関連付けのためのRequestIdの引継ぎ –LocalEnvironmentツリー内に保持されたRequestIdをリクエストとリプライの間で引き継ぐ –RequestIdを引き継ぐ例: リクエスト・フローのComputeノードで、LocalEnvironmentツリーからRequestIdを取り出し、 既存アプリケーションに渡すメッセージのMQMD.MsgIdにセット ・・・① MQアプリケーションは、要求メッセージのMsgIdをCorrelIdにコピーして、応答メッセージをリ プライ・フローに渡す リプライ・フローのComputeノードで、応答メッセージのMQMD.CorrelIdを LocalEnvironmentツリーの元の場所セット フォーマット変換ロジックの実装(HTTP→MQ) –MQメッセージ用のMRM情報のセット ・・・② –MQMDヘッダーの作成 ・・・③ –HTTPヘッダの削除 ・・・④ –メッセージのデータ部の作成 ・・・⑤ ※①~⑤は次ページのコーディング例中の 数字に対応 9 Copyright ISE Co,.Ltd フォーマット変換ロジックの実装(SOAP/HTTP→MQ): サンプル Root HTTP要求→MQメッセージへの変換ロジック例 Properties HTTPInputHeader CREATE COMPUTE MODULE msgflow01_Compute MRM CREATE FUNCTION Main() RETURNS BOOLEAN soapenv:Header BEGIN soapenv:Body ネームスペースの宣言 DECLARE soapenv NAMESPACE ‘http://schemas.xmlsoap.org/soap/envelope/‘; DECLARE tns NAMESPACE 'http://ws.jp.ise.com‘; tns:request CustomerNo CustomerName Propertiesヘッダーのみコピー(HTTPInputHeaderは削除) SET OutputRoot.Properties = InputRoot.Properties; ・・・④ SET OutputRoot.MQMD.MsgId = InputLocalEnvironment.HTTP.RequestIdentifier; SET OutputRoot.MQMD.ReplyToQ = ‘REPLY.Q’; SET OutputRoot.Properties.MessageSet = ‘MSGSET_CWF’; SET OutputRoot.Properties.MessageType = ‘MSG01’; SET OutputRoot.Properties.MessageFormat = ‘CWF’; SET OutputRoot.properties.CodedCharSetId = 943; SET OutputRoot.MRM.Order.CustomerNo = InputBody.soapenv:Body.tns:request.CustomerNo; SET OutputRoot.MRM.Order.CustomerName = InputBody.soapenv:Body.tns:request.CustomerName; : ・・・① ③ ② Root Properties ⑤ MQMD MRM Order CustomerNo CustomerName 10 Copyright ISE Co,.Ltd リプライ・フローでの設定項目 メッセージのフォーマット変換 Computeノードを使用して、フォーマット変換処理を実装する 必要となる設定項目 リプライのMQMD.CorrelIdにセットされたRequestIdをLocalEnvironmentツリーにコピーす る ・・・① フォーマット変換ロジックの実装(MQ→HTTP) –HTTPメッセージ用のMRM情報のセット ・・・② –MQMDヘッダーの削除 ・・・③ –SOAP/HTTPメッセージの作成 ・・・④ ※①~④は次ページのコーディング例中の 数字に対応 11 Copyright ISE Co,.Ltd フォーマット変換ロジックの実装(MQ→SOAP/HTTP): サンプル Root MQメッセージ→ HTTP応答への変換ロジック例 Properties MQMD MRM CREATE COMPUTE MODULE msgflow02_Compute Order CREATE FUNCTION Main() RETURNS BOOLEAN CustomerNo CustomerName BEGIN ネームスペースの宣言 DECLARE soapenv NAMESPACE 'http://schemas.xmlsoap.org/soap/envelope/‘; DECLARE tns NAMESPACE 'http://ws.jp.ise.com‘; Propertiesヘッダーのみコピー(MQMDヘッダーは削除) SET OutputRoot.Properties = InputRoot.Properties; SET OutputLocalEnvironment.HTTP.RequestIdentifier = InputRoot.MQMD.CorrelId; SET OutputRoot.Properties.MessageSet = ‘MSGSET_WSDL’; SET OutputRoot.Properties.MessageType = ‘Envelope’; SET OutputRoot.Properties.MessageFormat = ‘XML’; SET OutputRoot.properties.CodedCharSetId = 1208; SET OutputRoot.MRM.soapenv:Body.tns:response.CustomerNo = InputBody.Order.CustomerNo; SET OutputRoot.MRM.soapenv:Body.tns:response.CustomerName = InputBody.Order.CustomerName; ・・・③ ・・・① Root ② Properties HTTPReplyHeader MRM ④ soapenv:Header soapenv:Body tns:response CustomerNo CustomerName : 12 Copyright ISE Co,.Ltd エラー処理の実装 13 Copyright ISE Co,.Ltd HTTPフローでの エラー処理 エラーの発生パターン WMBがWebサービス・プロバイダーの場合 メッセージ・フローの処理でエラーが発生する –HTTPInputノードがFaultメッセージを返す(デフォルト) –ユーザーがFaultメッセージを作成して返す WMBから応答が戻らずタイムアウトが発生する –HTTPリスナーからFaultメッセージを返す(デフォルト) WMBがWebサービス・リクエスターの場合 サービス・プロバイダーでエラーが発生する –プロバイダーからFaultメッセージが返され、HTTP RequestノードのErrorターミナルに出力 サービス・プロバイダーから応答がなく、タイムアウトが発生するなどの例外が発生する –HTTP Requestノードでのエラーとなる –上記「メッセージ・フローの処理でエラーが発生」した場合と同じ 14 Copyright ISE Co,.Ltd Webサービス・プロバイダー: エラー処理 メッセージ・フローの処理でのエラー HTTPInputノードのデフォルトの例外ハンドリングは、システム・ログの出力+ 例外ツリーの返却 HTTPステータス・コード500を返却 HTTPInputノードの「障害フォーマット」でエラー応答のフォーマットを選択可能 ・SOAP1.1、SOAP1.2、HTML HTTPリクエスト HTTPリスナー HTTPレスポンス 例 : HTMLフォーマット ・シス・ログにエラー・メッセージ出力 ・エラー応答メッセージをMQPUT <html> <head> <META http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Fault from SOAP-ENV:Server (Exception)</title> </head> <body> <h1>Fault from SOAP-ENV:Server (Exception)</h1> Fault string: BIP3113E: メッセージ・フロー HTTP Input (ブローカー BRKR601) で例外が発生しました。 <br> Fault actor : HTTP:http://localhost:7080/test<br> ノード により例外が発生しました。テキストは '''' です。 : Fault detail: BIP3001I: throw 'webservice_provider.Throw1' F:¥build¥S600_P¥src¥DataFlowEngine¥BasicNodes¥ImbThrowNode.cpp: 265: ImbThrowNode::evaluate: ComIbmThrowNode: webservice_provider#FCMComposite_1_5<br> </body> </html> 15 Copyright ISE Co,.Ltd Webサービス・プロバイダー: エラー処理 ユーザー・フォーマットでのエラー応答 Catchターミナルで例外を捕捉し、応答メッセージをユーザーで編集可能 HTTPリクエスト HTTPリスナー HTTPレスポンス 応答メッセージの編集 実装例 CALL CopyMessageHeaders(); ネームスペースの宣言 DECLARE soapenv NAMESPACE ‘http://schemas.xmlsoap.org/soap/envelope/‘; DECLARE tns NAMESPACE 'http://ws.jp.ise.com‘; MRM情報のセット SET OutputRoot.Properties.MessageSet = ‘provider’; SET OutputRoot.Properties.MessageType = ‘Envelope’; SET OutputRoot.Properties.MessageFormat = ‘XML1’; Faultメッセージの作成 SET OutputRoot.MRM.soapenv:Fault.faultcode = ‘Sender’; SET OutputRoot.MRM.soapenv:Fault.faultstring = ‘メッセージフロー”test1”でエラーが発生しました’; SET OutputRoot.MRM.soapenv:Fault.faultactor = ‘http://localhost:7080/wmb’; SET OutputRoot.MRM.soapenv:Fault.detail = InputExceptionList; RETURN TRUE; 16 Copyright ISE Co,.Ltd Webサービス・プロバイダー: エラー処理 タイムアウト・エラー メッセージ・フローからの応答がタイムアウトすると、HTTPリスナーはエラー応答を代替返却 タイムアウトまでの時間は、HTTPInputノードの「最大クライアント待機時間」(単位:秒) HTTPステータス・コード504を返却 HTTPInputノードの「障害フォーマット」でエラー応答のフォーマットを選択可能 ・SOAP1.1、SOAP1.2、HTML 例 : SOAP1.1 フォーマット HTTPリクエスト <?xml version='1.0' encoding='UTF-8'?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> HTTPレスポンス サーブレット(スレッド) MQPUT MQGET WAIT NO_MSG_AVAIRABLE <SOAP-ENV:Body> <SOAP-ENV:Fault> MQGETのタイムアウトが発生すると、エラー応答を代替返却 <faultcode>SOAP-ENV:Server</faultcode> <faultstring>A timeout occurred during processing</faultstring> <faultactor>/test</faultactor> <detail> <text>Timeout. Broker BRKR601 did not provide a response within the specified time interval (10 seconds)</text> </detail> </SOAP-ENV:Fault> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 17 Copyright ISE Co,.Ltd Webサービス・リクエスター: エラー処理 HTTPRequestノードのエラー・ハンドリングは2種類 Errorターミナルにメッセージ出力 正常(100~299)の範囲外のステータス・コードを伴うHTTPレスポンスをErrorターミナルに出力 「HTTP(s)転送を使用」をチェックすれば、リダイレクション(ステータス・コード300番台)は正しくハンドリング メッセージをパースせず、バイナリのまま出力 上記以外のエラーは、例外を生成 HTTPリクエストの組み立てに失敗、 HTTPサーバーへの接続に失敗、 時間内(「要求タイムアウト」の設定値)にHTTPレスポンスが戻らない、HTTPレスポンスのパースに失敗 など Failureターミナル、入力ノードのCatchターミナルで例外を捕捉可能 Root ステータス・コード 100~200以外 Properties HTTPResponseHeader BLOB Error UnknownParserName BLOB その他のエラーは、例外を生成 18 Copyright ISE Co,.Ltd その他考慮点・障害情報 19 Copyright ISE Co,.Ltd トランザクションの問題 同期点処理とトランザクションの整合性 HTTPInput、HTTPReplyは、内部キューへのMQGET/MQPUTを同期点処理しない データベース、MQへの資源更新を同期点処理していると、 HTTPレスポンスが正常に返却されているのに、資源更新が取り消される障害ウィンドウが存在 ブローカー・コーディネションでのトランザクション処理 HTTPリクエスト HTTPリスナー SYSTEM.BROKER.WS.INPUT HTTPレスポンス SYSTEM.BROKER.WS.REPLY DB UPDATE MQPUT no_sync MQGET no_sync MQPUT with_sync MQCMIT DB commit このウィンドウで障害が発生すると、正常のHTTPレスポンスが 返却されているのに、資源更新がバックアウトの不整合が発生 回避方法 メッセージ・フロー内のすべての資源更新を即時にコミット 20 Copyright ISE Co,.Ltd