This commit is contained in:
as2252258@163.com
2021-02-28 14:28:51 +08:00
parent 8ef1c9eb66
commit a28641ce7e
+113 -103
View File
@@ -23,95 +23,105 @@ use Exception;
class OnTask extends Callback class OnTask extends Callback
{ {
/** /**
* @throws Exception * @throws Exception
*/ */
public function onHandler() public function onHandler()
{ {
$parameter = func_get_args(); $parameter = func_get_args();
if (func_num_args() < 4) { if (func_num_args() < 4) {
$this->onContinueTask(...$parameter); $this->onContinueTask(...$parameter);
} else { } else {
$this->onTask(...$parameter); $this->onTask(...$parameter);
} }
} }
/** /**
* @param Server $server * @param Server $server
* @param int $task_id * @param int $task_id
* @param int $from_id * @param int $from_id
* @param string $data * @param string $data
* *
* @return mixed * @return mixed
* @throws Exception 异步任务 * @throws Exception 异步任务
*/ */
public function onTask(Server $server, int $task_id, int $from_id, string $data): mixed public function onTask(Server $server, int $task_id, int $from_id, string $data): mixed
{ {
$time = microtime(TRUE); $app = Snowflake::app()->increment();
if (empty($data)) { Coroutine\defer(function () use ($app) {
return $server->finish('null data'); $app->decrement();
} });
$finish = $this->runTaskHandler($data); $time = microtime(TRUE);
if (!$finish) { if (empty($data)) {
$finish = []; return $server->finish('null data');
} }
$finish['runTime'] = [
'startTime' => $time,
'runTime' => microtime(TRUE) - $time,
'endTime' => microtime(TRUE),
];
return $server->finish(json_encode($finish));
}
/** $finish = $this->runTaskHandler($data);
* @param Server $server if (!$finish) {
* @param Server\Task $task $finish = [];
* @return mixed }
* @throws Exception 异步任务 $finish['runTime'] = [
*/ 'startTime' => $time,
public function onContinueTask(Server $server, Server\Task $task): mixed 'runTime' => microtime(TRUE) - $time,
{ 'endTime' => microtime(TRUE),
$time = microtime(TRUE); ];
if (empty($task->data)) { return $server->finish(json_encode($finish));
return $task->finish('null data'); }
}
/**
* @param Server $server
* @param Server\Task $task
* @return mixed
* @throws Exception 异步任务
*/
public function onContinueTask(Server $server, Server\Task $task): mixed
{
$app = Snowflake::app()->increment();
Coroutine\defer(function () use ($app) {
$app->decrement();
});
$time = microtime(TRUE);
if (empty($task->data)) {
return $task->finish('null data');
}
$finish = $this->runTaskHandler($task->data); $finish = $this->runTaskHandler($task->data);
if (!$finish) { if (!$finish) {
$finish = []; $finish = [];
} }
$finish['runTime'] = [ $finish['runTime'] = [
'startTime' => $time, 'startTime' => $time,
'runTime' => microtime(TRUE) - $time, 'runTime' => microtime(TRUE) - $time,
'endTime' => microtime(TRUE), 'endTime' => microtime(TRUE),
]; ];
return $task->finish(json_encode($finish)); return $task->finish(json_encode($finish));
} }
/** /**
* @param $data * @param $data
* @return array|null * @return array|null
* @throws Exception * @throws Exception
*/ */
private function runTaskHandler($data): ?array private function runTaskHandler($data): ?array
{ {
try { try {
$serialize = $this->before($data); $serialize = $this->before($data);
$params = $serialize->getParams(); $params = $serialize->getParams();
if (is_object($params)) { if (is_object($params)) {
$params = get_object_vars($params); $params = get_object_vars($params);
} }
$finish['class'] = get_class($serialize); $finish['class'] = get_class($serialize);
$finish['params'] = $params; $finish['params'] = $params;
$finish['status'] = 'success'; $finish['status'] = 'success';
$finish['info'] = $serialize->onHandler(); $finish['info'] = $serialize->onHandler();
} catch (\Throwable $exception) { } catch (\Throwable $exception) {
$finish['status'] = 'error'; $finish['status'] = 'error';
$finish['info'] = $this->format($exception); $finish['info'] = $this->format($exception);
$this->error($exception, 'Task'); $this->error($exception, 'Task');
} }
$event = Snowflake::app()->getEvent(); $event = Snowflake::app()->getEvent();
$event->trigger(Event::SYSTEM_RESOURCE_CLEAN); $event->trigger(Event::SYSTEM_RESOURCE_CLEAN);
@@ -119,31 +129,31 @@ class OnTask extends Callback
Timer::clearAll(); Timer::clearAll();
return $finish; return $finish;
} }
/** /**
* @param $data * @param $data
* @return ITask|null * @return ITask|null
*/ */
protected function before($data): ?Task protected function before($data): ?Task
{ {
if (empty($serialize = unserialize($data))) { if (empty($serialize = unserialize($data))) {
return null; return null;
} }
if (!($serialize instanceof ITask)) { if (!($serialize instanceof ITask)) {
return null; return null;
} }
return $serialize; return $serialize;
} }
/** /**
* @param $exception * @param $exception
* @return string * @return string
*/ */
private function format($exception): string private function format($exception): string
{ {
return $exception->getMessage() . " on line " . $exception->getLine() . " at file " . $exception->getFile(); return $exception->getMessage() . " on line " . $exception->getLine() . " at file " . $exception->getFile();
} }
} }