Files
kiri-core/http-server/Handler/OnServerTask.php
T

102 lines
1.7 KiB
PHP
Raw Normal View History

2021-07-18 12:06:56 +08:00
<?php
2021-10-25 18:20:29 +08:00
namespace Server\Handler;
2021-07-18 12:06:56 +08:00
2021-10-25 18:20:29 +08:00
use Annotation\Inject;
use Kiri\Abstracts\Logger;
2021-09-22 11:36:29 +08:00
use Kiri\Exception\ConfigException;
use Kiri\Kiri;
2021-07-19 19:04:13 +08:00
use ReflectionException;
2021-09-24 02:23:24 +08:00
use Server\SInterface\OnTaskInterface;
2021-07-18 12:06:56 +08:00
use Swoole\Server;
2021-07-19 19:04:13 +08:00
/**
2021-08-05 16:15:42 +08:00
* Class OnServerTask
2021-07-19 19:04:13 +08:00
* @package Server\Task
*/
2021-08-05 16:15:42 +08:00
class OnServerTask
2021-07-18 12:06:56 +08:00
{
2021-10-25 18:20:29 +08:00
#[Inject(Logger::class)]
public Logger $logger;
2021-09-22 11:36:29 +08:00
/**
* @param Server $server
* @param int $task_id
* @param int $src_worker_id
* @param mixed $data
* @throws ConfigException
*/
public function onTask(Server $server, int $task_id, int $src_worker_id, mixed $data)
{
try {
$data = $this->resolve($data);
} catch (\Throwable $exception) {
2021-10-25 18:20:29 +08:00
$data = jTraceEx($exception);
$this->logger->error('task', [$data]);
2021-09-22 11:36:29 +08:00
} finally {
$server->finish($data);
}
}
/**
* @param Server $server
* @param Server\Task $task
* @throws ConfigException
*/
public function onCoroutineTask(Server $server, Server\Task $task)
{
try {
$data = $this->resolve($task->data);
} catch (\Throwable $exception) {
2021-10-25 18:20:29 +08:00
$data = jTraceEx($exception);
$this->logger->error('task', [$data]);
2021-09-22 11:36:29 +08:00
} finally {
$server->finish($data);
}
}
/**
* @param $data
* @return null
* @throws ReflectionException
*/
private function resolve($data)
{
[$class, $params] = json_encode($data, true);
$reflect = Kiri::getDi()->getReflect($class);
if (!$reflect->isInstantiable()) {
return null;
}
$class = $reflect->newInstanceArgs($params);
return $class->execute();
}
/**
* @param Server $server
* @param int $task_id
* @param mixed $data
*/
public function onFinish(Server $server, int $task_id, mixed $data)
{
2021-09-24 02:23:24 +08:00
if (!($data instanceof OnTaskInterface)) {
2021-09-22 11:36:29 +08:00
return;
}
$data->finish($server, $task_id);
}
2021-07-18 12:06:56 +08:00
}