![]() ![]() ![]() ![]() |
前の手順では、見積り要求ドキュメント内の繰り返し要素のセットを反復処理する For Each ループを作成しました。この手順では、For Each ループ内のアクティビティを設計します。つまり、ビジネス プロセスのループで行う反復処理ごとに実行されるアクティビティを設計します。
価格や在庫情報の処理で行ったように、ビジネス プロセスが複数の異なるシステムと対話するときには、タスクを並行実行することによってスループットを向上させることができます。実行の「並行」ブランチを複数作成するには、ビジネス プロセスにパラレル ノードを追加します。
このチュートリアルの例では、ビジネス プロセスが価格情報と在庫情報の両方を判断して、見積りを作成し、クライアントに返せるようにする必要があります。このビジネス プロセスは、価格の計算と在庫の計算を行う 2 つの外部システムと通信するため、並行実行を設定することによってスループットが向上します。ビジネス プロセスは、2 つの外部システムそれぞれから応答を受け取ります。
外部システムとは、ビジネス プロセスが必要とする情報を返すあらゆるリソース (他のビジネス プロセス、Web サービス、EJB、データベース、ファイル システムなど) を指します。ビジネス プロセスは、コントロールを介してこうしたリソースを対話します。このチュートリアルでは 2 つの Web サービスを使用します。1 つは、クライアントから受け取った要求ドキュメントで指定された widgetID
ごとに価格を返す Web サービスで、もう 1 つは、要求ドキュメントで指定された widgetID
および quantity
に基づいて在庫情報を返す Web サービスです。RequestQuote
ビジネス プロセスが対話するコントロールは、プロジェクト フォルダ \Tutorial_Process_ApplicationWeb\requestquote\services
に用意されています。用意されているコントロールは、PriceProcessorControl.java
および AvailProcessorControl.java
です。
デフォルトでは、パラレル ノードによって結合条件 AND が指定されます。この結合条件は、Parallel ブランチ ライン上では で表現されます。この場合、すべてのブランチのアクティビティが完了してからでないと、実行フローはパラレル ノードの次のノードに進みません。
見積り要求ビジネス プロセスの場合は、パラレル ノードの両方のブランチを完了させるので、結合条件 AND は変更しないでください。
結合条件 OR が指定された場合は、1 つのブランチのアクティビティが完了すると、他のすべてのブランチのアクティビティの実行が終了され、実行フローはパラレル ノードの次のノードに進みます。結合条件 OR は、デザイン ビューでは で表現されます。
デザイン ビューでは、[join condition] プロパティをプロパティ エディタで表示して編集することができます。パラレル ノードの上部にある または
をクリックすると、パラレル ノードのプロパティがプロパティ エディタに表示されます。パラレル ノードのプロパティ エディタは、以下の図のようになります。
価格と在庫の情報を返す 2 つの Web サービスと対話するパラレル ノードを設計するには、以下のタスクを実行します。
データ パレットには PriceProcessorControl.java
および AvailProcessorControl.java
があります。コントロールは、[パッケージ・エクスプローラー] の Tutorial_Process_Application_WEB\src\requestquote.services
フォルダにあります。この節では、アプリケーション内に適切なコントロールを作成し、ビジネス プロセスとそれらのコントロールとの間の通信を設計する方法について説明します。
Web サービス コントロール インスタンス [priceProcessorControl] および [availProcessorControl] がデータ パレットに追加されます。
Part I と Part II では、データ パレットの適切なコントロールからデザイン ビューのビジネス プロセスまでメソッドをドラッグすることによって、ビジネス プロセスにコントロール ノードを作成できることを学びました。ノード パレットから [Control Send]、[Control Receive]、または [Control Send with Return] を選択して、コントロール ノードを作成することもできます。その後で、作成したコントロール ノードに適切なメソッドをバインドします。この節では、後者の方法を使用します。
ノード パレットの以下のノードを、パラレル ノードの各ブランチに追加します。
デザイン ビューで、各ノードを選択してビジネス プロセスまでドラッグ アンド ドロップし、Parallel ブランチ上に配置して、以下の図に示すような [Parallel] グループを作成します。
このようにして、各ブランチに以下の実行フローが設計されます。
[メソッド] パネルには、priceProcessorControl で呼び出すことのできる「非同期送信メソッド」のリストが表示されます。
void getPrice(int itemID_arg)
を選択します。
デフォルトでは、[データの送信] タブを開くと [変数の割り当て] ペインが表示されます。[コントロールが予期する値] フィールドには、priceProcessor Web サービスがエクスポーズする getPrice()
メソッドが予期するデータ型で int itemID
と表示されます。
注意 : | priceProcessor サービスは、要求された項目の ID を入力に使用し、そのウィジェットの価格を返します。 |
注意 : | この場合は、priceProcessorControl への入力として求められるデータ型が int で、For Each ループ内の widgetId の値を保持する iter_forEach1 変数が XML 型である (WidgetRequestDocument は XML スキーマに対して有効である) ため、モードを切り替える必要があります。この反復変数は、For Each ループで反復処理する繰り返し要素を指定したときに作成されたものです。この変数は実行時に現在の widgetRequest 要素 (For Each ループで現在処理中の要素) を保持します。「ビジネス プロセス内の For Each ループの設計」を参照してください。 |
トランスフォーメーション ツールが開き、[iter_forEach1 (widgetRequest)] 変数が [ソース] ペインに、[int] が [対象] ペインに表示されます。
ソース ノード [widgetId] と対象ノード [int] のデータ型が一致しません。型変換が行われます。
注意 : | このトランスフォーメーションを作成すると、プロジェクトにすでに作成され、チュートリアル アプリケーションであらかじめ構築された RequestQuoteTransformation.java の下に、新しいメソッドが作成されます。これは、Tutorial_Process_Application_WEB/requestquote フォルダ内にあります。このトランスフォーメーション メソッド用のクエリが含まれている、RequestQuotepriceProcessorControlgetPrice.xq という名前の新しい XQ ファイルも作成されます。「トランスフォーメーションに関する注意」を参照してください。 |
[メソッド] パネルには、priceProcessor コントロールの「非同期受信メソッド」のリストが表示されます。
void returnPrice(int itemID_arg,float price_arg)
[コントロールが返す値] フィールドには、priceProcessor Web サービスに対する returnPrice
(int itemID, float price
) メソッドで返されるデータ型が表示されます。
PriceProcessor サービスは itemID (int
) を入力に使用し、int
型の itemID および float
型の価格の値を返します。
この場合は、priceProcessor サービスから返されるデータを XML 型の変数に割り当てるため、前の図に示されている [変数の割り当て] モードから [トランスフォーメーション] モードに切り替える必要があります。切り替えるには、ビジネス プロセスで、priceProcessor サービスから返された Java データ型を型付き XML に変換する必要があります。
priceQuote.xsd
の横にある [+] をクリックして [priceRequest] を選択します。[変数の型] フィールドに [org.example.price.PriceRequestDocument
] が表示されます。
itemID を widgetId にマップ
price を price にマップ
注意 : | このトランスフォーメーションを作成すると、チュートリアル アプリケーション用にプロジェクトにすでに作成され、ビルドされている RequestQuoteTransformation.java の下に、新しいメソッドが作成されます。これは、Tutorial_Process_Application_WEB/requestquote フォルダ内にあります。このトランスフォーメーション メソッド用のクエリが含まれている、新しい XQ ファイルも作成されます。 |
この手順では、プロジェクトに用意されているトランスフォーメーション コントロール PriceAvailTransformations を使用して、priceProcessor コントロールから (For Each ループでの反復処理ごとに) 返される価格データを単一の変数に追加します。
前にビジネス プロセスのノードを設計したときに、必要に応じて、1 つのトランスフォーメーションに対するトランスフォーメーション メソッドを作成しました。そのトランスフォーメーション メソッドは、ビジネス プロセスがクライアントやコントロールとやり取りしたデータをマップするためのものでした。ここでは、別の方法でトランスフォーメーションを使用します。Create PriceList ノードの場合は、クライアントやコントロールにデータが送信されません。その代わりに、トランスフォーメーションが、ビジネス プロセスからの入力として「型付き」XML データを受け取り、「型なし」 XML (XmlObject
) を返します。ビジネス プロセスは、For Each ループの反復処理ごとに返されるデータを単一の変数に追加して、XML データの繰り返しシーケンスを作成する必要があります。For Each ループ内のこのような XML データの繰り返しシーケンスを保持できる変数は、XmlObjectList 型の変数です。型付き変数と XmlObject 変数の両方とも、XmlObjectList 型の変数に追加できます。「XmlObjectList データ型の使用に関する注意」を参照してください。
注意 : | このトランスフォーメーションは、チュートリアル アプリケーションであらかじめ構築されています。このトランスフォーメーションは Tutorial_Process_Application_WEB\requestquote フォルダ内にあります。PriceAvailTransform.java ファイルの作成方法については、このチュートリアルでは説明していません。トランスフォーメーションの詳細については、「トランスフォーメーションに関する注意」を参照してください。 |
XmlObject convertPriceXMLtoXMLObj(org.example.price.PriceRequestDocument _priceRequestDoc)
XmlObject convertPriceXMLtoXMLObj(org.example.price.PriceRequestDocument _priceRequestDoc)
[コントロールが予期する値] フィールドには、priceAvailTransformations コントロールに対する convertPriceXMLtoXMLObj()
メソッドが予期するパラメータのデータ型と名前、PriceRequestDocument _priceRequestDoc
が表示されます。
この場合、price 変数のデータ型 (PriceRequestDocument) は、priceAvailTransformations が予期するデータのデータ型と一致します。
[コントロールが返す値] フィールドには、priceAvailTransformations コントロールに対する convertPriceXMLtoXMLObj()
メソッドが返すパラメータのデータ型 XmlObject
が表示されます。
XmlObject
は、型なし XML 形式のデータを指定する Java データ型です。つまり、このデータ型は、XML スキーマに対して「有効でない」 XML データを表します。
priceList 変数が作成され、priceProcessor サービスから返される XmlObject データを受け取るように割り当てられます。
この手順により、パラレル ノードの Get Price ブランチの設計が終了します。実行時に、このブランチを実行することによって、For Each ループでの現在の反復処理で priceProcessor コントロールから返されるデータを含む XmlObject が、priceList 変数に追加されます。
[メソッド] パネルには、availProcessor コントロールで呼び出すことのできる「非同期送信メソッド」のリストが表示されます。
void getAvail(int itemID_arg,int quantity_arg)
デフォルトでは、[データの送信] タブを開くと [変数の割り当て] ペインが表示されます。[コントロールが予期する値] フィールドには、availProcessor Web サービスがエクスポーズする getAvail()
メソッドが予期するパラメータのデータ型と名前、int itemID
および int quantity
が表示されます。
注意 : | availProcessor サービスは、クライアントから要求された itemID (int) および数量 (int) を入力として使用します。このサービスは、itemID (int)、提供可能な数量 (int)、ウィジェットが在庫にあるかどうかを示すブール値、および出荷日 (String) を返します。 |
注意 : | この場合は、availProcessor に入力するデータを変換する必要があるため、モードを切り替える必要があります。availProcessor コントロールは int データ型の入力を必要とし、For Each ループの widgetId および quantity の値を保持する iter_forEach1 変数は XML 型 (XML スキーマに対して有効な WidgetRequestDocument ) です。 |
トランスフォーメーション ツールが開き、iter_forEach1 変数が [ソース] ペインに、トランスフォーメーション メソッド availProcessor に渡す整数の引数が [対象] ペインに表示されます。
widgetID を itemID_arg にマップ
quantity を quantity_arg にマップ
マップ ペインで要素間に線が描画されます。これはデータ型間のトランスフォーメーションを表します。
注意 : | このトランスフォーメーションを作成すると、チュートリアル アプリケーション用にプロジェクトにすでに作成され、ビルドされている RequestQuoteTransformation.java の下に、新しいメソッドが作成されます。これは、Tutorial_Process_Application_WEB/requestquote フォルダ内にあります。このトランスフォーメーション メソッド用のクエリが含まれている、新しい XQ ファイルも作成されます。 |
[メソッド] パネルには、availProcessor コントロールの「非同期受信メソッド」のリストが表示されます。
void avail(int itemID, int qty, boolean avail, String date)
[コントロールが返す値] には、availProcessor Web サービスに対する avail(int itemID_arg, int qty_arg, boolean avail_arg, String date_arg)
メソッドが返すパラメータのデータ型と名前が表示されます。
注意 : | この場合は、availProcessor サービスから返されるデータを XML 型の変数に割り当てるため、[Receive Data] タブで [変数の割り当て] モードから [トランスフォーメーション] モードに切り替える必要があります。切り替えるには、プロセスで、返された Java データ型を型付き XML に変換する必要があります。 |
availQuote.xsd
の横にある [+] をクリックしてリストを展開し、[availRequest] を選択します。[変数の型] フィールドに org.example.avail.AvailRequestDocument が表示されます。
itemID を widgetId にマップ
qty を requestedQuantity にマップ
avail を quantityAvail にマップ
date を shipDate にマップ
注意 : | このトランスフォーメーションを作成すると、チュートリアル アプリケーション用にプロジェクトにすでに作成され、ビルドされている RequestQuoteTransformation.java の下に、新しいメソッドが作成されます。これは、requestquote\Tutorial_Process_Application_WEB フォルダ内にあります。このトランスフォーメーション メソッド用のクエリが含まれている、新しい XQ ファイルも作成されます。 |
Parallel ノードの Get Price ブランチを設計したときに、価格データを単一の変数に追加するようにビジネス プロセスを設計したのと同じ方法で、この手順では、priceAvailTransformations コントロールでメソッドを呼び出して、返された在庫情報を XmlObjectList 型の単一の変数に追加します。「XmlObjectList データ型の使用に関する注意」を参照してください。
XmlObject convertAvailXMLtoXMLObj(org.example.avail.AvailRequestDocument _availRequestDoc)
XmlObject convertAvailXMLtoXMLObj(org.example.AvailRequestDocument _availRequestDoc)
[コントロールが予期する値] フィールドには、priceAvailTransformations コントロールに対する convertAvailXMLtoXMLObj(org.example.avail.AvailRequestDocument _availRequestDoc)
メソッドが予期するデータ型、AvailRequestDocument
が表示されます。
この場合、avail 変数のデータ型 (AvailRequest) は、priceAvailTransformations コントロールが予期するデータのデータ型と一致します。
[コントロールが返す値] フィールドには、priceAvailTransformations コントロールに対する convertAvailXMLtoXMLObj()
メソッドから返されるデータ型、XmlObject
が表示されます。
XmlObject
は、型なし XML 形式のデータを指定する Java データ型です。つまり、このデータ型は、XML スキーマに対して有効でない XML データを表します。
availList 変数が作成され、availProcessor サービスから返される XmlObject データを受け取るように割り当てられます。
この手順により、パラレル ノードの Get Availability ブランチの設計が終了します。実行時に、このブランチを実行することによって、For Each ループでの現在の反復処理で availProcessor コントロールから返されるデータを含む XmlObject が、availList 変数に追加されます。
For Each ループでの反復処理ごとに priceProcessor サービスから価格データが返され、そのデータが price
変数に割り当てられます。また、availProcessor サービスからは在庫データが返され、そのデータが avail
変数に割り当てられます。ビジネス プロセスでは、反復処理ごとに返される価格データを収集し、ループでの反復処理ごとに 1 つの項目をリストに割り当てて、価格データのリストを作成する必要があります。同様に、ループでの反復処理ごとに、パラレル ノードの Get Availability ブランチに在庫データのリストが作成されます。
XmlObjectList
は、型なし XML 形式のデータのシーケンスを指定する Java データ型です。つまり、このデータ型は、XML 要素のシーケンス (繰り返し要素のセット) を表します。ビジネス プロセスでは、パラレル ノードの Get Price ブランチでの各反復処理の最後の段階として、price
変数から受け取ったデータを priceList
変数 (XmlObjectList
型) に割り当てます。このようにして、For Each ループで反復処理する見積り要求内の各ウィジェットの価格データを、単一の変数が保持します。同様に、各ウィジェットの在庫データも単一の変数が保持します。
XmlObjectList 変数の使用方法については、「Create PriceList ノードを設計するには」および「Create AvailList ノードを設計するには」を参照してください。
![]() ![]() ![]() |