OpenSOAP Logo OpenSOAP Project
The Middleware as Platform for IT Application Services

メニュー

-トップ
-OpenSOAPについて
-リリース
-ドキュメント

-ダウンロード
-協力
-リンク

-FAQ
-バグ情報
-ロードマップ

-検索
-連絡先
-バグジラ

English version

OpenSOAP Transaction Document

トランザクション管理サービス本体は,src/tools/Transaction/にあります.
Clientと入出金サービスのサンプルはsamples/Transaction/にあります.

1.概要

OpenSOAP Transaction Service(以下,トランザクションサービス)は,以下の手順によって,簡易的な2フェイズコミットメント・トランザクションを実現します.

  1. 仕様にしたがって複数の要求メッセージがそれぞれSOAP Bodyblockとして挿入されたSOAPメッセージ(SOAP Envelope)をクライアントから受け取る(例1)と,それぞれを要求メッセージとしてEnvelopeを分割生成(例2)し,指定された各URL(endpoint)に送信します.
  2. トランザクションサービスに対応した各サービスから,仕様にしたがって返答メッセージを受け取ると,各サービスの処理の成功・失敗に応じて,COMMIT要求,もしくはROLLBACK要求を再送します.
  3. 各サービスからのレスポンスメッセージと,最終的な処理結果(COMMITまたはROLLBACK)をクライアントに返送します.

トランザクションサービスは,次のような特徴を持っています.

  • OpenSOAPサーバと連携することで,クライアントは非同期的に最終メッセージを受け取ることが出来ます.
  • 独自に拡張可能なメッセージ仕様で,ロング・トランザクションや,複雑な処理手順にも将来的に対応可能です.
  • OpenSOAPのセキュリティ機能をそのまま利用することができます.

OpenSOAPトランザクションの概要

OpenSOAP トランザクションの概要

トランザクションサービスを利用するためには,クライアントと,トランザクションサービスから接続される各サービスがトランザクションサービスに対応している必要があります.

2.クライアント仕様(リクエストメッセージ)

クライアントは以下の仕様に従ったリクエストメッセージを送信できる必要があります.

2.1.トランザクション制御記述ブロック

リクエストメッセージのBody(<SOAP-ENV:Body>)に含まれる 最初のBodyblockは<TransactionControl>である必要があります(例1). <TransactionControl>ブロックのnamespaceは "http://services.opensoap.jp/transaction/"であることが望ましいです.
<TransactionControl>ブロックには, トランザクション処理の対象となるサービスの数だけ, 子要素<endpoint>が,要求される処理の順番に並んでいる必要があります.
<endpoint>要素には各サービスがトランザクション処理として実行可能なSOAPメッセージの送信先URLを記述します. また,各要求処理ごとに固有の任意の属性値"transactionRequestID"を付加します.
その他,トランザクション処理に関わる処理設定はこのブロックに記述されます. (1.0版での実装は<endpoint>要素のみ)

2.2.トランザクションヘッダブロック

各サービスに送信されるべきメッセージのヘッダ部が存在する場合, トランザクションヘッダブロック<TransactionHeaderBlock>の要素として記述します(例1). この部分に記述された要素は,各サービスに送信されるSOAPメッセージの ヘッダブロック(<SOAP-ENV:Header>の直下のブロック)として挿入されます. <TransactionHeaderBlock>ブロックのnamespaceは "http://services.opensoap.jp/transaction/"であることが望ましいです.
各<TransactionHeaderBlock>ブロックには, <TransactionControl>ブロックの<endpoint>要素の対応する属性値 "transactionRequestID"を付加する必要があります. <TransactionHeaderBlock>ブロックは第2Bodyblock以降であれば, どの順番で挿入されていてもかまいません.

2.3.トランザクションボディブロック

各サービスに送信されるべきメッセージのボディ部は, トランザクションボディブロック<TransactionBodyBlock>の要素として記述します(例1). この部分に記述された要素は,各サービスに送信されるSOAPメッセージの ボディブロック(<SOAP-ENV:Body>の直下のブロック)として挿入されます. <TransactionBodyBlock>ブロックのnamespaceは "http://services.opensoap.jp/transaction/"であることが望ましいです. 各<TransactionBodyBlock>ブロックには, <TransactionControl>ブロックの<endpoint>要素の対応する属性値 "transactionRequestID"を付加する必要があります. <TransactionBodyBlock>ブロックも,<TransactionHeaderBlock>ブロック同様, 第2Bodyblock以降であれば,どの順番で挿入されていてもかまいません.

OpenSOAPトランザクション・リクエストメッセージ仕様

例1. OpenSOAP Transaction Request Envelope
A銀行に出金の要求をし,それが受け入れられたらB銀行に同額の入金要求をするトランザクションの例.

3.トランザクション対応サービス仕様

OpenSOAP Transaction Serviceに対応したサービスは, クライアントが生成するSOAPメッセージの仕様(ヘッダブロック,ボディブロックの内容)と サービスの機能をクライアントに公開すると供に,トランザクションサービスとの接続について, 以下の仕様に従う必要があります.

3.1.要求処理に対する返信

トランザクションサービスによって分割生成された各Envelope(例2)は, 対応するそれぞれのendpointに送信されます. 各サービスは,Envelopeにしたがって要求された処理を行い, その処理をRollbackできる状態で保存した後, レスポンスメッセージ(例3)をトランザクションサービスに返信します.
レスポンスメッセージの仕様は各サービスごと独自でかまいませんが, 第1ボディブロックの直下には処理の結果を記述する子要素<TransactionResult>を含む必要があります.
<TransactionResult>には,そのサービスでの処理の成功を通知する"SUCCESS"を記述します. それ以外の文字列,もしくはサービスから<SOAP-ENV:Fault>等が返信された場合は, そのサービスでの処理は失敗,もしくは拒否されたものとみなされます.
また,<TransactionResult>には, サービス内で固有の識別IDを属性値"transactionID"として付加することができます. "transactionID"属性を使うと, 次のステップでトランザクションサービスからCOMMITまたはROLLBACKの要求がなされた時に, サービス内で整合をとることができます.

リクエストメッセージが分割され,A銀行へ送信されるSOAP Envelope

例2.リクエストメッセージが分割され,A銀行へ送信されるSOAP Envelope

A銀行からのレスポンスの例

例3(A).A銀行からのレスポンスの例

B銀行との送受信の例

例3(B).B銀行との送受信の例

3.2.COMMITまたはROLLBACK要求

トランザクションサービスはサービスから成功("SUCCESS")が返信されると, <TransactionControl>ブロックに記述された順番に従って次のサービスへのリクエストメッセージを送信します.
全てのサービスからSUCCESSが返信された場合, トランザクションサービスは再び全てのendpointに対して 対応する"transactionID"属性値を付加したCOMMIT要求メッセージ(例4)を送信して一連の処理の実行を決定します.
全てのサービスからSUCCESSが返信される前に,途中のサービスから失敗メッセージが返信されると, その前までにSUCCESSが返信されたサービス群に対して"transactionID"属性値を付加したROLLBACK要求メッセージを送信します.

3.3.処理の完結

COMMIT要求を受け取ったサービスは要求された処理を実行して終了し, ROLLBACK要求を受け取ったサービスは対応する処理を取り消します. さらに,トランザクションサービスにそれぞれの処理が完了した旨のSOAPメッセージを返信します.

トランザクションサービスからA銀行へのCOMMIT要求

例4.トランザクションサービスからA銀行へのCOMMIT要求

4.クライアントへの返信

トランザクションサービスは,一連の処理の結果をリクエストメッセージと同様にひとつのEnvelopeに結合し(例5), クライアントに返信します. SOAPメッセージの最初のボディブロック<TransactionResponse>ブロックには, トランザクションの最終結果が,COMMITまたはROLLBACKとして記述されます. 2つめ以降のボディブロックは, 各サービスから返信されたレスポンスメッセージのヘッダブロックが<TransactionHeaderBlock>ブロックに, ボディブロックが<TransactionBodyBlock>ブロックに, さらにCOMMITもしくはROLLBACKを送信した際のレスポンスメッセージのボディブロックが<TransactionActionResponseBodyBlock>に, それぞれリクエストメッセージに付加した属性値"transactionRequestID"と同じ属性値が付加されて挿入されます.

クライアントに返信されるトランザクション処理結果

例5.クライアントに返信されるトランザクション処理結果


Copyright (C) 2001-2004 Webmasters of www.opensoap.jp. All Rights Reserved.
ご利用の際は 免責・著作権情報をご覧ください.