...

Hints & Tips WebSphere Message Broker

by user

on
Category: Documents
108

views

Report

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
Fly UP