# Commands and Jobs

EMQX Fleets は、デバイスに対して操作を送信するために、Commands と Jobs の2つのメカニズムを提供します。これらは異なるインタラクションパターンを持ち、配信保証も異なります。

## Commands vs Jobs

| | Commands | Jobs |
|---|---|---|
| **インタラクションパターン** | リアルタイムのリクエスト-レスポンス | 非同期バッチ送信、デバイスごとの追跡あり |
| **対象** | 単一のデバイス | 1台以上のデバイスまたはThing Group |
| **配信** | 即時、デバイスがオンラインである必要あり | キューイングされ、デバイスは再接続時に取得 |
| **実行追跡** | 単一の実行記録とステータス | デバイスごとの実行記録と完全なライフサイクル |
| **タイムアウト** | あり（コマンドごとに設定可能） | ジョブレベルおよびステップごとのタイムアウト |
| **典型的な用途** | 今すぐアクションをトリガー（ロック、アンロック、再起動） | フリートへの変更展開（ファームウェア更新、設定プッシュ） |

## Commands

Command は、単一の接続中のデバイスとのリアルタイムインタラクションです。Fleets は MQTT 経由でコマンドリクエストをデバイスにパブリッシュし、レスポンスを待ちます。実行は `SENT` 状態で開始し、デバイスが応答するか TTL が切れると、終了状態（`SUCCEEDED`、`FAILED`、`REJECTED`、`TIMED_OUT`、または `CANCELED`）に遷移します。

Commands は以下の場合に適しています：
- 操作を受け取るためにデバイスがオンラインである必要がある
- 即時のレスポンスが必要な場合
- 操作対象が単一のデバイスである場合

詳細は [Send Commands](./send_commands.md) をご覧ください。

## Jobs

Job は、1台以上のデバイスに非同期で送信される操作です。ジョブが保留中になるとデバイスに通知され、デバイスはジョブドキュメントを取得して実行し、ステータスを Fleets に報告します。各対象デバイスには独立した実行記録とステータスがあります。

Jobs は以下の場合に適しています：
- 多数のデバイスに操作をプッシュしたい場合
- デバイスが断続的にオフラインになる可能性がある場合（ジョブはキューイングされ、再接続時に配信される）
- デバイスごとの実行進捗を時間をかけて追跡したい場合

詳細は [Manage Jobs](./manage_jobs.md) をご覧ください。

## 実行ステータス

### Command 実行ステータス

| ステータス | 意味 |
|---|---|
| `SENT` | コマンドがデバイスにパブリッシュされ、応答待ち |
| `SUCCEEDED` | デバイスが成功結果を返した |
| `FAILED` | デバイスが失敗を返した |
| `REJECTED` | デバイスがコマンドを拒否した |
| `TIMED_OUT` | タイムアウト期間内に応答なし |
| `CANCELED` | コマンドがキャンセルされた |

### Job 実行ステータス

| ステータス | 意味 |
|---|---|
| `QUEUED` | ジョブが保留中で、デバイスの取得待ち |
| `IN_PROGRESS` | デバイスがジョブを開始した |
| `SUCCEEDED` | デバイスが正常に完了を報告した |
| `FAILED` | デバイスが失敗を報告した |
| `REJECTED` | デバイスがジョブを拒否した |
| `TIMED_OUT` | デバイスがタイムアウト内にジョブを完了しなかった |
| `CANCELED` | クラウド側で実行がキャンセルされた |
| `REMOVED` | 実行記録が削除された |

## 次のステップ

- [Send Commands](./send_commands.md)
- [Manage Jobs](./manage_jobs.md)
