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 相关信息