この章では、イベントおよびタイムアウトの使用方法について説明します。Webサービスはレスポンスを返すまでに長時間かかる場合があるため、BPELプロセス・サービス・コンポーネントでは一定の時間が経過した後、タイムアウトしてフローの残りを継続できることが必要です。
項目は次のとおりです。
この章では、融資提案を提供するStar LoanというWebサービスからのレスポンスを1分間待機するBPELプロセス・サービス・コンポーネントのプログラミング例を説明します。 Star Loanが1分以内にレスポンスを返さない場合、BPELプロセス・サービス・コンポーネントはUnited Loanという別のWebサービスからの融資提案を自動的に選択します。現実的には、時間の制限は48時間など1分より大きな値です。しかし、この例では、BPELプロセス・サービス・コンポーネントが正しく動作しているかどうかを確認するために、そのような長時間の待機は設定しません。
非同期Webサービスはレスポンスを返すまでに長時間かかる場合があるため、BPELプロセス・サービス・コンポーネントでは一定の時間が経過した後、タイムアウトしたり、待機を中止してフローの残りを継続できることが必要です。pickアクティビティを使用すると、指定の時間待機するかまたは機能の実行を継続するようにBPELフローを構成できます。有効期限の設定には、waitアクティビティを使用します。
pickアクティビティには2つのブランチがあり、それぞれに条件があります。最初に条件が満たされたブランチが実行されます。次の例では、1つのブランチの条件は融資提案を受け取ることで、もう1つのブランチの条件は指定の時間待機することです。
図14-1に概要を示します。(優先度に従って)次のアクティビティが発生します。
invokeアクティビティがサービス(この場合はStar Loanからの融資提案に対するリクエスト)を開始します。
次に、pickアクティビティが開始されます。このアクティビティには次の条件があります。
onMessage
この条件には、Star Loan Webサービスからの融資提案の形式でリプライを受け取るためのコードが含まれています。 onMessageコードは、タイムアウトが追加される前の、Star Loan Webサービスからのレスポンスを受け取るコードと同じです。
onAlarm
この条件には、1分のタイムアウトのコードが含まれています。この時間はPT1M
として定義されています。これは、タイムアウトまでに1分待機するという意味です。 タイムアウト設定には、次の記号を使用します。
S
は秒
M
は分
H
は時間
D
は日
Y
は年
あまり一般的な例ではありませんが、時間制限が1
年3
日15
秒の場合は、PT1Y3D15S
と入力します。コードの残りの部分では、融資変数selectedおよびapprovedをfalse
に設定し、年率(APR)を0.0
に設定して、この情報をloanOffer
変数にコピーしています。
期間のフォーマットは、BPEL標準で指定されています。期間のフォーマットの詳細は、次の場所にある最新ドキュメント「XML Schema Part 2: Datatypes」の期間に関する項を参照してください。
http://www.w3.org/TR/xmlschema-2/#duration
最初に条件が満たされたpickアクティビティのブランチが、BPELプロセス・サービス・コンポーネントにより実行されます。他のブランチは実行されません。
pickアクティビティを作成する手順は、次のとおりです。
SOAコンポジット・エディタで、BPELプロセス・サービス・コンポーネントをダブルクリックします。
「コンポーネント・パレット」から、デザイナにpickアクティビティをドラッグします。
pick アクティビティを開きます。
pickアクティビティには、onMessageブランチ(封筒アイコン)とonAlarmブランチ(アラーム・クロック・アイコン)が含まれます。 図14-2に例を示します。
表示されたpickアクティビティのonAlarmブランチをダブルクリックし、時間制限を1
時間ではなく1
分に設定します。 図14-3に例を示します。
「OK」をクリックします。
onMessageブランチをダブルクリックします。 図14-4に例を示します。
融資サービスからのレスポンスを受け取るように、その属性を編集します。
例14-1のコード・セグメントは、この操作のpick
アクティビティに対する設計完了後の定義を示しています。
例14-1 pickアクティビティ
<pick> <!-- receive the result of the remote process --> <onMessage partnerLink="LoanService" portType="services:LoanServiceCallback" operation="onResult" variable="loanOffer"> <assign> <copy> <from variable="loanOffer" part="payload"/> <to variable="output" part="payload"/> </copy> </assign> </onMessage> <!-- wait for one minute, then timesout --> <onAlarm for="PT1M"> <assign> <copy> <from> <loanOffer xmlns="http://www.autoloan.com/ns/autoloan"> <providerName>Expired</providerName> <selected type="boolean">false</selected> <approved type="boolean">false</approved> <APR type="double">0.0</APR> </loanOffer> </from> <to variable="loanOffer" part="payload"/> </copy> </assign> </onAlarm> </pick>
waitアクティビティを使用すると、プロセスは指定された期間または時間制限に達するまで待機できます。有効期限条件を1つのみ指定する必要があります。このアクティビティの典型的な用途は、一定の時間に操作を起動することです。通常は、プロセスの状態に依存する式を入力します。
待機期間を指定する場合は、次の点に注意してください。
処理を必要とする他のイベントとともにスケジュールされている場合、待機期間は保証されません。 この追加処理のために、実際の待機期間は、BPELプロセスに指定されている待機期間より長くなる可能性があります。
2秒未満の待機期間はサーバーから無視されます。 2秒以上1分未満の待機期間は、正確な指定時間で実行されないことがあります。 ただし、分単位の待機期間は指定時間で実行されます。
待機期間のデフォルト値(2
秒)は、bpel-config.xml
ファイルのminBPELWait
プロパティで指定されます。 このプロパティは任意の値に設定でき、minBPELWait
未満の待機の遅延は無視されます。
注意: waitアクティビティの期限切れイベントのスケジュールには、Quartzバージョン1.6がサポートされています。 |
waitアクティビティを作成する手順は、次のとおりです。
「コンポーネント・パレット」から、デザイナにwaitアクティビティをドラッグします。
waitアクティビティをダブルクリックし、「Wait」ダイアログを表示します。
「期間」セクションに、待機する時間を入力します。
図14-5に示すように、「期限」セクションで、待機する期限を選択します。
リモート・データベースに接続する同期プロセスについては、syncMaxWaitTime
タイムアウト・プロパティを増やす必要があります。
同期プロセスに対してタイムアウトを設定する手順は、次のとおりです。
ORACLE_HOME
/
domains/
user_domain_name
/config/soa-infra/configuration/bpel-config.xml
ファイルを開きます。
syncMaxWaitTime
プロパティの値を編集します。 例14-3に例を示します。
例14-3 syncMaxWaitTimeタイムアウト・プロパティ
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<bpel-config xmlns="http://xmlns.oracle.com/soa/config/bpel" version="11.1.0">
<!--bpelcClasspath>custom_bpelc_classpath</bpelcClasspath-->
<dspSystemThreads>2</dspSystemThreads>
<dspInvokeThreads>20</dspInvokeThreads>
<dspEngineThreads>30</dspEngineThreads>
<dspMaxRequestDepth>600</dspMaxRequestDepth>
<auditLevel>inherit</auditLevel>
<oneWayDeliveryPolicy>on</oneWayDeliveryPolicy>
<statsLastN>-1</statsLastN>
<auditDetailThreshold>50000</auditDetailThreshold>
<largeDocumentThreshold>100000</largeDocumentThreshold>
<validateXML>false</validateXML>
<expirationMaxRetry>5</expirationMaxRetry>
<expirationRetryDelay>120</expirationRetryDelay>
<qualityOfService>DirectWrite</qualityOfService>
<syncMaxWaitTime>45</syncMaxWaitTime>
<instanceKeyBlockSize>10000</instanceKeyBlockSize>
<maximumNumberOfInvokeMessagesInCache>100000
</maximumNumberOfInvokeMessagesInCache></bpel-config>