🍅规则配置
# 完整配置示例
gobrs:
async:
config:
rules:
# 规则 是数组类型的 多组规则
- name: "general"
content: "AService->BService->FService->GService->HService;EService->CService;AService"
task-interrupt: true # 局部异常是否打断主流程 默认false
transaction: true
- name: "anyConditionGeneral"
content: "AServiceCondition,BServiceCondition,CServiceCondition->DServiceCondition"
logConfig:
costLogabled: false # 开启任务耗时打印 log日志级别需要为 error 默认true
errLogabled: true # 开启任务异常打印 默认true
# AServiceCondition 、BServiceCondition、CServiceCondition任务谁返回true 谁有资格继续往下执行
- name: "anyConditionRule"
content: "AServiceCondition,BServiceCondition,CServiceCondition->DServiceCondition:anyCondition"
- name: "anyConditionRuleAppend"
content: "AServiceCondition,BServiceCondition,CServiceCondition->DServiceCondition:anyCondition->EServiceCondition"
# 官方场景一 https://async.sizegang.cn/pages/2f844b/#%E5%9C%BA%E6%99%AF%E4%B8%80
- name: "caseOne"
content: "caseOneTaskA->caseOneTaskB,caseOneTaskC,caseOneTaskD"
# 官方场景二 https://async.sizegang.cn/pages/2f844b/#%E5%9C%BA%E6%99%AF%E4%BA%8C
- name: "caseTwo"
content: "caseTwoTaskA->caseTwoTaskB->caseTwoTaskC,caseTwoTaskD"
# 官方场景三 https://async.sizegang.cn/pages/2f844b/#%E5%9C%BA%E6%99%AF%E4%B8%89
- name: "caseThree"
content: "caseThreeTaskA->caseThreeTaskB,caseThreeTaskC,caseFourTaskD->caseThreeTaskG;
caseThreeTaskA->caseThreeTaskE,caseThreeTaskF->caseThreeTaskG;"
# 官方场景四 https://async.sizegang.cn/pages/2f844b/#%E5%9C%BA%E6%99%AF%E5%9B%9B
- name: "caseFour"
content: "caseFourTaskA->caseFourTaskB->caseFourTaskC,caseFourTaskD,caseFourTaskE;
caseFourTaskA->caseFourTaskH->caseFourTaskI,caseFourTaskJ,caseFourTaskK;"
logConfig:
costLogabled: false # 关闭耗时任务打印
# 官方场景五 https://async.sizegang.cn/pages/2f844b/#%E5%9C%BA%E6%99%AF%E4%BA%94
- name: "caseFive"
content: "caseFourTaskA,caseFourTaskB,caseFourTaskC->caseFourTaskD:any:exclusive" # any 任意一个任务(A、B、C)执行完成后 则执行D任务
# exclusive 避免任务执行浪费 所以 D执行完成之后 会主动 中断 未完成的任务
server:
port: 9999 # 端口: 8080
# 配置文件位置
如果开发者配置较多 与 springboot
配置文件放在一起有点冗余的话,可以在 resources/config
目录下创建以下配置文件都是支持的。
gobrs.yaml
gobrs.yml
gobrs.properties
# 规则组成
# 规则名称 name
规则对象又两部分组成:
- 规则名称
- 规则内容
规则名称(name) 约定规则的唯一标识符: 在任务触发器开发触发任务的时候需要传递。
# 规则内容 content
规则内容(content) 则是规则引擎解析的核心内容,根据任务执行流程不同,任务规则配置也会不同,但是不会很复杂,详细配置流程分为一下几种场景。
# 日志配置 logConfig
- costLogabled 流程日志打印 包括耗时时间,调用链路等
- errLogabled 任务执行异常日志打印
小提示
我们先说几种场景, 看完之后配置规则你自己就有感觉了
注: 下方配置中的 A、B、C 是指 动态任务在Spring中的Bean名称, 可以使用 @Task("xxx")
定义
ruleName1 代表规则名称,
# 异常捕获
在流程配置task-interrupt
时,有些开发者不希望任务执行的异常被gobrs-async包装。 而是想亲自进行异常捕获,根据异常类型进行不同业务处理。此时可以配置
异常抛出配置: catchable
- name: "stopAsyncRule"
content: "stopAsyncTaskA,stopAsyncTaskB,stopAsyncTaskC;stopAsyncTaskD->stopAsyncTaskE->stopAsyncTaskF"
catchable: true
# 规则示例
# 场景一
如图1-1
说明 任务A 执行完了之后,继续执行 B、C、D
配置
gobrs:
async:
rules:
- name: "ruleName1"
content: "A->B,C,D"
# 场景二
如图1-2
说明 任务A 执行完了之后执行B 然后再执行 C、D
配置
gobrs:
async:
rules:
- name: "ruleName1"
content: "A->B->C,D"
# 场景三
如图1-3
说明 任务A 执行完了之后执行B、E 然后按照顺序 B的流程走C、D、G。 E的流程走F、G
配置
gobrs:
async:
rules:
- name: "ruleName1"
content: "A->B->C->D->G;A->E->F->G"
# 场景四
如图1-4
说明 这种任务流程 Gobrs-Async 也能轻松支持
配置
gobrs:
async:
rules:
- name: "ruleName1"
content: "A->B->C,D,E;A->H->I,J,K"
# 场景五
如图1-5
# 示例一
说明 A、B、C 执行完之后再执行D
配置
gobrs:
async:
rules:
- name: "ruleName1"
content: "A,B,C->D"
# 示例二
说明
A、B、C 任务任意一个执行完成,则立即执行任务D( 谁最快执行谁执行, 类似于任务流程竞争关系 )
此时可以使用 配置关键字 :any
配置
gobrs:
async:
## :any 是关键字 表示任意 依赖的任务执行完成立即执行自己
rules:
- name: "ruleName1"
content: "A,B,C->D:any"
# 示例三
说明
A、B、C 任务任意一个执行完成,则立即执行任务D( 谁最快执行谁执行, 类似于任务流程竞争关系 )
与示例不同的是, 如果 D拿到执行权后,会将自身所依赖的未完成的任务 强制中断执行(避免浪费资源,业务运行等)
此时可以使用 配置关键字 :exclusive
配置
gobrs:
async:
## :exclusive 是关键字
rules:
- name: "ruleName1"
content: "A,B,C->D:any:exclusive"
# 示例四
同示例二有点类似,在示例二的场景下,无法根据某一个任务的执行成功或者失败进行后续任务的处理,示例二完全根据线程调度执行的随机顺序进行执行,即谁先执行完
谁有资格继续往下执行,所以如果想 执行结果的条件 即: task
方法返回 true
则立即执行,返回false则不执行的判断条件进行控制。那么就有以下的实现方式。
# 第一步 任务编写
(如果不清楚如何开发一个动态任务,请阅读下一章节:动态任务)
@Override
public Boolean task(Object o, TaskSupport support) {
try {
System.out.println("AServiceCondition Begin");
Thread.sleep(300);
for (int i1 = 0; i1 < i; i1++) {
i1 += i1;
}
System.out.println("AServiceCondition Finish");
} catch (InterruptedException e) {
// log 打印
//e.printStackTrace();
// 返回false 则没有资格执行子任务的逻辑
return false;
}
// 返回true 进行执行子任务的逻辑
return true;
}
# 第二步 任务配置
gobrs:
async:
## :any 是关键字 表示任意 依赖的任务执行完成立即执行自己
rules:
- name: "ruleName1"
content: "A,B,C->D:anyCondition"
# 注意
示例三 需要和 示例二配合生效, 因为这两种示例是结合的一种场景。
# 规则总结
规则配置跟流程图几乎非常相近。
- 在任务分叉时 使用
,
区分不同任务。 - 在任务流程发起时 用
->
区分任务流。 - 每个任务流结束后 用
;
进行结束配置。
提示
如果你不习惯使用以上配置符号,想自定义在配置符号, 在 Gobrs-Async
中也是支持配置的,可以根据用户使用喜欢进行灵活配置
只需要 在application.yml
中配置即可