Skip to main content

バックグラウンドプロセスの設計

Archived

4 タスク

1時間 30 分

表示の対象:All users Applies to: Pega Platform 8.6
上級
日本語
このコンテンツは現在アーカイブされており、更新されていません。進捗状況は記録されません。Pega Cloudのインスタンスは無効となり、バッジは付与されなくなります。

シナリオ

Front Stageは、複数の国に拠点を持つ国際企業になろうとしています。 各顧客の現地時間の午前0時過ぎに、昼夜平分時(春分の日と秋分の日)を祝うメールを送信したいと考えています。 昼夜平分時には、世界中で昼と夜の時間が同じになります。 昼夜平分時は1年に2回あり、以下の表の日付に当たります。

Equinox

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の中に作成されています。 . 

次の画像はこの関数です。

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(国際日付変更線)の略です。

IntDatetime

秋分の日を祝うメールが米国ハワイ州ホノルルの顧客に2021年9月22日の朝、午前0時(現地時間)過ぎに配信されるようにするために、Front StageはGMT2021年9月22日10時にメールを送信します。 4時間後(2つのタイムゾーンの時差)、オーストラリアのシドニーの顧客に秋分の日を祝うメールを送信します。

シドニーとホノルルの時差は4時間です。 このため、シドニーの午前0時はホノルルの午前0時よりも4時間遅くなります。 この時差のせいで、シドニーの現地時間午前0時過ぎは、ホノルルのカレンダー日付よりも1日後になります。

2. 算出した時間に基づいてメールを送信する

ソリューションには、VernalEquinoxGreetingsAutumnalEquinoxGreetingsの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フィールドは表示されません。

D_SamplepersonActivity
補足: 不必要なリスクを伴いますが、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に出力します。

BackgroundExCase


このモジュールは、下記のミッションにも含まれています。

We'd prefer it if you saw us at our best.

Pega Academy has detected you are using a browser which may prevent you from experiencing the site as intended. To improve your experience, please update your browser.

Close Deprecation Notice