Skip to main content

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

4 タスク

1時間 30 分

Visible to: All users
上級 Pega Platform 8.6 日本語

シナリオ

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

Equinox

Front Stageでは、通常の営業時間中のプロセスへの影響を最小限に抑えるために、できるだけ効率的にメールを処理したいと考えています。

以下の表は、チャレンジに必要なログイン情報をまとめたものです。

ロール ユーザー名 パスワード
Admin admin@Booking rules

開始時には、以下の主なチャレンジを特定し、アプローチをドキュメント化してください。

  • メール送信にかかる時間を計算する。
  • 計算した時間に基づいてメールを送信する。

今回の演習の一環ではありませんが、以下の追加チャレンジに取り組むことで、完全なソリューションを構築できます。

  • 顧客の住所を適切なタイムゾーンにマッピングする。
  • 昼夜平分時を取得して保存する方法を開発する。
  • 構成されたルール間の関係を調整する。

このチャレンジを完了するには、Pegaインスタンスを起動する必要があります。

起動には5分ほどかかることがありますので、しばらくお待ちください。

詳細なタスク

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

作業の確認

アサインメントを完了するために、以下のタスクを行ってください。

  1. Dev Studioで、SamplePersonデータが定義されていることを確認します。
    Sample person data
  2. いったんログアウトし、Admin@Bookingでログインし直します。
  3. Background Proc ExercisesのAccess Groupに切り替えます。
  4. pxRequestor.pyLastSignonの値をコピーしてテキストエディターに貼り付け、分数(10など)を追加します。
    202103113T021633.688 GMT << 現在のログイン時刻
    202103113T022633.688 GMT << 10分を追加
  5. TestEquinoxGreetings Job Scheduler を見つけて、確認します。

    ジョブスケジューラーは10分ごとに実行されるように設定されています。

    Test Equinox Job Scheduler
  6. 「Parameters」をクリックします。
    Job Scheduler parameter
  7. 近い将来の日付をコピーします。
  8. Parameter value」フィールドに、近い将来の日付を貼り付けます。
    Nearfuturedate
  9. ジョブスケジューラーのルールで確認します。
  10. Admin Studioで、TestでフィルタリングしてTestEquinoxGreetings Job Schedulerを見つけます。
  11. オプション:「Override」をクリックしてジョブスケジューラーを有効にし、「Override 」をクリックしてTestEquinoxGreetingsジョブスケジューラーを無効にします。
    OverideJobSch
  12. Click Trace
    trace job Scheduler
  13. D_SamplePersonTimeZoneListがステップページになっている行をクリックします。
    2つのタイムゾーンが特定されていることに注目してください。
    tracer page timezone

    Queue-For-Processingは2回起動されます。

    tracer step queue for processing

    次の画像は、Queue-for-Processingが呼び出されたときのCaseInfoページの例です。

    caseinfo page tracer
  14. Admin Studioで「Queue Processors」をクリックします。 TimeZoneでフィルタリングします。
    Admin Studio QueueP
  15. 2つ以上のキュープロセッサーインスタンスが作成されている場合は、それらをすべて削除し、ジョブスケジューラーとトレースを有効にしてやり直します。
  16. トレースが表示されたらすぐにジョブスケジューラーを無効にします。
    Admin Job Scheduler

LaunchTimeZoneQueueProcessorsは、指定されているParam.DateTimeStringをローカルタイムゾーン、Param.TimeZoneに変換します。

         GMTTimeの計算から、時間の変換が可逆的であることがわかります。これは、ソリューションの一部ではありません。

         次に、ロジックは、時、分、秒を000000.000に設定することで、現地タイムゾーンの午前0時を算出します。

         ロジックは、現地の午前0時をGMTゾーンに再変換します。

Timezone Activity

      Param.TimeZone = .TimeZoneInfo.TimeZone<br />
      LOOP: SamplePersonList[TimeZone:Param.TimeZone].pxResults:
SendTimezoneActivity

   17. PegaRULES.logへの出力を確認します。 次のテキストはログの例です。

      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


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

If you are having problems with your training, please review the Pega Academy Support FAQs.

このコンテンツは役に立ちましたか?

改善できるところはありますか?

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