目录
一、背景
二、示例
2.1安装
2.2绘制流程
最近有需要用到异步任务编排,找了几个比较好用的框架:
京东零售:asyncTool
Gobrs-Async
两个都能满足开发中的需求,不过asyncTool需要在代码中写入大量WorkerWrapper,最后无意间翻到Gobrs-Async,相对于asyncTool来说,它可以全局拦截异常,编排流程比较容易,从节点的开始--执行--结束(中间出现异常)都有想对应的方法,具体其他的优势,可以看看官网放出的这张对比图:
这里举个最简单的多个执行单元的串行请求:
以springboot项目为例,引入依赖
io.github.memorydoc
gobrs-async-starter
1.2.1-RELEASE
在springboot项目中,有两种绘制方式,一种是直接在application.yml配置文件中配置,如下:
spring:
gobrs:
async:
rules:
# 支持多命名空间
- name: "ruleName" # 规则名称
content: "aService->bService->cService"
创建执行单元
@Component
public class AService extends AsyncTask
使用任务触发器
@Autowired
private GobrsAsync gobrsAsync;
#启动任务流程,其中ruleName为application.yml中的规则名称
// 一行代码即可启动任务流程
Map params = new HashMap();
// 任务流程名称 , 任务流程传入参数, 任务流程超时时间
AsyncResult asyncResult = gobrsAsync.go("ruleName", () -> params, timeOut);
任务流程的params参数 有两种参数形式。
#参数类型一
如果任务流程中所有任务 都是用同一个参数进行传递传递(类似于DataContext 上下文), 则params 直接传入公用的同一个参数即可
User user = new User();
AsyncResult asyncResult = gobrsAsync.go("ruleName", () -> user, timeOut);
#参数类型二
如果任务流程中不同任务使用不同的参数。则参数需要传递Map类型, Map的key 为 任务bean 名称, 值为所需要传递的参数值。
User user = new User();
Fruit fruit = new Fruit();
Map params = new HashMap();
// 需要传递参数的 bean 类, 考虑开发者开发喜欢,直接key设计成class 类型
params.put(AService.class, user);
params.put(BService.class, fruit);
AsyncResult asyncResult = gobrsAsync.go("ruleName", () -> params, timeOut);