33

Swoft 2 任务更新啦

 5 years ago
source link: https://www.tuicool.com/articles/zyyARbM
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

任务

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

配置与启用

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

Http Server 配置开启任务为例:

Rpc Server 配置开启任务为例:

wsServer Server 配置开启任务为例:

任务配置与启用,在 HttpServerRpcServerWebsocketServer 都完全一样,启用任务需要监听  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 相关信息


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK