目录
最近有需要用到异步任务编排,找了几个比较好用的框架:
两个都能满足开发中的需求,不过asyncTool需要在代码中写入大量WorkerWrapper,最后无意间翻到Gobrs-Async,相对于asyncTool来说,它可以全局拦截异常,编排流程比较容易,从节点的开始--执行--结束(中间出现异常)都有想对应的方法,具体其他的优势,可以看看官网放出的这张对比图:
这里举个最简单的多个执行单元的串行请求:
以springboot项目为例,引入依赖
- <dependency>
- <groupId>io.github.memorydoc</groupId>
- <artifactId>gobrs-async-starter</artifactId>
- <version>1.2.1-RELEASE</version>
- </dependency>
在springboot项目中,有两种绘制方式,一种是直接在application.yml配置文件中配置,如下:
- spring:
- gobrs:
- async:
- rules:
- # 支持多命名空间
- - name: "ruleName" # 规则名称
- content: "aService->bService->cService"
创建执行单元
- @Component
- public class AService extends AsyncTask
-
-
- @Override
- public void prepare(Object o) {
-
- }
-
- @Override
- public Object task(Object o, TaskSupport support) {
- //获取任务执行时传递的公共参数
- Map
param = (Map) getParam(support); - //在BService中获取上一单元的执行结果
- //String result = getResult(support, AService.class);
- return null;
- }
-
-
-
-
- @Override
- public boolean nessary(Object o, TaskSupport support) {
- return true;
- }
-
- @Override
- public void onSuccess(TaskSupport support) {
-
- }
-
- @Override
- public void onFail(TaskSupport support) {
-
- }
- }
使用任务触发器
- @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);