# 高度な設定

## タイムアウト設定

`2.1.0` バージョン以降、ワークフローではタイムアウト時間を設定できるようになりました。これは、1 回の実行が処理を開始してから終了するまでの最大所要時間を制限するためのものです。タイムアウト設定は、長時間実行、手動処理待ち、外部コールバック待ちなどによって、ワークフローが実行リソースを占有し続けることを防ぐ場合に適しています。

ワークフローの新規作成または編集ダイアログで「詳細オプション」を展開すると、「タイムアウト設定」を設定できます。

![20260604212454](https://static-docs.nocobase.com/20260604212454.png)

設定項目は次のとおりです。

- `0` を入力すると、タイムアウト時間を制限しません（デフォルト値）。
- `0` より大きい値を入力すると、タイムアウト制限が有効になります。画面では秒、分、時間、日を単位として選択できます。
- タイムアウト時間は最大 180 日まで設定できます。

### 計時ルール

タイムアウト時間は、ワークフローが初めてプロセッサに入った時点から計時されます。ワークフローがトリガーされた後、まだキューでスケジューリングを待っている場合、または遅延開始のために一時保存されている場合、その時間はタイムアウト時間に含まれません。

プロセッサに入った後は、ノードの実際の実行時間に加え、手動処理、承認、遅延、外部コールバック待ちなど、待機状態に入ったノードの時間も含めて、タイムアウト時間は継続して計時されます。ワークフローがユーザー操作を待って一時停止していても、タイムアウト時間は停止しません。

タイムアウトの期限は、その実行の開始時に決定されます。ワークフローのタイムアウト設定を変更しても、その後に処理を開始する実行にのみ影響し、すでに開始済みの実行の期限は再計算されません。

### タイムアウト後の処理

タイムアウト時間に達した時点でその実行がまだ終了していない場合、システムはその実行を終了します。

- 実行履歴のステータスは「中止」に変わり、終了理由は「タイムアウト」と表示されます。
- 現在実行中または待機中のノードタスクは「中止」としてマークされます。
- 後続のノードは実行されません。
- その実行の配下に実行中のサブフローがある場合、サブフローも親実行とともに中止されます。

例：

- ループノードで非常に長いループを実行し、ループ内の処理も時間がかかるために、ループノード全体の実行時間が設定されたタイムアウト時間を超えた場合、現在実行中のループノードと内部ノードは強制終了され、後続のノードは実行されません。
- 手動処理または承認ノードが長時間待機し、設定されたタイムアウト時間を超えた場合、現在待機中の手動処理ノードは強制終了され、後続のノードは実行されず、関連するタスクもキャンセルされます。

:::info{title=ヒント}
タイムアウト設定は、ワークフロー実行全体に対するグローバルな制限であり、特定のノード単体のタイムアウトではありません。HTTP リクエストや JavaScript スクリプトなど、単一ノードの待機時間だけを制限したい場合は、対応するノード自身のタイムアウト設定を使用してください。
:::

:::info{title=ヒント}
「作業チケットが 10 分以内に処理されなければタイムアウトとして更新する」のような業務上の期限付き処理を実現したい場合は、通常、[遅延ノード](../nodes/delay.md)を並列分岐と組み合わせて後続処理を編成します。グローバルタイムアウトは現在の実行を直接終了するため、フォールバック保護に適しており、後続の業務分岐を担う用途には適していません。
:::

## 実行モード

ワークフローは、作成時に選択されたトリガータイプに基づいて、「非同期」または「同期」のいずれかの方法で実行されます。非同期モードでは、特定のイベントがトリガーされた後、ワークフローはキューに入り、バックグラウンドスケジューリングによって順次実行されます。一方、同期モードでは、トリガーされた後にスケジューリングキューに入ることなく、直接実行が開始され、完了後すぐにフィードバックが返されます。

コレクションイベント、アクション後イベント、カスタムアクションイベント、スケジュールイベント、および承認イベントは、デフォルトで非同期で実行されます。アクション前イベントは、デフォルトで同期で実行されます。コレクションイベントとフォームイベントは両方のモードをサポートしており、ワークフロー作成時に選択できます。

![同期モード_同期ワークフローの作成](https://static-docs.nocobase.com/39bc0821f50c1bde4729c531c6236795.png)

:::info{title=ヒント}
同期モードのワークフローは、その性質上、「待機」状態を発生させるノード（例えば「手動処理」など）を内部で使用することはできません。
:::

## 実行履歴の自動削除

ワークフローが頻繁にトリガーされる場合、実行履歴の自動削除を設定することで、煩雑さを軽減し、同時にデータベースのストレージ負荷も軽減できます。

同様に、ワークフローの新規作成・編集ダイアログで、そのワークフローの実行履歴を自動削除するかどうかを設定できます。

![実行履歴の自動削除設定](https://static-docs.nocobase.com/b2e4c08e7a01e213069912fe04baa7bd.png)

自動削除は、実行結果のステータスに基づいて設定できます。ほとんどの場合、「完了」ステータスのみをチェックすることをお勧めします。そうすることで、実行失敗の記録を保持し、後続の問題調査に役立てることができます。

ワークフローのデバッグ時には、実行履歴の自動削除を有効にしないことをお勧めします。これは、履歴を通じてワークフローの実行ロジックが期待通りであるかを確認できるようにするためです。

:::info{title=ヒント}
ワークフローの履歴を削除しても、ワークフローの実行回数が減ることはありません。
:::
