Swoft 2 任务更新啦

任务

某些场景对主流程没有依赖,可以直接使用任务来实现类似这些功能。框架为开发者提供了协程和异步两种任务。切记无论是协程任务还是异步任务,任务里面操作都只支持协程,且能使用框架封装的是所有 IO 操作(数据库、缓存…)

配置与启用

任务配置参数,可以直接在对应的 Server->setting
配置即可,如果要启用任务更简单,  Server
新增一个  on
事件。
Http Server 配置开启任务为例:
Rpc Server 配置开启任务为例:
wsServer Server 配置开启任务为例:

任务配置与启用,在 HttpServer
RpcServer
WebsocketServer
都完全一样,启用任务需要监听  task
finish
两个事件。

声明任务

使用任务前,必须定义任务,定义任务很简单。如下定一个任务:

@Task

标记类是一个任务

  • name 指定任务名称,默认全路径类名

@TaskMapping

映射名称

  • name 名称映射,默认就类的方法名称

@Task
标记类的每个方法就是一个任务,如果方法没有使用  @TaskMapping
注解,不会解析成任务。

协程任务

协程任务投递提供了两种方式,单个投递和批量投递,单个投递是在批量投递的基础之上封装的。如下协程任务投递:

任务投递

单个任务投递,返回数据和任务方法返回的数据完全一致类型也一样

  • name 投递任务任务名称
  • method 投递任务的方法名称
  • params 任务传递的参数即是任务方法的参数,数组格式传递
  • timeout 超时时间,默认 3s 超时
  • ext 任务扩展信息,会传递给任务进程里面
  • tasks 多个任务集合,格式如上
  • timeout 超时时间,默认 3s 超时
  • ext 任务扩展信息,会传递给任务进程里面

任务上下文

有些场景需要在任务里面拿到任务的详细信息,这些信息全部在上下文里面。此时可以使用全局函数 context()
获取  Swoft\Task\TaskContext
上下文对象。上下文提供两个方法,分别获取  Swoft\Task\Request
与  Swoft\Task\Response
对象,里面包含投递任务的所有信息。
注意:一定要在任务里面获取上下文,否则获取的是其它环境的上下文

任务Request对象

方法列表

  • getServer 获取任务 Server 信息
  • getTaskId 获取任务 ID,对应 Swoole 任务 ID
  • getSrcWorkerId 任务来自的 workerId
  • getData 投递任务的原始是数据
  • getName 任务名称
  • getMethod 任务方法
  • getParams 任务参数
  • getExt 任务扩展信息
  • getExtKey 根据 key 快速获取用户信息
  • getType 任务类型
  • getTaskUniqid 任务全局唯一ID

异步任务

异步任务一般用于不需要结果的场景且异步区执行,不影响主流程。如下异步任务投递:

任务投递

异步任务投递,返回一个全局唯一的任务ID

  • name 投递任务任务名称
  • method 投递任务的方法名称
  • params 任务传递的参数即是任务方法的参数,数组格式传递
  • ext 任务扩展信息,会传递给任务进程里面
  • dstWorkerId 投递的进程 workerId,默认底层按需选择进程 workerId

任务上下文

任务上下文和协程任务章节讲解的完全一样

异步任务结果

有很多情况不需要关注异步任务处理结果,但是也有部分场景需要关注异步任务处理结果,框架为开发者提供了一种事件监听的方式来处理异步任务结果。此事件和普通事件完全一样。如下定义是事件监听:

  • 事件必须监听  TaskEvent::FINISH

  • 如果需要获取数据可以从上下文中获取,注意此时获取的是任务完成的上下文对象与任务上下对象不一样。

异步任务完成上下文

在异步任务完成监听器里面可以通过 content()
全局函数获取上下文  Swoft\Task\FinishContext
对象。

  • getTaskData 任务处理的结果内容
  • getTaskId 任务 ID,对应 Swoole 任务 ID
  • getTaskUniqid 全局任务唯一ID,框架生成,与任务投递时的全局任务ID一样
  • getServer 获取任务 Server 相关信息