Skip to content

Task业务处理

simon edited this page Dec 28, 2018 · 3 revisions

简介

Service模式在小型单应用下会非常棒,但随意应用不断加大,Service之间的相互调用就会越来越多,相对的冗余就会越来越多。

所以我们使用Handler+Task模式来分离庞大的Service服务,使用系统代码可用度增加,冗余和重复代码减少。

说明:

  • Task也是属于业务逻辑的一部分,非工具类的脚手架
  • 一个Task只是承载一个单一并且是可复用的业务逻辑,即一个独立的任务

调用与被调用

  • 可以调用Repository,Model
  • 只能Handler,Job,Event,Listener,Command调用
  • 一定不可Controller,Model调用
  • 多个Task之间一定不可相互调用
  • Swoole Task 也是基于此类规范
  • Task 不允许被继承

示例

// 主业务逻辑处理器

use CrCms\Foundation\App\Handlers\AbstractHandler;
class Handler extension AbstractHandler
{
    /**
     * @param DataProviderContract $provider
     * @return array
     */
    public function handle(DataProviderContract $provider): array
    {
        $task = $this->app->make(ShareTask::class);
        return $task->handle(...$provider->all());
    }

}

use CrCms\Foundation\App\Tasks\AbstractTask;
class ShareTask extension AbstractTask
{
    /**
     * @param mixed ...$params
     * @return array
     */
    public function handle(...$params): array
    {
        //这里是单一业务逻辑处理
        return $params;
    }
}

Swoole Task的应用

必须基于Swoole运行环境

use CrCms\Foundation\App\Tasks\AbstractTask;
use CrCms\Foundation\Swoole\Server\Contracts;
class SwooleTask extension AbstractTask implements TaskContract
{
    /**
     * @param mixed ...$params
     * @return array
     */
    public function handle(...$params): array
    {
        //这里是单一业务逻辑处理
        return $params;
    }
    
    /**
     * @param mixed $data
     * @return mixed
     */
    public function finish($data)
    {
        //Task处理完成后,出发的finish逻辑
    }
}

//Task的调度

use CrCms\Foundation\Swoole\Server\Tasks\Dispatcher;

Dispatcher::dispatch(new SwooleTask, ['foo'=>'bar']);
Clone this wiki locally