SOAP ノードのサンプルでは、SOAPInput、SOAPReply、SOAPRequest の各ノードを使用して、HTTP トランスポートまたは JMS トランスポートに基づく Web サービスを提供する方法とコンシュームする方法の両方を示します。
このサンプルの開始点は、単純化された注文サービスを定義する Web サービス記述言語 (WSDL) ファイルです。WSDL ファイルを参照してください。HTTP バインディングと JMS バインディングの両方を組み込んだ WSDL ファイルでは、WSDL で定義されている操作を参照します。この Web サービスは、注文された部品が使用可能であることを示す応答を常に戻します。 Web サービスを拡張する 1 つのオプションとして、在庫データベースを照会するために Database ノードを使用することが考えられます。
"「WSDL または XSD ファイル (あるいはその両方) から開始」"ウィザードを WSDL ファイルと一緒に使用して、メッセージ・セットを作成し、このサンプルを構成する 2 つのメッセージ・フローを作成します。
SOAP ノードのサンプルは、次のようなタスクを示します。
このサンプルは、2 つのメッセージ・フローを使用します。 1 つのメッセージ・フローは Web サービスを提供し、もう 1 つは Web サービスをコンシュームします。 HTTP および JMS Web サービスの場合は、要求および応答メッセージは同じままです。 これらのメッセージ・フローについて、このセクションの後半で説明します。
下の図は、Web サービス・プロバイダーのメッセージ・フローを示しています。
次の表は、Web サービス・プロバイダーのメッセージ・フロー内のノードを示しています。
ノード・タイプ | ノード名 |
---|---|
SOAPInput | Input |
Subflow | OrderService_Extract |
Compute | Compute Response |
SOAPReply | Reply |
SOAPInput ノードは、着信 SOAP メッセージを受信し、そのメッセージが有効であれば、メッセージ・フローをたどって OrderService_Extract サブフローにそのメッセージを渡します。OrderService_Extract サブフローは、"「WSDL または XSD ファイル (あるいはその両方) から開始」"ウィザードで作成されます。 下の図は、Web サービス・プロバイダーのサブフローを示しています。
下の表は、Web サービス・プロバイダー・サブフローのノードを示しています。
ノード・タイプ | ノード名 |
---|---|
Input Terminal | in |
SOAPExtract | Extract |
Output Terminal | failure |
Label | ws_submitPORequest |
Output Terminal | submitPORequest |
SOAPExtract ノードは、SOAP メッセージを取り込んで、SOAP エンベロープを削除します。 このサンプルでは、SOAP エンベロープの削除によって XML メッセージが XMLNSC ドメインに残るので、Mapping ノードや Compute ノードなどでそのメッセージを利用できます。さらに、SOAPExtract ノードは、呼び出し対象の Web サービス操作に基づいて、1 つのラベルにメッセージを送付します。このサンプルでは、使用される操作は 1 つだけです。 開始点として使われる WSDL に複数の操作が存在する場合、"「WSDL または XSD ファイル (あるいはその両方) から開始」"ウィザードでは、複数の操作をインプリメントするオプションが提供されます。 複数の操作を選択した場合、サブフローは複数のラベルを持つため、親メッセージ・フローの中に複数の出力ターミナルが作成されます。
XMLNSC メッセージは、サブフローを出てメイン・プロバイダー・メッセージ・フローに戻ると、Compute ノードに入ります。Compute ノードを使用することによって、元の SOAP 本体を XML として参照し、メッセージ内のデータに対して ESQL 操作を実行できます。このサンプルでは、メッセージ内のデータは無視されて、有効な XML データが初めから作成されます。 その後、このデータは SOAPReply ノードに送られます。そのノードでは、Web サービス呼び出しを開始した Web サービス・コンシューマーに返される SOAP メッセージが作成されます。
下の図は、Web サービス・コンシューマーのメッセージ・フローを示しています。
次の表は、Web サービス・コンシューマーのメッセージ・フロー内のノードを示しています。
ノード・タイプ | ノード名 |
---|---|
MQInput | SOAPSample_IN |
Compute | Compute Request |
Subflow | Invoke_submitPO |
Compute | Compute Response |
MQOutput | SOAPSample_OUT |
MQOutput | SOAPSample_FAULT |
Web サービス・コンシューマー・フローは、MQInput ノードによってモニターされるキューに着信する WebSphere MQ メッセージによって開始されます。このメッセージは XMLNSC ドメイン内の XML メッセージです。 このメッセージは、Compute ノードに入ります。そのノードでは、着信データに基づいて、Web サービスに送信される XML データが作成されます。次に、そのメッセージは、フローをたどって Invoke_submitPO サブフローに渡されます。Invoke_submitPO サブフローを作成するには、「WSDL または XSD ファイル (あるいはその両方) から開始」ウィザードを使用します。
下の図は、Web サービス・コンシューマー・サブフローを示しています。
下の表は、Web サービス・コンシューマー・サブフローのノードを示しています。
ノード・タイプ | ノード名 |
---|---|
Input Terminal | in |
SOAPRequest | Request |
Output Terminal | fault |
SOAPExtract | Extract |
Output Terminal | failure |
Label | ws_submitPOResponse |
Output Terminal | submitPOResponse |
SOAPRequest ノードは、着信 XML データを取り込み、そのデータを使用して、ノードのプロパティーで定義されている Web サービスに送られる有効な SOAP メッセージを作成します。有効な応答が受信されると、その応答は、SOAPExtract ノードに渡されます。そのノードでは、応答から SOAP エンベロープが削除され、メッセージが XMLNSC ドメインに返されます。さらに、そのメッセージは、ws_submitPOResponse Label ノードに送付され、サブフローが終了します。
メイン・コンシューマー・フローでは、指定の WebSphere MQ キューに XML データを書き込む MQOutput ノードに出力メッセージが送られます。障害メッセージは、指定の WebSphere MQ キューに SOAP 障害データを書き込む MQOutput ノードに送られます。
Web クライアント・メッセージ・フローは、WebSphere MQ メッセージによって駆動されます。 以下の XML メッセージを使ってサンプルを実行するためのテスト・クライアント・ファイルが用意されています。
<OrderMessage> <localElement> <FirstName>Message</FirstName> <LastName>Broker</LastName> <Street>IBM</Street> <City>IBM</City> <ZipCode>IBM</ZipCode> <PartNumber>Some Part</PartNumber> <Quantity>1</Quantity> </localElement> </OrderMessage>
Web サービス要求メッセージおよび応答メッセージの有効なフォーマットを、以下の編集済みのスキーマ抽出で示します。
<xsd:element name="submitPORequest"> ... <xsd:complexType> <xsd:sequence> <xsd:element name="partNo" type="xsd:string"/> <xsd:element name="partQuantity" type="xsd:int"/> <xsd:element name="personName"> <xsd:complexType> <xsd:sequence> <xsd:element name="firstName" type="xsd:string"/> <xsd:element name="lastName" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="address"> <xsd:complexType> <xsd:sequence> <xsd:element name="street" type="xsd:string"/> <xsd:element name="city" type="xsd:string"/> <xsd:element name="zipCode" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element>
<xsd:element name="submitPOResponse"> ... <xsd:complexType> <xsd:sequence> <xsd:element name="orderStatus" type="xsd:string"/> <xsd:element name="orderAmt" type="xsd:int"/> <xsd:element name="partNo" type="xsd:string"/> <xsd:element name="partQuantity" type="xsd:int"/> </xsd:sequence> </xsd:complexType> </xsd:element>