Workflow Timer スケジューラワーカージョブを Workflow Context に対応付けて、実行中のスクリプトを特定する方法Issue この記事では、長時間実行されている WFTimer スケジューラジョブを、Workflow Context および現在実行中のアクティビティまで追跡する方法について説明します。これらの手順は、Timer アクティビティがタイマーの有効期限後に正しくワークフローを開始したものの、その後のアクティビティの実行が継続し、そのうちの1つが想定より長時間実行されている場合に使用してください。 Release すべて Resolution WFTimer.. および SLA breach timer スケジューラワーカージョブ Workflow に Timer または SLA Percentage Timer アクティビティが含まれている場合、ワークフロー内でそのアクティビティが実行される時点で、次の処理が行われます。 ワークフローエンジンは [sys_trigger] テーブルに Scheduled Job レコードを作成し、Next action 時刻を Workflow Timer の終了時刻に設定します。実行中のワークフローは一時停止され、現在のトランザクションが終了します。Scheduled Job の実行時刻になると、Scheduler Worker スレッドがワークフローを再度実行し、ワークフロー内の次のアクティビティを継続して実行します。ワークフローが後続のアクティビティの実行を完了し、その結果として発生する更新処理を終えると、ジョブは終了し、Scheduler Worker スレッドは解放されます。 アクティビティが Timer の場合、スケジューラジョブ名は WFTimer... で始まります。アクティビティが SLA Percentage Timer の場合、名前は代わりに SLA breach timer... で始まりますが、手順は同一です。ただし、task_sla テーブルに対して実行されている Context のみを対象とし、それ以外の Context は無視できます。 スケジューラジョブの特定 Scheduled Jobs - /sys_trigger_list.do 現在実行中のすべてのスケジューラジョブは、state=running の sys_trigger レコードとして表示されます。特定するには: Updated 列をリストに追加します。これにより実際の実行開始時刻が分かります。この時刻は通常、予定された Next Run 時刻の直後になります。/sys_trigger_list.do?sysparm_query=nameSTARTSWITHWFTimer%5EORnameSTARTSWITHSLA%20breach%20timer%5Estate%3D1 Stats - /stats.do Scheduler Worker セクションには、次の情報が表示されます。 Current job: ジョブ名Job Started: タイムスタンプ この時点で、青色のリンクをクリックしてスレッドダンプを確認することをお勧めします。現在実行中の Script Include や Business Rule に関する手掛かりが得られる場合があります。例えば、Workflow Context がタスクを挿入しており、そのタスクの insert 時に実行されるカスタム Business Rule が実際には停止している原因である可能性があります。 Workflow Context の特定 ジョブ名に記載されている sys_id は有用ではありません。これは、Timer アクティビティが実行中アクティビティであった時点の wf_executing レコードの sys_id だからです。ジョブ開始時にそのレコードは削除され、代わりに新しい 現在実行中のアクティビティ のレコードに置き換えられます。 特定するには: ジョブの Start タイムスタンプを使用します。この時刻は Workflow Activity History テーブル [wf_history] にある Timer アクティビティの End タイムスタンプと一致します。完了済みアクティビティのみを対象とし、ワークフローアクティビティが Timer アクティビティ定義を使用しているレコードに絞り込みます。/wf_history_list.do?sysparm_query=activity.activity_definition%3D3961a1da0a0a0b5c00ecd84822f70d85%5EORactivity.activity_definition%3D8e291a23ac1464262f4366bb3182d840%5Estate%3Dfinished Context 列のリンクを開き、現在 Scheduler Worker スレッドで実行されている Workflow Context に移動します。 Workflow Context 内で長時間実行されているアクティビティの特定 Workflow Context フォームには Workflow Executing Activities の関連リストがあります。この例では、Stupid Script という名前のアクティビティです 特定するには: Show Workflow 関連リンクをクリックし、緑色で強調表示されるアクティビティを表示します。アクティビティタイトルの横にあるアイコンにカーソルを合わせると、そのアクティビティに含まれるスクリプトを表示するポップアップが表示されます。これにより問題の箇所を特定できます。 Workflow Context がすでに完了している場合は、ワークフローがどのレコードを挿入または更新するか、およびそのトランザクションの一部としてどのコードがまだ実行されている可能性があるかを検討する必要があります。stats.do ページから Scheduler Worker スレッドのスレッドダンプへのリンクにアクセスできます。そこから手掛かりが得られる場合があります。 長時間実行されている Workflow Context の修正方法 Workflow が長時間実行されること自体が正しい場合もあります。例えば: 大規模なテーブルをループ処理して更新を実行している場合複雑な Orchestration ワークフローアクティビティを実行している場合REST Message 連携からの応答を待機している場合 これらは処理が完了するまで実行させても問題ない場合があります。これが定期的にインスタンスのパフォーマンス問題を引き起こしている場合は、スクリプトの再設計を検討してください。スクリプトに設計上の問題がある場合は、修正後にワークフローを再公開する必要があります。 その他の解決策: 古い未公開のワークフローバージョンに含まれるアクティビティのスクリプトを更新することで、既存の Workflow Context において今後同じ問題が発生しないようにできる場合があります。Workflow Context を停止する必要がある場合、多くのケースでは Workflow Context フォーム上の Cancel リンクをクリックすることで停止できます。Workflow Context をキャンセルしてもスケジューラジョブが引き続き実行されている場合は、トランザクションを手動で終了する必要があります。通常は All Active Transactions モジュールから実行できます。URL 列にはジョブ名が表示されます。対象行を選択し、Kill を選択します。この方法でジョブを終了できない場合は、ノードの再起動が必要になる場合があります。