EIP / Command Message


Command Message

ひと言要約

別システムに処理を依頼する時のMessage

要約

他システムが提供している機能を使う必要があるとき 通常はRemote Procedure Invocationを使うけど、Messagingのいいとこ取りもしたいよね

他システムの処理を実行するのにメッセージングってどう使えるの?

Remote Procedure Invocationの利点は同期的なところなんだけど、欠点でもある

  • 非同期であれば、リモートでの実行に成功するまでトライし続けられる

ローカルでの実行はリモートよりは信頼性がある

  • もし送信元が受信先にMessageを送ったら、受信先はローカルで処理を実行できる
ということで、疑問なのはメッセージで処理の呼び出しをどう作るのかってこと

オブジェクトとしてリクエストをカプセル化するという、GoFのCommandパターンがある

  • このオブジェクトがメッセージなら保存もできるし、Message Channelを通してまわすこともできる
    • コマンドのパラメータもメッセージの状態として保存できる

他システムの信頼性を持った処理呼び出しにCommand Messageを使う

CommandMessageSolution.gif

コマンドには特殊なメッセージタイプってのはない

  • Command Messageはコマンドを含んでしまっただけの、いたって普通のメッセージ
  • JMSでの例
    • Serializableなコマンドオブジェクトを含んだObjectMessage?
    • XML形式でコマンドを含んだTextMessage?がある
  • .NETでの例
    • コマンドを保持したMessage
  • SOAPのリクエストもコマンドオブジェクト

Command Messageは通常Point-to-Point Channelを通して送られる

  • コマンドが一回だけ消費され実行されるようにするため

SOAPとWSDLの例

RPCスタイルのSOAPメッセージを使うと、リクエストメッセージはCommand Messageパターンになる

  • SOAPメッセージのボディには呼び出したい受信先のメソッド名とパラメータが含まれる
    • このメソッド名は受信先のWSDLの定義と一致すべき
<SOAP-ENV:Envelope
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <SOAP-ENV:Body>
     <m:GetLastTradePrice xmlns:m="Some-URI">
       <symbol>DIS</symbol>
     </m:GetLastTradePrice>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

担当者のつぶやき

わかりやすい内容でした(高江洲)