PipelineHandler
PipelineHandler允许外部编排 TaskHandler,根据上一轮结果和状态派发下一个Task。
PipelineInstance 执行期间会绑定对应的PipelineHandler。
接口
ts
abstract class PipelineHandler {
abstract readonly name: string
readonly description?: string
abstract next(this: any, lastResult: unknown): PipelineStep | undefined
onNormalSIG?(this: any, signal: NormalSignal): void | Promise<void>
}| 成员 | 作用 |
|---|---|
name | Event选择Pipeline时使用的名称 |
description | Pipeline的用途说明 |
next() | 根据上一个Task的结果派发下一步 |
onNormalSIG() | 接收发给当前Event的普通信号 |
next()返回一个PipelineStep:
ts
interface PipelineStep {
task: string
input: unknown
}task对应已注册的TaskHandler,input会成为该TaskInstance的输入。
定义 Handler
ts
import { PipelineHandler } from '@nyirusu/nasdk/NACEB'
import type { PipelineInstance } from '@nyirusu/nasdk/NACEB'
class GreetingPipeline extends PipelineHandler {
readonly name = 'greeting'
readonly description = '生成问候语'
next(this: PipelineInstance, lastResult: unknown) {
if (!this.state.started) {
this.state.started = true
return {
task: 'greet',
input: this.event.payload,
}
}
return { task: '$terminal', input: lastResult }
}
}TIP
Pipeline第一次运行时,lastResult为undefined,此后是上一个Task的返回值。
由于Task也可能返回undefined,需要区分步骤时应使用this.state记录。
DANGER
next()和onNormalSIG()的this绑定在PipelineInstance,而不是PipelineHandler。
| 成员 | 作用 |
|---|---|
this.event | 当前Pipeline处理的EventInstance |
this.state | 跨Task步骤共享的状态空间 |
this.getTask() | 获取当前TaskInstance |
this.signalTask() | 将信号继续发送给当前Task |
因此next()和onNormalSIG()应使用普通方法,不应使用箭头函数。
Handler内对this的修改是在对应实例上完成的,并不会修改Handler本身。这一点和TaskHandler一致。
结束 Pipeline
Pipeline必须派发 $terminal 任务才能视为正常完成:
ts
return { task: '$terminal', input: finalResult }$terminal的输入就是Pipeline最终结果。
普通信号
普通信号会先交给onNormalSIG(),不会立刻传给当前Task,信号入口见Event层。
ts
async onNormalSIG(this: PipelineInstance, signal: NormalSignal) {
await this.signalTask(signal)
}注册
在构造NACEB时传入实例:
ts
const naceb = new NACEB({
pipelineHandlers: [new GreetingPipeline()],
taskHandlers: [],
})也可以在构造后注册:
ts
naceb.registerPipelineHandler(new GreetingPipeline())
