package com.happy3w.task.composer;
import com.happy3w.toolkits.message.MessageRecorderException;
import java.text.MessageFormat;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Stack;
public class TaskComposer implements TaskExecuteContext {
private final Map<Long, TaskStatusHolder> holderMap;
private final Map<String, TaskStatusHolder> outputHolderMap;
private final Map<String, Object> outputValues = new HashMap<>();
public TaskComposer(Map<Long, TaskStatusHolder> holderMap, Map<String, TaskStatusHolder> outputHolderMap) {
this.holderMap = holderMap;
this.outputHolderMap = outputHolderMap;
}
public TaskComposer resetContext() {
outputValues.clear();
for (TaskStatusHolder holder : outputHolderMap.values()) {
holder.setStatus(TaskStatus.waiting);
}
return this;
}
public TaskComposer withValues(Map<String, Object> values) {
this.outputValues.putAll(values);
return this;
}
public List<DependItem> dependItemList() {
return TaskStatusHolder.genDependGraphItems(holderMap.values());
}
public List<DependItem> dependItemListFor(String name) {
Stack<TaskStatusHolder> taskStack = new Stack<>();
taskStack.push(this.outputHolderMap.get(name));
Map<Long, TaskStatusHolder> taskToRun = new HashMap<>();
while (!taskStack.isEmpty()) {
TaskStatusHolder curTask = taskStack.pop();
if (taskToRun.containsKey(curTask.getId())) {
continue;
}
curTask.dependStream()
.filter(depend -> !taskToRun.containsKey(depend.getId()))
.forEach(taskStack::push);
}
return TaskStatusHolder.genDependGraphItems(taskToRun.values());
}
@Override
public synchronized Object getValue(String name) {
return outputValues.get(name);
}
@Override
public synchronized void setValue(String name, Object value) {
outputValues.put(name, value);
}
public static TaskComposer build(Collection<Task> tasks) {
long nextId = 0;
Map<String, TaskStatusHolder> outputTaskMap = new HashMap<>();
Map<Long, TaskStatusHolder> holderMap = new HashMap();
indexAllTask(tasks, nextId, outputTaskMap, holderMap);
completeDepends(outputTaskMap);
return new TaskComposer(holderMap, outputTaskMap);
}
private static void completeDepends(Map<String, TaskStatusHolder> outputHolderMap) {
for (TaskStatusHolder holder : outputHolderMap.values()) {
List<TaskDataDef> inputs = holder.getTask().getInputs();
if (inputs == null || inputs.isEmpty()) {
continue;
}
for (TaskDataDef input : inputs) {
TaskStatusHolder inputCreator = outputHolderMap.get(input.getName());
if (inputCreator != null) {
holder.addDepend(inputCreator);
}
}
}
}
private static void indexAllTask(Collection<Task> tasks, long nextId, Map<String, TaskStatusHolder> outputTaskMap, Map<Long, TaskStatusHolder> holderMap) {
for (Task task : tasks) {
List<TaskDataDef> outputs = task.getOutputs();
if (outputs == null || outputs.isEmpty()) {
throw new IllegalArgumentException("Task output should not be empty. task:" + task);
}
TaskStatusHolder holder = new TaskStatusHolder(nextId++, task);
holderMap.put(holder.getId(), holder);
for (TaskDataDef output : outputs) {
TaskStatusHolder existOutput = outputTaskMap.get(output.getName());
if (existOutput != null) {
String message = MessageFormat.format("Duplicate output:{0} in tasks:{1}, {2}",
output.getName(), existOutput.getTask(), task);
throw new IllegalArgumentException(message);
}
outputTaskMap.put(output.getName(), holder);
}
}
}
public TaskComposer withValue(String name, Object value) {
outputValues.put(name, value);
return this;
}
public TaskExecutor executorFor(String outputName) {
if (outputValues.containsKey(outputName)) {
return new TaskExecutor(Collections.EMPTY_LIST, this);
}
TaskStatusHolder outputHolder = outputHolderMap.get(outputName);
if (outputHolder == null) {
throw new IllegalArgumentException("Failed to execute for no task for output:" + outputName);
}
if (outputHolder.getStatus() == TaskStatus.finished) {
return new TaskExecutor(Collections.EMPTY_LIST, this);
}
Collection<TaskStatusHolder> taskHolderToRun = collectTasksToRun(outputHolder);
return new TaskExecutor(taskHolderToRun, this);
}
public <T> T evaluate(String outputName) {
return executorFor(outputName)
.getDataValue(outputName);
}
private Collection<TaskStatusHolder> collectTasksToRun(TaskStatusHolder outputHolder) {
Map<Long, TaskStatusHolder> existedTaskHolder = new HashMap<>();
Map<String, TaskDataDef> lostInputs = new HashMap<>();
Stack<TaskStatusHolder> holderStack = new Stack<>();
holderStack.push(outputHolder);
while (!holderStack.isEmpty()) {
TaskStatusHolder holder = holderStack.pop();
if (existedTaskHolder.containsKey(holder.getId())) {
continue;
}
holder.setStatus(TaskStatus.waiting);
checkInputExist(holder.getTask().getInputs(), lostInputs);
existedTaskHolder.put(holder.getId(), holder);
List<TaskStatusHolder> depends = holder.getDepends();
if (depends != null && !depends.isEmpty()) {
for (TaskStatusHolder dependHolder : holder.getDepends()) {
if (dependHolder.getStatus() != TaskStatus.finished) {
holderStack.push(dependHolder);
}
}
}
}
if (!lostInputs.isEmpty()) {
throw new MessageRecorderException("These inputs are required:" + lostInputs.values());
}
return existedTaskHolder.values();
}
private void checkInputExist(List<TaskDataDef> inputs, Map<String, TaskDataDef> lostInputs) {
if (inputs == null || inputs.isEmpty()) {
return;
}
for (TaskDataDef def : inputs) {
String inputName = def.getName();
if (outputHolderMap.containsKey(inputName)
|| lostInputs.containsKey(inputName)
|| outputValues.containsKey(inputName)) {
continue;
}
lostInputs.put(inputName, def);
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
轻量级任务管理执行工具
![preview](https://csdnimg.cn/release/downloadcmsfe/public/img/white-bg.ca8570fa.png)
共36个文件
java:28个
properties:1个
gradlew:1个
![preview-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/scale.ab9e0183.png)
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 114 浏览量
2023-12-19
14:06:50
上传
评论
收藏 96KB ZIP 举报
温馨提示
这是一个用于运行某些任务的工具,这些任务具有输入和输出,并且某些任务的输入是其他任务的输出。
资源推荐
资源详情
资源评论
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
收起资源包目录
![package](https://csdnimg.cn/release/downloadcmsfe/public/img/package.f3fc750b.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/JAR.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
共 36 条
- 1
资源评论
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/de50ac10e30e41b89db28203f97239be_qq_41701956.jpg!1)
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6815
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)