バックグラウンドプロセスの設計
Archived
4 タスク
1時間 30 分
シナリオ
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") |
次の画像は、算出された時刻を示すものです。 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フィールドは表示されません。
同名のSendTimeZoneGreetings キュープロセッサーアクティビティは、D_SamplePersonList[TimeZone:Param.TimeZone].pxResultsの各SamplePersonを取得し、反復します。
このアクティビティでは、エラーになる実際のメールを送信する代わりに、ステップでLog-Messageメソッドを使用して、タイムゾーンとWorkPartyUriの値をPegaRULES.logに出力します。