# Job計劃任務功能開發
計劃任務包括兩種應用模式: 精確延時任務 、輪詢計劃任務
## **精確延時任務**
精確延時任務一般是在某個具體的時間點,觸發任務。比如有這樣的需求,拼團活動創建,30分鐘內,要不成團,要不關閉。整點秒殺活動在13:35:00這個時間正點開始。這樣的需求,使用精確延時任務可以實現相關功能。
*****
插件開發中精確延時任務的開發步驟
1. 精確延時任務的使用簡單,您可以在任意需要調用精確延時的地方啟動任務計劃,調用方法如下
```
OrderClose::dispatch([, secs:20) ;
```
通過上面的方法調用,就啟動了一個20秒后,會自動執行回調的精確延時任務
OrderClose是繼承自BaseJob的一個子類,BaseJob是繼承自Dispatch的一個子類,dispatch是一個靜態方法,用于調用精確延時任務的方法。
dispatch的第一個參數是 action, 表示一個方法名,默認不填,就是 doJob方法回調,也可以傳入自己定義的回調函數方法名稱 ,第二個參數secs 表示延時的秒數,如果是更長時間,某年某月某日后的某個時間點,自己計算賦值
```
class Dispatch
{
/**
* 加入隊列
* @param $action
* @param array $data
* @param string|null $queue_name
* @return mixed
*/
public static function dispatch($action, array $data = [], int $secs = 0, string $queue_name = null, bool $is_async = true)
{
$class = get_called_class();//調用主調類
if ($is_async) {
$queue = Queue::instance()->job($class)->secs($secs);
if (is_array($action)) {
$queue->data(...$action);
} else if (is_string($action)) {
$queue->method($action)->data(...$data);
}
if ($queue_name) {
$queue->setQueueName($queue_name);
}
return $queue->push();
} else {
$class_name = '\\' . $class;
$res = new $class_name();
if (is_array($action)) {
return $res->doJob(...$action);
} else {
return $res->$action(...$data);
}
}
}
}
```
2. 計劃任務的精確時間延時點到達后,系統自動回調,然后在OrderClose類中相應的doJob函數中,編寫具體的業務邏輯實現代碼
```
/*
* 隊列異步調用定時任務
*/
class OrderClose extends BaseJob
{
public function doJob()
{
Log::write('訂單關閉計劃任務'.date('Y-m-d h:i:s'));
return true;
}
}
```

<br>
<br>
<br>
## **輪詢計劃任務**
輪詢計劃任務是按照固定的時間間隔觸發,在每個觸發的時間間隔,開發者在對應的回調函數(異步函數)中,對相關的業務邏輯進行處理,通常時間間隔可以設置為1分鐘。例如有這樣的應用場景,檢測站點是否到期,程序處理自動關閉操作。又如訂單創建后,30分鐘內沒有人付款,訂單自動關閉。一般這樣的業務邏輯,對時間的要求不是非常精準的。就可以在輪詢中進行處理。
*****
插件開發中輪訓計劃任務的開發步驟
1. 在插件的目錄`addon\hello_world\app\dict\schedule.php` 文件中, 編寫輪訓計劃任務的相關數據描述定義
```
return [
[
'key' => 'order_close',
'name' => '未支付訂單自動關閉',
'time' => [
'type' => 'min',
],
'class' => '',
'function' => ''
]
];
```
`'key' => 'order_close'` order_close 對應 OrderClose兩個單詞,目前在niucloud-admin框架內部系統加載的時候,如果沒有填寫class 參數,會自動尋找 `app\job\schedule`目錄下對應的文件名來裝載類
` 'name' => '未支付訂單自動關閉'` 計劃任務的名稱
`'time' => [
'type' => 'min',
]` 計劃任務的執行時間,一般寫min 表示每分鐘間隔會調用 class 下的 function 函數一次
` 'class' => ''` 這個表示任務時間間隔時,回調的處理類,要帶命名空間,對于插件開發,這里必須填寫完整的類路徑 如 addon\hello_world\app\job\schedule\OrderClose ( 對于插件中開發計劃任務,目前框架沒有優化處理自動找尋類, ),注意!這里的schedule目錄不是固定的,可以定義任意路徑
` 'function' => '' ` 計劃任務回調執行的函數,默認為空,則函數為 doJob 。 開發人員可以定義人員的函數名稱

<br>
2. 計劃任務時間觸發,自動回調,在相應的函數中,編寫具體的業務邏輯實現代碼
```
/*
* 隊列異步調用定時任務
*/
class OrderClose extends BaseJob
{
public function doJob()
{
Log::write('訂單關閉計劃任務'.date('Y-m-d h:i:s'));
return true;
}
}
```

<br>
- 寫給程序員的一封信
- 源碼下載
- 安裝部署
- 環境要求
- 安裝視頻教程
- 本地安裝部署教程
- 二次開發安裝視頻教程
- 寶塔部署
- 授權綁定
- 二次開發須知
- 技術棧
- 目錄結構
- 命名規范
- 二次開發指導
- 二次開發環境搭建步驟
- 二次開發注意事項
- 單站和Saas模式開發
- 插件結構描述
- MENU開發
- DIY組件/頁面開發
- 自定義手機端DIY裝修頁面
- Route 路由處理
- Services中的core文件夾
- 自定義站點管理端控制臺頁面樣式
- 調用素材資源
- Resource資源文件
- 引入圖標ICON
- SMS發送短信開發
- Job 計劃任務
- 計劃任務啟動
- 計劃任務開發
- 生產環境編譯打包處理步驟
- 生產環境搭建步驟
- 插件安裝時npm,composer檢測不可用問題處理
- 上傳圖片大小限制
- 插件uniapp開發
- 菜單語言包