代码拉取完成,页面将自动刷新
轻量级任务编排管理
TaskContext: 执行上下文/执行容器: 存放一组逻辑相关性的TaskWrapper
- 添加任务 => 等待对列 => 循环取出任务(直到并行限制 或 某个任务结束) => 正在执行对列 => 结束
TaskWrapper: 任务由多个执行单元Step顺序组成
- 入参 => Step1 => 结果(入参) => Step2 => 结果(入参) => Step3 => 结果
Step: 任务执行单元/执行函数/执行步骤
- 一般步骤: 执行 => 结果
- 并行步骤: 多个执行函数并行
- 可重复步骤: 执行 <=> 执行次数+1 <=> 是否需要重新执行 => 结果
<dependency>
<groupId>cn.xnatural.task</groupId>
<artifactId>task</artifactId>
<version>1.0.2</version>
</dependency>
new TaskWrapper("task1")
// 添加执行步骤1
.step(step -> {
step.info("执行 step{} ... ", step.num);
})
// 添加执行步骤2
.step(step -> {
step.info("执行 step{} ... ", step.num);
})
// 可继续添加更多步骤
.run();
// 步骤参数传递
Object result = new TaskWrapper("task1")
// 添加执行步骤1
.step((input, step) -> {
step.info("执行 step{} ... ", step.num);
return input + "xxx";
})
// 添加执行步骤2
.step((input, step) -> {
step.info("执行 step{} ... ", step.num);
return input + "ooo";
})
// 可继续添加更多步骤
.run("谁在");
System.out.println(result); // 谁在xxxooo
Object result = new TaskWrapper()
// 添加可重复执行步骤
.reStep(5, (input, step) -> {
step.info("执行重试step{}, 第 {} 次", step.num, step.times());
return new Random().nextInt(10) % 2 == 0 ? null : input + " end";
}, (v, step) -> { // 返回 true 则重复继续执行当前步骤
return v == null;
})
.run("xxx");
System.out.println(result); // xxx end
TaskWrapper task = new TaskWrapper()
// 添加执行步骤1
.step(step -> {
step.info("执行 step1");
step.task().suspend(); // 暂停下一个步骤执行
return "xxx";
})
// 添加执行步骤2
.step((param, step) -> {
step.debug("执行 step2, 参数: " + param); // param 为xxx
});
task.run(); // 开始执行
Thread.sleep(1000L * 5);
task.resume(); // 恢复执行
new TaskWrapper()
// 添加执行步骤1
.step(step -> {
step.info("执行 step{}", step.num);
return new Random().nextInt(10) % 2 == 0 ? "xxx" : "ooo";
})
// 条件步骤
.step((input, step) -> {
step.info("执行 step{} ... ", step.num);
}, (input, step) -> Objects.equals(input, "xxx")) // 当前步骤执行的条件判断函数
.run();
一个大任务被拆分为多个小任务时
一组相关任务(执行上下文/任务调度/执行容器), 可编排复杂任务执行顺序规则
可控制任务并发数
当容器中两个队列(正在执行队列,等待执行队列)都为空并且是非暂停状态时, 容器自动结束
new TaskContext("ctx")
.addTask(new TaskWrapper("A").step(step -> {
step.info("执行任务: {}", step.task().key);
}))
.addTask(new TaskWrapper("B").step(step -> {
step.info("执行任务: {}", step.task().key);
}, step -> step.ctx().taskSuccess("A")))
.addTask(new TaskWrapper("C").step(step -> {
step.info("执行任务: {}", step.task().key);
}, step -> step.ctx().taskSuccess("B")))
.start();
new TaskContext("ctx")
.addTask(new TaskWrapper("A").step(step -> {
step.info("执行任务: {}", step.task().key);
}))
.addTask(new TaskWrapper("B").step(step -> {
step.info("执行任务: {}", step.task().key);
}))
.addTask(new TaskWrapper("C").step(step -> {
step.info("执行任务: {}", step.task().key);
}))
.start();
new TaskContext("ctx")
.addTask(new TaskWrapper("A").step(step -> {
step.info("执行任务: {}", step.task().key);
}))
.addTask(new TaskWrapper("B").step(step -> {
step.info("执行任务: {}", step.task().key);
}, step -> step.ctx().taskSuccess("A")))
.addTask(new TaskWrapper("C").step(step -> {
step.info("执行任务: {}", step.task().key);
}, step -> step.ctx().taskSuccess("A")))
.start();
new TaskContext("ctx")
.addTask(new TaskWrapper("A").step(step -> {
step.info("执行任务: {}", step.task().key);
}, step -> step.ctx().taskSuccess("B") && step.ctx().taskSuccess("C")))
.addTask(new TaskWrapper("B").step(step -> {
step.info("执行任务: {}", step.task().key);
}))
.addTask(new TaskWrapper("C").step(step -> {
step.info("执行任务: {}", step.task().key);
}))
.start();
new TaskContext("ctx")
.addTask(new TaskWrapper("A").step(step -> {
step.info("执行任务: {}", step.task().key);
}))
.addTask(new TaskWrapper("B").step(step -> {
step.info("执行任务: {}", step.task().key);
}, step -> step.ctx().taskSuccess("A")))
.addTask(new TaskWrapper("C").step(step -> {
step.info("执行任务: {}", step.task().key);
}, step -> step.ctx().taskSuccess("A")))
.addTask(new TaskWrapper("D").step(step -> {
step.info("执行任务: {}", step.task().key);
}, step -> step.ctx().taskSuccess("B")))
.addTask(new TaskWrapper("E").step(step -> {
step.info("执行任务: {}", step.task().key);
}, step -> step.ctx().taskSuccess("C")))
.addTask(new TaskWrapper("F").step(step -> {
step.info("执行任务: {}", step.task().key);
}, step -> step.ctx().taskSuccess("D") && step.ctx().taskSuccess("E")))
.start();
new TaskContext("ctx2")
.addTask(new TaskWrapper("A", step -> {
step.info("执行任务: {}", step.task().key);
}))
.addTask(new TaskWrapper("B").step(step -> {
step.info("执行任务: {}", step.task().key);
}, step -> step.ctx().taskSuccess("A")))
.addTask(new TaskWrapper("C").step(step -> {
step.info("执行任务: {}", step.task().key);
}, step -> step.ctx().taskSuccess("A")))
.addTask(new TaskWrapper("F").step(step -> {
step.info("执行任务: {}", step.task().key);
}, step -> step.ctx().taskSuccess("B") && step.ctx().taskSuccess("B")))
.addTask(new TaskWrapper("D", step -> {
step.info("执行任务: {}", step.task().key);
}))
.addTask(new TaskWrapper("E").step(step -> {
step.info("执行任务: {}", step.task().key);
}, step -> step.ctx().taskSuccess("D")))
.addTask(new TaskWrapper("G").step(step -> {
step.info("执行任务: {}", step.task().key);
}, step -> step.ctx().taskSuccess("E")))
.addTask(new TaskWrapper("H").step(step -> {
step.info("执行任务: {}", step.task().key);
}, step -> step.ctx().taskSuccess("F") && step.ctx().taskSuccess("G")))
.start();
new TaskContext() //创建任务容器
// 添加task1
.addTask(new TaskWrapper("task1"))
// 添加task2
.addTask(new TaskWrapper("task2"))
// 添加任务3: 在任务中衍生任务task4
.addTask(new TaskWrapper("task3").step(step -> {
step.info("执行");
step.ctx().addTask(new TaskWrapper("task4").step(step1 -> {
step1.info("执行衍生任务");
}));
}))
.start();
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。