バックグラウンドプロセスの設計
4 タスク
1時間 30 分
上級
Pega Platform 8.6
日本語
シナリオ
Front Stageは、複数の国に拠点を持つ国際企業になろうとしています。 各顧客の現地時間の午前0時過ぎに、昼夜平分時(春分の日と秋分の日)を祝うメールを送信したいと考えています。 昼夜平分時には、世界中で昼と夜の時間が同じになります。 昼夜平分時は1年に2回あり、以下の表の日付に当たります。
Front Stageでは、通常の営業時間中のプロセスへの影響を最小限に抑えるために、できるだけ効率的にメールを処理したいと考えています。
以下の表は、チャレンジに必要なログイン情報をまとめたものです。
ロール | ユーザー名 | パスワード |
---|---|---|
Admin | admin@Booking | rules |
開始時には、以下の主なチャレンジを特定し、アプローチをドキュメント化してください。
- メール送信にかかる時間を計算する。
- 計算した時間に基づいてメールを送信する。
今回の演習の一環ではありませんが、以下の追加チャレンジに取り組むことで、完全なソリューションを構築できます。
- 顧客の住所を適切なタイムゾーンにマッピングする。
- 昼夜平分時を取得して保存する方法を開発する。
- 構成されたルール間の関係を調整する。
詳細なタスク
1 設計オプションの特定
実装を開発する際には、Pega Platform™のルールを活用してください。 要件に対応するために、以下のようなアプローチを検討してください。
- オプション1:顧客のタイムゾーンごとにスピンオフキュープロセッサーを持つシングルノードのジョブスケジューラーを作成します。
- オプション2:既知の顧客のタイムゾーンごとにジョブスケジューラーを作成します。 各ジョブスケジューラーが、指定されたタイムゾーンの適切な時間に実行されるように構成します。 ジョブスケジューラーは、指定されたタイムゾーン内の顧客にクエリーをかけて、各顧客にメールを送信します。
- オプション3:既知の顧客のタイムゾーン数にノード数を乗じた数以上の上級エージェントを作成します。 マスターエージェントがエージェントのスケジュールを生成できるようにします。 不要なエージェントスケジュールを削除します。 残りのエージェントスケジュールに変更を加え、開始時刻を、特定のタイムゾーンのメール配信開始時刻に設定します。 各エージェントは、指定されたタイムゾーン内の顧客クエリーをスケジューリングし、各顧客にメールを送信します。
2 設計オプションの評価
設計 | 長所 | 短所 |
---|---|---|
シングルノードのジョブスケジューラーを作成する |
|
|
タイムゾーンごとにジョブスケジューラーを作成する |
|
|
タイムゾーンごとに上級エージェントを作成する |
|
|
3 最適な設計オプションの提案
顧客のタイムゾーンごとにスピンオフキュープロセッサーを持つシングルノードのジョブスケジューラーを作成する方法は、パフォーマンスに優れているため、推奨されるアプローチです。
4 ソリューション詳細のレビュー
1. メール送信にかかる時間を計算する
まず、各タイムゾーンの昼夜平分時の日付を判定します。 昼夜平分時は世界中で同時に発生しますが、実際の日付は各タイムゾーンの地理的な位置によって異なる場合があります。 たとえば、昼夜平分時がグリニッジ標準時(GMT)9月22日20:02に発生する場合、GMT+1とそれより西側のタイムゾーンでは9月22日が秋分の日となります。 GMT+1より東側の地域では、9月23日が秋分の日となります。 この情報は、正しい日付の朝にメールを送信するために必要です。
次に、秋分の日の午前0時(顧客の現地時間)の直後に各顧客にメールを配信するために、メール送信時刻をGMTで計算します。 GMTオフセット計算を使って問題の解を出します。 Pega Platform™のDateTimeライブラリには、特定のGMTで表されるDateTimeでの、特定のタイムゾーン内のGMTオフセットを返す関数はありません。 ToZoneIdという関数を使うと簡単に計算できます。 この関数は、java.time.*とjava.time.format.*をインポートするライブラリZonedDateTimeの中に作成されています。 .
次の画像はこの関数です。
BackgroundProcExケースタイプは、異なる時間でシードされたFSG-Examples-Data-TimeZoneInfoインスタンスのページリストを生成します。 その後、4つのrule-declare-expressionsがPageListに対して開始されます。 rule-declare-expressions のページコンテキストは .TimeZoneList()です。
.TimeZoneList() R-D-E | 式 |
---|---|
.LocalTime |
@ZonedDateTime.ToZoneId(Top.DateTimeString,.TimeZone) |
.GMTTime |
@ZonedDateTime.ToZoneId(.LocalTime,"GMT") |
.MidnightLocal |
@String.substring(.LocalTime,0,8)+"T000000.000 "+.TimeZone |
.MidnightGMT |
@ZonedDateTime.ToZoneId(.MidnightLocal,"GMT") |
補足: .GMTTimeプロパティおよび関連付けられているrule-declare-expressionは、ソリューションの一部として必須ではありません。 これらは検証のために使用されます。 値は常にTop.DateTimeStringと一致する必要があります。
次の画像は、算出された時刻を示すものです。 IDLはInternational Date Line(国際日付変更線)の略です。
秋分の日を祝うメールが米国ハワイ州ホノルルの顧客に2021年9月22日の朝、午前0時(現地時間)過ぎに配信されるようにするために、Front StageはGMT2021年9月22日10時にメールを送信します。 4時間後(2つのタイムゾーンの時差)、オーストラリアのシドニーの顧客に秋分の日を祝うメールを送信します。
シドニーとホノルルの時差は4時間です。 このため、シドニーの午前0時はホノルルの午前0時よりも4時間遅くなります。 この時差のせいで、シドニーの現地時間午前0時過ぎは、ホノルルのカレンダー日付よりも1日後になります。
2. 算出した時間に基づいてメールを送信する
ソリューションには、VernalEquinoxGreetingsとAutumnalEquinoxGreetingsの2つのジョブスケジューラーが定義されています。 この2つのジョブスケジューラーは、1年に1回、それぞれ2020年3月19日と2020年9月21日に実行されるように構成されています。
各ジョブスケジューラーから呼び出されるLaunchTimeZoneQueueProcessorsアクティビティは、昼夜平分時のタイプ(VERNALまたはAUTUMNAL)、および簡素化を図るために昼夜平分時が発生するタイミングでDateTimeStringを受け取ります。 理想的なのは、データベーステーブルがあり、そこから現在の年と昼夜平分時タイプに基づいてDateTimeStringをクエリーできることです。
このアクティビティは、D_SamplePersonTimeZoneListリストデータページで特定される異なるタイムゾーンをループします。 タイムゾーンごとに、CaseInfoという名前のFSG-Examples-Work-BackgroundProcExページが作成され、値が入力されます。 このページは、Queue-For-Processingメソッドを呼び出す際のステップページとして使用されます。 Queue-For-Processingメソッドは、構成された専用のキュープロセッサーが「遅延」に構成されていることを検出します。これにより、Queue-For-Processメソッドは、Date time for processingフィールドを表示します。 キュープロセッサーが「遅延」に構成されていない場合、Date time for processingフィールドは表示されません。
補足: 不必要なリスクを伴いますが、LaunchTimeZoneQueueProcessorのアクティビティがタイムゾーンごとに新しいBackgroundProcExケースをスピンオフさせるという別のアプローチもあります。 BackgroundProcExの各スピンオフケースは、クリップボード上でCaseInfoという名前のページの存在を検出することで、重大な暴走無限ループが起こらないようになっています。 クリップボードにCaseInfoページが見つかると、スピンオフしたケースはRun in backgroundオルタネートステージに変わります。 Run in backgroundステージでは、DateTimeStringとTimeZoneInfoの各プロパティが、トップレベルのCaseInfoのページから、Run in backgroundフローシェープの前のBackgroundProcExケースにコピーされます。 Run in backgroundシェープは、遅延SendTimeZoneGreetings キュープロセッサーを.TimeZoneInfo.MidnightGMTに実行するように指示します。
同名のSendTimeZoneGreetings キュープロセッサーアクティビティは、D_SamplePersonList[TimeZone:Param.TimeZone].pxResultsの各SamplePersonを取得し、反復します。
このアクティビティでは、エラーになる実際のメールを送信する代わりに、ステップでLog-Messageメソッドを使用して、タイムゾーンとWorkPartyUriの値をPegaRULES.logに出力します。
作業の確認
アサインメントを完了するために、以下のタスクを行ってください。
- Dev Studioで、SamplePersonデータが定義されていることを確認します。
- いったんログアウトし、Admin@Bookingでログインし直します。
- Background Proc ExercisesのAccess Groupに切り替えます。
- pxRequestor.pyLastSignonの値をコピーしてテキストエディターに貼り付け、分数(10など)を追加します。
202103113T021633.688 GMT << 現在のログイン時刻
202103113T022633.688 GMT << 10分を追加 - TestEquinoxGreetings Job Scheduler を見つけて、確認します。
ジョブスケジューラーは10分ごとに実行されるように設定されています。
- 「Parameters」をクリックします。
- 近い将来の日付をコピーします。
- 「Parameter value」フィールドに、近い将来の日付を貼り付けます。
- ジョブスケジューラーのルールで確認します。
- Admin Studioで、TestでフィルタリングしてTestEquinoxGreetings Job Schedulerを見つけます。
- オプション:「Override」をクリックしてジョブスケジューラーを有効にし、「Override 」をクリックしてTestEquinoxGreetingsジョブスケジューラーを無効にします。
- Click Trace。
- D_SamplePersonTimeZoneListがステップページになっている行をクリックします。
2つのタイムゾーンが特定されていることに注目してください。Queue-For-Processingは2回起動されます。
次の画像は、Queue-for-Processingが呼び出されたときのCaseInfoページの例です。
- Admin Studioで「Queue Processors」をクリックします。 TimeZoneでフィルタリングします。
- 2つ以上のキュープロセッサーインスタンスが作成されている場合は、それらをすべて削除し、ジョブスケジューラーとトレースを有効にしてやり直します。
- トレースが表示されたらすぐにジョブスケジューラーを無効にします。
LaunchTimeZoneQueueProcessorsは、指定されているParam.DateTimeStringをローカルタイムゾーン、Param.TimeZoneに変換します。
GMTTimeの計算から、時間の変換が可逆的であることがわかります。これは、ソリューションの一部ではありません。
次に、ロジックは、時、分、秒を000000.000に設定することで、現地タイムゾーンの午前0時を算出します。
ロジックは、現地の午前0時をGMTゾーンに再変換します。
Param.TimeZone = .TimeZoneInfo.TimeZone<br />
LOOP: SamplePersonList[TimeZone:Param.TimeZone].pxResults:
LOOP: SamplePersonList[TimeZone:Param.TimeZone].pxResults:
17.
2019-11-13 10:27:33,102 [,19,2,3,4,5,6,7,8,9]] [ STANDARD] [ ] [ ] (s_Work_BackgroundProcEx.Action) INFO - SendTimeZoneGreetings: TimeZone=Pacific/Honolulu, [email protected]<br />
<br />
2019-11-13 10:27:33,102 [,19,2,3,4,5,6,7,8,9]] [ STANDARD] [ ] [ ] (s_Work_BackgroundProcEx.Action) INFO - SendTimeZoneGreetings: TimeZone=Pacific/Honolulu
<br />
2019-11-13 10:27:33,102 [,19,2,3,4,5,6,7,8,9]] [ STANDARD] [ ] [ ] (s_Work_BackgroundProcEx.Action) INFO - SendTimeZoneGreetings: TimeZone=Pacific/Honolulu
このモジュールは、下記のミッションにも含まれています。
トレーニングを実施中に問題が発生した場合は、Pega Academy Support FAQsをご確認ください。