|
@@ -2,6 +2,9 @@
|
|
|
|
|
|
namespace task;
|
|
|
|
|
|
+use Exception;
|
|
|
+use trans_wapper;
|
|
|
+
|
|
|
class manager
|
|
|
{
|
|
|
private $mHandler;
|
|
@@ -16,6 +19,7 @@ class manager
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+ //task 唯一性
|
|
|
$hash_fun = function ($method,$params) {
|
|
|
$val = $method . '-' . serialize($params);
|
|
|
return md5($val);
|
|
@@ -26,24 +30,42 @@ class manager
|
|
|
$title = $this->mHandler->$title_fun($params);
|
|
|
|
|
|
$mod_task = Model('task');
|
|
|
- $task = $mod_task->getByHash($task_hash);
|
|
|
- if(empty($task))
|
|
|
+ $item = $mod_task->getByHash($task_hash);
|
|
|
+ if(empty($item))
|
|
|
{
|
|
|
- $task = ['type' => $method, 'title' => $title,
|
|
|
+ $item = ['type' => $method, 'title' => $title,
|
|
|
'params' => serialize($params), 'task_hash' => $task_hash,
|
|
|
'add_time' => time(), 'is_show' => $is_show];
|
|
|
- $task_id = $mod_task->insert($task);
|
|
|
- return $task_id;
|
|
|
- }
|
|
|
- else {
|
|
|
- return $task;
|
|
|
+ $task_id = $mod_task->insert($item);
|
|
|
+ $item = $mod_task->where(['task_id' => $task_id])->find();
|
|
|
}
|
|
|
+
|
|
|
+ return task_wrapper::CreateTask($item);
|
|
|
}
|
|
|
|
|
|
- //弹出一个任务,并且讲任务设为进行中
|
|
|
+ //弹出一个任务,并且将任务设为进行中
|
|
|
public function pop_task($task_id)
|
|
|
{
|
|
|
- return ['method' => '',];
|
|
|
+ $mod_task = Model('task');
|
|
|
+ $trans = new trans_wapper($mod_task,'pop_task');
|
|
|
+
|
|
|
+ try {
|
|
|
+ $item = $mod_task->field('*')
|
|
|
+ ->where(['task_id' => ['gt',$task_id],'state' => task_wrapper::Waiting])
|
|
|
+ ->master(true)->lock(true)->find();
|
|
|
+
|
|
|
+ if(!empty($item)) {
|
|
|
+ $mod_task->where(['task_id' => $item['task_id']])->update(['state' => task_wrapper::Processing,'act_time' => time()]);
|
|
|
+ }
|
|
|
+ $trans->commit();
|
|
|
+
|
|
|
+ return $item;
|
|
|
+ }
|
|
|
+ catch (Exception $ex)
|
|
|
+ {
|
|
|
+ $trans->rollback();
|
|
|
+ return [];
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
//任务结束,并且
|
|
@@ -65,10 +87,19 @@ class manager
|
|
|
public function handle($task)
|
|
|
{
|
|
|
$method = $task['type'];
|
|
|
- $params = $task['params'];
|
|
|
+ $params = unserialize($task['params']);
|
|
|
|
|
|
$handler = new handler();
|
|
|
[$succ,$result] = $handler->$method($params);
|
|
|
|
|
|
+ $mod_task = Model('task');
|
|
|
+ if(!empty($result))
|
|
|
+ {
|
|
|
+ $mod_task->where(['task_id' => $task['task_id']])->update(['state' => task_wrapper::Handled,
|
|
|
+ 'result_state' => $succ ? 1 : 0, 'result' => serialize($result),
|
|
|
+ 'finish_time' => time()]);
|
|
|
+ }
|
|
|
+
|
|
|
+ return $task['task_id'];
|
|
|
}
|
|
|
}
|