OpenSOAP Transaction Service ドキュメント 2002/2/28 トランザクション管理サービス本体は,src/tools/Transaction/にあります. Clientと入出金サービスのサンプルはsamples/Transaction/にあります. 1.概要 OpenSOAP Transaction Service(以下,トランザクションサービス)は,以下 の機能を実現します. ・仕様にしたがって複数の要求メッセージがそれぞれSOAP Bodyblockとして挿 入されたSOAPメッセージ(SOAP Envelope)をクライアントから受け取る(例1) と,それぞれを要求メッセージとしてEnvelopeを分割生成(例2)し,指定さ れた各URL(endpoint)に送信します. ・トランザクションサービスに対応した各サービスから,仕様にしたがって返 答メッセージを受け取ると,各サービスの処理の成功・失敗に応じて, COMMIT要求,もしくはROLLBACK要求を再送します. ・各サービスからのレスポンスメッセージと,最終的な処理結果(COMMITまた はROLLBACK)をクライアントに返送します. ・OpenSOAPサーバと連携することで,クライアントは非同期的に最終メッセー ジを受け取ることが出来ます. トランザクションサービスを利用するためには,クライアントと,トランザク ションサービスから接続される各サービスがトランザクションサービスに対応 している必要があります. 2.クライアント仕様(リクエストメッセージ) クライアントは以下の仕様に従ったリクエストメッセージを送信できる必要が あります. 2.1.トランザクション制御記述ブロック リクエストメッセージのBody()に含まれる最初のBodyblock はである必要があります(例1). ブロックのnamespaceは"http://services.opensoap.jp/transaction/"である ことが望ましいです. ブロックには,トランザクション処理の対象となるサー ビスの数だけ,子要素が,要求される処理の順番に並んでいる必要 があります. 要素には各サービスがトランザクション処理として実行可能なSOAP メッセージの送信先URLを記述します.また,各要求処理ごとに固有の任意の 属性値"transactionRequestID"を付加します. その他,トランザクション処理に関わる処理設定はこのブロックに記述されま す.(β版での実装は要素のみ) 2.2.トランザクションヘッダブロック 各サービスに送信されるべきメッセージのヘッダ部が存在する場合,トランザ クションヘッダブロックの要素として記述します (例1).この部分に記述された要素は,各サービスに送信されるSOAPメッセー ジのヘッダブロック(の直下のブロック)として挿入され ます.ブロックのnamespaceは "http://services.opensoap.jp/transaction/"であることが望ましいです. 各ブロックには,ブロックの 要素の対応する属性値"transactionRequestID"を付加する必要があ ります.ブロックは第2Bodyblock以降であれば, どの順番で挿入されていてもかまいません. 2.3.トランザクションボディブロック 各サービスに送信されるべきメッセージのボディ部は,トランザクションボディ ブロックの要素として記述します(例1).この部分に 記述された要素は,各サービスに送信されるSOAPメッセージのボディブロック (の直下のブロック)として挿入されます. ブロックのnamespaceは "http://services.opensoap.jp/transaction/"であることが望ましいです. 各ブロックには,ブロックの 要素の対応する属性値"transactionRequestID"を付加する必要があ ります.ブロックも,ブロッ ク同様,第2Bodyblock以降であれば,どの順番で挿入されていてもかまいま せん. 例1. OpenSOAP Transaction Request Envelope A銀行に出金の要求をし,それが受け入れられたらB銀行に同額の入金要求をす るトランザクションの例. http://opensoap.jp/cgi-bin/soapInterface.cgi http://opensoap.jp/cgi-bin/b_bank_transfer.cgi 1338675 $5000 b_bank:1252412 true 1252412 $5000 a_bank:1338675 3.トランザクション対応サービス仕様 OpenSOAP Transaction Serviceに対応したサービスは,クライアントが生成す るSOAPメッセージの仕様(ヘッダブロック,ボディブロックの内容)とサービ スの機能をクライアントに公開すると供に,トランザクションサービスとの接 続について,以下の仕様に従う必要があります. 3.1.要求処理に対する返信 トランザクションサービスによって分割生成された各Envelope(例2)は,対応 するそれぞれのendpointに送信されます.各サービスは,Envelopeにしたがっ て要求された処理を行い,その処理をRollbackできる状態で保存した後,レス ポンスメッセージ(例3)をトランザクションサービスに返信します.レスポン スメッセージの仕様は各サービスごと独自でかまいませんが,第1ボディブロッ クの直下には処理の結果を記述する子要素を含む必要が あります. には,そのサービスでの処理の成功を通知する"SUCCESS" を記述します.それ以外の文字列,もしくはサービスから等 が返信された場合は,そのサービスでの処理は失敗,もしくは拒否されたもの とみなされます. また,には,サービス内で固有の識別IDを属性値 "transactionID"として付加することができます."transactionID"属性を使う と,次のステップでトランザクションサービスからCOMMITまたはROLLBACKの要 求がなされた時に,サービス内で整合をとることができます. 3.2.COMMITまたはROLLBACK要求 トランザクションサービスはサービスから成功("SUCCESS")が返信されると, ブロックに記述された順番に従って次のサービスへのリ クエストメッセージを送信します. 全てのサービスからSUCCESSが返信された場合,トランザクションサービスは 再び全てのendpointに対して対応する"transactionID"属性値を付加した COMMIT要求メッセージ(例4)を送信して一連の処理の実行を決定します. 全てのサービスからSUCCESSが返信される前に,途中のサービスから失敗メッ セージが返信されると,その前までにSUCCESSが返信されたサービス群に対し て"transactionID"属性値を付加したROLLBACK要求メッセージを送信します. 3.3.処理の完結 COMMIT要求を受け取ったサービスは要求された処理を実行して終了し, ROLLBACK要求を受け取ったサービスは対応する処理を取り消します.さらに, トランザクションサービスにそれぞれの処理が完了した旨のSOAPメッセージ (例5)を返信します. 例2(A).A銀行へ送信されるSOAP Envelope 1338675 $5000 b_bank:1252412 例2(B).B銀行へ送信されるSOAP Envelope 1252412 $5000 a_bank:1338675 例3.A銀行からのレスポンスの例 SUCCESS 1338675 sent $5000 to b_bank:1252412 例4.トランザクションサービスからA銀行へのCOMMIT要求 COMMIT 例5.A銀行からCOMMIT要求に対する返信 COMMITED 4.クライアントへの返信 トランザクションサービスは,一連の処理の結果をリクエストメッセージと同 様にひとつのEnvelopeに結合し(例6),クライアントに返信します.SOAPメッ セージの最初のボディブロックブロックには,トラン ザクションの最終結果が,COMMITまたはROLLBACKとして記述されます.2つめ 以降のボディブロックは,各サービスから返信されたレスポンスメッセージの ヘッダブロックがブロックに,ボディブロックが ブロックに,さらにCOMMITもしくはROLLBACKを送信し た際のレスポンスメッセージのボディブロックが に,それぞれリクエストメッセージに 付加した属性値"transactionRequestID"と同じ属性値が付加されて挿入されま す. 例6.クライアントに返信されるトランザクション処理結果 COMMIT SUCCESS <:Comment xmlns:=""> 1338675 sent $5000 to b_bank:1252412 COMMITED SUCCESS 1252412 received $5000 from a_bank:1338675 COMMITED