jsonPathList) throws Exception {
59 | ParsedParam parsedParam = new ParsedParam();
60 | Class>[] parameterTypes = new Class[jsonPathList.size()];
61 | Object[] args = new Object[jsonPathList.size()];
62 | parsedParam.setParameterTypes(parameterTypes);
63 | parsedParam.setArgs(args);
64 |
65 | for (int i = 0; i < jsonPathList.size(); i++) {
66 | JsonPathConfig jsonPathConfig = jsonPathList.get(i);
67 |
68 | Class> typeClass = Class.forName(jsonPathConfig.getType());
69 | jsonPathConfig.setTypeClass(typeClass);
70 | parameterTypes[i] = typeClass;
71 | args[i] = parseArg(jsonPathConfig);
72 | }
73 | return parsedParam;
74 | }
75 |
76 | /**
77 | * 解析逻辑
78 | * 1、path 不存在,直接返回 defaultValue
79 | * 2、path、defaultValue 都存在,根据 path 解析报错,直接返回 defaultValue
80 | * 3、path 存在,defaultValue 不存在,根据 path 解析报错,抛异常
81 | * @param jsonPathConfig
82 | * @return
83 | */
84 | public Object parseArg(JsonPathConfig jsonPathConfig) {
85 | String path = jsonPathConfig.getPath();
86 | Object defaultValue = jsonPathConfig.getValue();
87 | Class> typeClass = jsonPathConfig.getTypeClass();
88 | //path value都为空,配置有误,抛异常
89 | if (StringUtils.isBlank(path) && defaultValue == null) {
90 | throw new TaskFlowException("jsonPathConfig error");
91 | }
92 | //path为空直接返回value
93 | if (StringUtils.isBlank(path)) {
94 | return convertValue(typeClass, defaultValue);
95 | }
96 | //从请求上下文或其它OP结果中根据jsonpath解析
97 | //解析jsonpath异常时,如果 value 不为空则直接返回,否则抛异常
98 | Object value;
99 | try {
100 | JsonPathModel jsonPathModel = ParamExpressUtil.parseJsonPath(path);
101 | String opId = jsonPathModel.getOpId();
102 | String realPath = jsonPathModel.getRealPath();
103 | OperatorResult operatorResult = DagContextHolder.getOperatorResult(opId);
104 | Object result = operatorResult.getResult();
105 | value = ParamParserHelper.parse(GsonUtil.toJson(result), realPath, typeClass);
106 | } catch (Exception e) {
107 | log.error("parseArg error", e);
108 | if (defaultValue != null) {
109 | return convertValue(typeClass, defaultValue);
110 | } else {
111 | throw new TaskFlowException(e);
112 | }
113 | }
114 | return value;
115 | }
116 |
117 | /**
118 | * 将 value 转换成具体类型的对象
119 | */
120 | public Object convertValue(Class> typeClass, Object value) {
121 | return GsonUtil.convertValue(typeClass, value);
122 | }
123 | }
--------------------------------------------------------------------------------
/taskflow-core/src/main/java/org/taskflow/core/operator/IOperator.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.core.operator;
2 |
3 | /**
4 | * Operator接口
5 | * Created by ytyht226 on 2022/3/16.
6 | */
7 | @FunctionalInterface
8 | public interface IOperator {
9 |
10 | /**
11 | * 自定义OP的默认返回值,比如节点执行异常时
12 | */
13 | default V defaultValue() {
14 | return null;
15 | }
16 |
17 | /**
18 | * 该方法实现OP的具体处理逻辑
19 | */
20 | V execute(P param) throws Exception;
21 |
22 | /**
23 | * OP执行前回调
24 | */
25 | default void onStart(P param) {
26 | }
27 | /**
28 | * OP执行成功后回调
29 | */
30 | default void onSuccess(P param, OperatorResult result) {
31 | }
32 | /**
33 | * OP执行异常后回调
34 | */
35 | default void onError(P param, OperatorResult result) {
36 | }
37 |
38 | }
39 |
--------------------------------------------------------------------------------
/taskflow-core/src/main/java/org/taskflow/core/operator/IParamParseOperator.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.core.operator;
2 |
3 | /**
4 | * OP参数解析接口
5 | * Created by ytyht226 on 2022/11/28.
6 | */
7 | public interface IParamParseOperator extends IOperator
{
8 | }
--------------------------------------------------------------------------------
/taskflow-core/src/main/java/org/taskflow/core/operator/OperatorResult.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.core.operator;
2 |
3 | import org.taskflow.core.enums.ResultState;
4 |
5 | /**
6 | * Operator执行结果
7 | * Created by ytyht226 on 2022/3/17.
8 | */
9 | public class OperatorResult {
10 | /**
11 | * 执行的结果
12 | */
13 | private V result;
14 | /**
15 | * 结果状态
16 | */
17 | private ResultState resultState;
18 | /**
19 | * 异常信息
20 | */
21 | private Throwable ex;
22 |
23 | public OperatorResult(V result, ResultState resultState) {
24 | this(result, resultState, null);
25 | }
26 |
27 | public OperatorResult(V result, ResultState resultState, Exception ex) {
28 | this.result = result;
29 | this.resultState = resultState;
30 | this.ex = ex;
31 | }
32 |
33 | public static OperatorResult defaultResult() {
34 | return new OperatorResult<>(null, ResultState.DEFAULT);
35 | }
36 |
37 | @Override
38 | public String toString() {
39 | return "OperatorResult{" +
40 | "result=" + result +
41 | ", resultState=" + resultState +
42 | ", ex=" + ex +
43 | '}';
44 | }
45 |
46 | public Throwable getEx() {
47 | return ex;
48 | }
49 |
50 | public void setEx(Throwable ex) {
51 | this.ex = ex;
52 | }
53 |
54 | public V getResult() {
55 | return result;
56 | }
57 |
58 | public void setResult(V result) {
59 | this.result = result;
60 | }
61 |
62 | public ResultState getResultState() {
63 | return resultState;
64 | }
65 |
66 | public void setResultState(ResultState resultState) {
67 | this.resultState = resultState;
68 | }
69 | }
--------------------------------------------------------------------------------
/taskflow-core/src/main/java/org/taskflow/core/operator/RecurseParamParseOperator.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.core.operator;
2 |
3 | import com.google.gson.JsonArray;
4 | import com.google.gson.JsonElement;
5 | import com.google.gson.JsonObject;
6 | import org.taskflow.common.util.ClassUtil;
7 | import org.taskflow.common.util.gson.GsonUtil;
8 | import org.taskflow.config.op.ParamExpressUtil;
9 | import org.taskflow.config.op.ParamParserHelper;
10 | import org.taskflow.config.op.model.JsonPathModel;
11 | import org.taskflow.core.DagContextHolder;
12 |
13 | import java.util.Map;
14 |
15 | /**
16 | * OP入参解析器
17 | * 递归地解析参数的子字段
18 | * Created by ytyht226 on 2022/11/28.
19 | */
20 | public class RecurseParamParseOperator extends DefaultParamParseOperator {
21 |
22 | @Override
23 | public Object convertValue(Class> typeClass, Object value) {
24 | if (ClassUtil.isPrimitive(typeClass)) {
25 | return super.convertValue(typeClass, value);
26 | }
27 | JsonElement rootElement = GsonUtil.getGson().toJsonTree(value);
28 |
29 | Object processedValue = processValue(rootElement);
30 | return super.convertValue(typeClass, processedValue);
31 | }
32 |
33 | /**
34 | * 递归解析节点内容
35 | */
36 | private Object processValue(JsonElement element) {
37 |
38 | if (element.isJsonObject()) {
39 | JsonObject objElement = (JsonObject) element;
40 | for (Map.Entry entry : ((JsonObject) element).entrySet()) {
41 | Object value = processValue(entry.getValue());
42 | objElement.add(entry.getKey(), (JsonElement) value);
43 | }
44 | } else if (element.isJsonArray()) {
45 | JsonArray arrElement = (JsonArray) element;
46 | for (int i = 0; i < arrElement.size(); i++) {
47 | Object value = processValue(arrElement.get(i));
48 | arrElement.set(i, (JsonElement)value);
49 | }
50 | } else {
51 | String path = element.getAsString();
52 | if (!ParamExpressUtil.isJsonPathExpression(path)) {
53 | return element;
54 | }
55 | Object parsedValue = parsePathValue(path);
56 | return parsedValue;
57 | }
58 | return element;
59 | }
60 |
61 | /**
62 | * 根据path从引擎上下文中解析具体内容
63 | */
64 | private Object parsePathValue(String path) {
65 | JsonPathModel jsonPathModel = ParamExpressUtil.parseJsonPath(path);
66 | String opId = jsonPathModel.getOpId();
67 | String realPath = jsonPathModel.getRealPath();
68 | OperatorResult> operatorResult = DagContextHolder.getOperatorResult(opId);
69 | Object result = operatorResult.getResult();
70 | return ParamParserHelper.parse(GsonUtil.toJson(result), realPath);
71 | }
72 | }
--------------------------------------------------------------------------------
/taskflow-core/src/main/java/org/taskflow/core/task/MultiParamTaskResult.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.core.task;
2 |
3 | import lombok.Data;
4 | import org.taskflow.core.wrapper.OperatorWrapper;
5 |
6 | import java.util.List;
7 |
8 |
9 | /**
10 | * 任务入参及结果
11 | * 参数可以传入多个,比如批量查询接口
12 | * @param 执行任务的入参类型
13 | * @param 任务执行结果类型
14 | * Created by ytyht226 on 2023/3/17.
15 | */
16 | @Data
17 | public class MultiParamTaskResult {
18 | /**
19 | * 任务入参
20 | */
21 | private P obj;
22 | /**
23 | * 任务结果
24 | */
25 | private V data;
26 | /**
27 | * 任务执行状态,data为空时,可以查看执行的信息
28 | */
29 | private transient OperatorWrapper, List>> operatorWrapper;
30 |
31 | public MultiParamTaskResult(P obj) {
32 | this.obj = obj;
33 | }
34 |
35 | public MultiParamTaskResult(P obj, V data) {
36 | this.obj = obj;
37 | this.data = data;
38 | }
39 |
40 | public MultiParamTaskResult(P obj, OperatorWrapper, List>> operatorWrapper) {
41 | this.obj = obj;
42 | this.operatorWrapper = operatorWrapper;
43 | }
44 |
45 | public MultiParamTaskResult(P obj, V data, OperatorWrapper, List>> operatorWrapper) {
46 | this.obj = obj;
47 | this.data = data;
48 | this.operatorWrapper = operatorWrapper;
49 | }
50 | }
--------------------------------------------------------------------------------
/taskflow-core/src/main/java/org/taskflow/core/task/TaskResult.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.core.task;
2 |
3 | import lombok.Data;
4 | import org.taskflow.core.wrapper.OperatorWrapper;
5 |
6 |
7 | /**
8 | * 任务入参及结果
9 | * @param 执行任务的入参类型
10 | * @param 任务执行结果类型
11 | * Created by ytyht226 on 2023/3/17.
12 | */
13 | @Data
14 | public class TaskResult {
15 | /**
16 | * 任务入参
17 | */
18 | private P obj;
19 | /**
20 | * 任务结果
21 | */
22 | private V data;
23 | /**
24 | * 任务执行状态,data为空时,可以查看执行的信息
25 | */
26 | private transient OperatorWrapper
operatorWrapper;
27 |
28 | public TaskResult(P obj) {
29 | this.obj = obj;
30 | }
31 |
32 | public TaskResult(P obj, V data) {
33 | this.obj = obj;
34 | this.data = data;
35 | }
36 |
37 | public TaskResult(P obj, OperatorWrapper
operatorWrapper) {
38 | this.obj = obj;
39 | this.operatorWrapper = operatorWrapper;
40 | }
41 |
42 | public TaskResult(P obj, V data, OperatorWrapper
operatorWrapper) {
43 | this.obj = obj;
44 | this.data = data;
45 | this.operatorWrapper = operatorWrapper;
46 | }
47 | }
--------------------------------------------------------------------------------
/taskflow-core/src/main/java/org/taskflow/core/thread/pool/CustomThreadFactory.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.core.thread.pool;
2 |
3 |
4 | import java.util.concurrent.ThreadFactory;
5 | import java.util.concurrent.atomic.AtomicInteger;
6 |
7 | /**
8 | * 自定义线程工厂
9 | * Created by ytyht226 on 2023/3/3.
10 | */
11 | public class CustomThreadFactory implements ThreadFactory {
12 | private static final AtomicInteger POOL_SEQ = new AtomicInteger(1);
13 |
14 | private final AtomicInteger mThreadNum = new AtomicInteger(1);
15 |
16 | private final String mPrefix;
17 |
18 | private final boolean mDaemon;
19 |
20 | private ThreadGroup threadGroup;
21 |
22 | public CustomThreadFactory() {
23 | this("taskFlow-" + POOL_SEQ.getAndIncrement(), true);
24 | }
25 |
26 | public CustomThreadFactory(String prefix) {
27 | this(prefix, true);
28 | }
29 |
30 | public CustomThreadFactory(String prefix, boolean daemon) {
31 | mPrefix = prefix + "-thread-";
32 | mDaemon = daemon;
33 | SecurityManager s = System.getSecurityManager();
34 | threadGroup = (s == null) ? Thread.currentThread().getThreadGroup() : s.getThreadGroup();
35 | }
36 |
37 | public static CustomThreadFactory newInstance() {
38 | return new CustomThreadFactory();
39 | }
40 |
41 | public ThreadGroup getThreadGroup() {
42 | return threadGroup;
43 | }
44 |
45 | public void setThreadGroup(ThreadGroup threadGroup) {
46 | this.threadGroup = threadGroup;
47 | }
48 |
49 | @Override
50 | public Thread newThread(Runnable runnable) {
51 | String name = mPrefix + mThreadNum.getAndIncrement();
52 | Thread ret = new Thread(threadGroup, runnable, name, 0);
53 | ret.setDaemon(mDaemon);
54 | return ret;
55 | }
56 | }
--------------------------------------------------------------------------------
/taskflow-core/src/main/java/org/taskflow/core/thread/pool/CustomThreadPool.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.core.thread.pool;
2 |
3 | import com.alibaba.ttl.threadpool.TtlExecutors;
4 |
5 | import java.util.concurrent.ExecutorService;
6 | import java.util.concurrent.LinkedBlockingQueue;
7 | import java.util.concurrent.ThreadPoolExecutor;
8 | import java.util.concurrent.TimeUnit;
9 |
10 | /**
11 | * 自定义线程池
12 | * Created by ytyht226 on 2023/3/3.
13 | */
14 | public class CustomThreadPool {
15 |
16 | /**
17 | * 固定线程,推荐使用
18 | */
19 | public static ExecutorService newFixedThreadPoolWrapper(int nThreads) {
20 | return TtlExecutors.getTtlExecutorService(newFixedThreadPool(nThreads));
21 | }
22 |
23 | /**
24 | * 固定线程
25 | */
26 | public static ExecutorService newFixedThreadPool(int nThreads) {
27 | return new ThreadPoolExecutor(
28 | nThreads,
29 | nThreads,
30 | 0L,
31 | TimeUnit.MILLISECONDS,
32 | new LinkedBlockingQueue<>(),
33 | CustomThreadFactory.newInstance());
34 | }
35 |
36 | }
--------------------------------------------------------------------------------
/taskflow-core/src/main/java/org/taskflow/core/util/ConvertUtil.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.core.util;
2 |
3 |
4 | import org.taskflow.core.wrapper.OperatorWrapper;
5 |
6 | import java.util.Set;
7 |
8 | /**
9 | * 类型转换工具
10 | * Created by ytyht226 on 2023/3/2.
11 | */
12 | public class ConvertUtil {
13 |
14 | @SuppressWarnings("rawtypes")
15 | public static OperatorWrapper[] set2Array(Set> wrapperSet) {
16 | if (wrapperSet == null || wrapperSet.size() == 0) {
17 | return new OperatorWrapper[0];
18 | }
19 | return wrapperSet.toArray(new OperatorWrapper[0]);
20 | }
21 |
22 | }
--------------------------------------------------------------------------------
/taskflow-core/src/main/java/org/taskflow/core/wrapper/OperatorWrapperGroup.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.core.wrapper;
2 |
3 | import com.google.common.collect.Sets;
4 | import org.apache.commons.lang3.StringUtils;
5 | import org.taskflow.common.constant.DagConstant;
6 | import org.taskflow.core.DagEngine;
7 | import org.taskflow.core.operator.IOperator;
8 |
9 | import java.util.HashMap;
10 | import java.util.HashSet;
11 | import java.util.Set;
12 |
13 | /**
14 | * OP节点组,将多个节点抽象成一个组,可以简化对节点依赖的管理,尤其是DAG中节点比较多时
15 | * 根据依赖关系划分成多个组,每个组内的节点可以单独管理,比如系统中涉及多个模块,每个模块又有多个OP节点
16 | * Created by ytyht226 on 2022/4/6.
17 | */
18 | @SuppressWarnings("all")
19 | public class OperatorWrapperGroup extends OperatorWrapper{
20 | /**
21 | * 节点组开始节点OP
22 | */
23 | private static final GroupBeginOperator groupBeginOperator = new GroupBeginOperator();
24 | /**
25 | * 节点组结束节点OP
26 | */
27 | private static final GroupEndOperator groupEndOperator = new GroupEndOperator();
28 | /**
29 | * DAG执行引擎
30 | */
31 | private DagEngine engine;
32 | /**
33 | * 分组的开始节点,相当于原始开始节点的代理,只进行参数传递
34 | */
35 | private OperatorWrapper groupBegin;
36 | /**
37 | * 分组的结束节点,相当于原始结束节点的代理,只进行参数传递
38 | */
39 | private OperatorWrapper groupEnd;
40 | /**
41 | * 分组的开始节点id
42 | */
43 | private String groupBeginId;
44 | /**
45 | * 分组的结束节点id
46 | */
47 | private String groupEndId;
48 | /**
49 | * 原始的开始节点
50 | */
51 | private String[] beginWrapperIds;
52 | /**
53 | * 原始的结束节点
54 | */
55 | private String[] endWrapperIds;
56 | /**
57 | * 节点组包含的子节点(组)
58 | */
59 | private Set childrenIds;
60 |
61 | public OperatorWrapperGroup() {
62 |
63 | }
64 |
65 | public OperatorWrapperGroup(DagEngine engine) {
66 | this.engine = engine;
67 | }
68 |
69 | /**
70 | * 初始化,根据原始开始/结束节点,生成对应的节点组的开始/结束节点,只初始化一次
71 | */
72 | public OperatorWrapperGroup init() {
73 | if (this.isInit()) {
74 | return this;
75 | }
76 | this.setInit(true);
77 | groupBeginId = beginWrapperIds == null ? buildGroupBeginEndId(true, String.valueOf(this.hashCode())) : groupBeginId;
78 | groupEndId = endWrapperIds == null ? buildGroupBeginEndId(false, String.valueOf(this.hashCode())) : groupEndId;
79 | beginWrapperIds = beginWrapperIds == null ? new String[]{groupEndId} : beginWrapperIds;
80 | endWrapperIds = endWrapperIds == null ? new String[]{groupBeginId} : endWrapperIds;
81 |
82 | //根据原始开始节点,生成对应的节点组的开始节点
83 | OperatorWrapper groupBegin = new OperatorWrapper(groupBeginId, groupBeginOperator);
84 | groupBegin.id(groupBeginId)
85 | .engine(engine)
86 | .group(this)
87 | .next(beginWrapperIds);
88 | engine.getWrapperMap().put(groupBeginId, groupBegin);
89 | this.groupBegin = groupBegin;
90 |
91 | //根据原始结束节点,生成对应的节点组的结束节点
92 | OperatorWrapper groupEnd = new OperatorWrapper(groupEndId, groupEndOperator);
93 | groupEnd.id(groupEndId)
94 | .engine(engine)
95 | .group(this)
96 | .addParamFromWrapperId(endWrapperIds);
97 | engine.getWrapperMap().put(groupEndId, groupEnd);
98 | this.groupEnd = groupEnd;
99 |
100 | //设置节点组开始节点
101 | buildGroupBegin(beginWrapperIds);
102 | //设置节点组结束节点
103 | buildGroupEnd(endWrapperIds);
104 | //将节点组保存到引擎
105 | String groupId = StringUtils.isNotBlank(this.getId()) ? this.getId() : groupBeginId;
106 | groupId = buildGroupId(groupId);
107 | this.setId(groupId);
108 | if (engine.getWrapperGroupMap() == null) {
109 | engine.setWrapperGroupMap(new HashMap<>());
110 | }
111 | engine.getWrapperGroupMap().put(groupId, this);
112 | return this;
113 | }
114 |
115 | public OperatorWrapper context(Object context) {
116 | groupBegin.context(context);
117 | return this;
118 | }
119 | /**
120 | * 节点组也是一种特殊的节点,可以添加依赖的参数来源
121 | */
122 | public OperatorWrapper addParamFromWrapperId(String ... fromWrapperIds) {
123 | groupBegin.addParamFromWrapperId(fromWrapperIds);
124 | return this;
125 | }
126 |
127 | /**
128 | * 设置节点组开始节点
129 | */
130 | private OperatorWrapperGroup buildGroupBegin(String ... nextWrapperIds) {
131 |
132 | for (String wrapperId : nextWrapperIds) {
133 | OperatorWrapper, ?> wrapper = engine.getWrapperMap().get(wrapperId);
134 | if (wrapper.getParamFromList() == null && wrapper.getContext() == null) {
135 | try {
136 | wrapper.getOperator().getClass().getDeclaredMethod("execute", Void.class);
137 | } catch (NoSuchMethodException e) {
138 | //execute接口有入参,且节点没有指定参数来源时,设置参数来源是节点组的开始节点
139 | wrapper.addParamFromWrapperId(groupBeginId);
140 | }
141 | }
142 | }
143 | return this;
144 | }
145 |
146 | /**
147 | * 设置节点组结束节点
148 | */
149 | private OperatorWrapperGroup buildGroupEnd(String ... dependWrapperIds) {
150 |
151 | for (String wrapperId : dependWrapperIds) {
152 | engine.getWrapperMap().get(wrapperId).next(groupEnd.getId());
153 | }
154 | return this;
155 | }
156 |
157 | /**
158 | * 添加节点组结束节点的后续节点
159 | */
160 | public OperatorWrapper next(String ... wrapperIds) {
161 | this.init();
162 | engine.getWrapperMap().get(groupEndId).next(wrapperIds);
163 | return super.next(wrapperIds);
164 | }
165 |
166 | public OperatorWrapperGroup id(String id) {
167 | this.setId(id);
168 | return this;
169 | }
170 |
171 | public OperatorWrapperGroup beginWrapperIds(String ... wrapperIds) {
172 | this.beginWrapperIds = wrapperIds;
173 | this.groupBeginId = buildGroupBeginEndId(true, beginWrapperIds);
174 | return this;
175 | }
176 |
177 | public OperatorWrapperGroup endWrapperIds(String ... wrapperIds) {
178 | this.endWrapperIds = wrapperIds;
179 | this.groupEndId = buildGroupBeginEndId(false, endWrapperIds);
180 | return this;
181 | }
182 |
183 | public OperatorWrapperGroup children(String ... wrapperIds) {
184 | if (wrapperIds == null) {
185 | return this;
186 | }
187 | if (childrenIds == null) {
188 | childrenIds = new HashSet<>();
189 | }
190 | childrenIds.addAll(Sets.newHashSet(wrapperIds));
191 | return this;
192 | }
193 |
194 | /**
195 | * 构造开始/结束节点的id
196 | */
197 | private String buildGroupBeginEndId(boolean isBegin, String ... ids) {
198 | if (ids == null) {
199 | return null;
200 | }
201 | String prefix = isBegin ? DagConstant.BEGIN_OP_IN_GROUP_PREFIX : DagConstant.END_OP_IN_GROUP_PREFIX;
202 | StringBuilder builder = new StringBuilder(prefix);
203 | for (String id : ids) {
204 | builder.append("_").append(id);
205 | }
206 | return builder.toString();
207 | }
208 |
209 | /**
210 | * 根据节点组开始节点id构造节点组id
211 | */
212 | private String buildGroupId(String groupBeginId) {
213 | return DagConstant.OP_GROUP_PREFIX + groupBeginId;
214 | }
215 |
216 | /**
217 | * 节点组的开始节点OP
218 | */
219 | public static class GroupBeginOperator implements IOperator {
220 |
221 | @Override
222 | public Object execute(Object param) throws Exception {
223 | return param;
224 | }
225 | }
226 |
227 | /**
228 | * 节点组的结束节点OP
229 | */
230 | public static class GroupEndOperator implements IOperator {
231 |
232 | @Override
233 | public Object execute(Object param) throws Exception {
234 | return param;
235 | }
236 | }
237 |
238 | public String getGroupBeginId() {
239 | return groupBeginId;
240 | }
241 |
242 | public String getGroupEndId() {
243 | return groupEndId;
244 | }
245 |
246 | public String[] getBeginWrapperIds() {
247 | return beginWrapperIds;
248 | }
249 |
250 | public void setBeginWrapperIds(String[] beginWrapperIds) {
251 | this.beginWrapperIds = beginWrapperIds;
252 | }
253 |
254 | public String[] getEndWrapperIds() {
255 | return endWrapperIds;
256 | }
257 |
258 | public void setEndWrapperIds(String[] endWrapperIds) {
259 | this.endWrapperIds = endWrapperIds;
260 | }
261 |
262 | public OperatorWrapper getGroupBegin() {
263 | return groupBegin;
264 | }
265 |
266 | public Set getChildrenIds() {
267 | return childrenIds;
268 | }
269 |
270 | public OperatorWrapper getGroupEnd() {
271 | return groupEnd;
272 | }
273 | }
--------------------------------------------------------------------------------
/taskflow-example/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | org.taskflow
8 | taskflow-example
9 | 1.0.0-SNAPSHOT
10 |
11 |
12 | 1.8
13 | UTF-8
14 | UTF-8
15 |
16 |
17 |
18 |
19 | org.taskflow
20 | taskflow-core
21 | 1.0.0-SNAPSHOT
22 |
23 |
24 |
25 | com.google.guava
26 | guava
27 | 23.0
28 |
29 |
30 |
31 | junit
32 | junit
33 | 4.12
34 | provided
35 |
36 |
37 |
38 |
39 | src/main/java
40 | src/test/java
41 |
42 |
43 | src/main/resources
44 | true
45 |
46 |
47 |
48 |
49 | src/test/resources
50 | true
51 |
52 |
53 | package
54 |
55 |
56 |
57 |
58 | org.apache.maven.plugins
59 | maven-compiler-plugin
60 | 2.3.2
61 |
62 | ${jdk.version}
63 | ${jdk.version}
64 | ${project.build.sourceEncoding}
65 |
66 |
67 |
68 |
69 | org.apache.maven.plugins
70 | maven-source-plugin
71 | 3.1.0
72 |
73 |
74 | attach-sources
75 |
76 | jar
77 |
78 |
79 |
80 |
81 |
82 | org.apache.maven.plugins
83 | maven-surefire-plugin
84 | 2.18.1
85 |
86 | true
87 |
88 |
89 |
90 |
91 |
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/callback/CallbackTest.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.callback;
2 |
3 | import org.taskflow.core.DagEngine;
4 | import org.taskflow.core.thread.pool.CustomThreadPool;
5 | import org.taskflow.core.wrapper.OperatorWrapper;
6 | import org.junit.Test;
7 |
8 | import java.util.concurrent.ExecutorService;
9 |
10 | /**
11 | * 回调接口:引擎回调、OP回调
12 | * Created by ytyht226 on 2022/6/23.
13 | */
14 | public class CallbackTest {
15 | ExecutorService executor = CustomThreadPool.newFixedThreadPoolWrapper(5);
16 | Operator1 operator1 = new Operator1();
17 | Operator2 operator2 = new Operator2();
18 |
19 | @Test
20 | public void test() {
21 | DagEngine engine = new DagEngine(executor);
22 | //引擎回调
23 | engine.before(() -> {
24 | System.out.println("engine start...");
25 | });
26 | engine.after(() -> {
27 | System.out.println("engine end...");
28 | });
29 | //每个OP的回调
30 | engine.beforeOp((w) -> {
31 | System.out.println("OP: " + w.getId() + " start...");
32 | });
33 | engine.afterOp((w) -> {
34 | System.out.println("OP: " + w.getId() + " end...");
35 | });
36 | OperatorWrapper wrapper1 = new OperatorWrapper()
37 | .id("1")
38 | .engine(engine)
39 | .operator(operator1)
40 | .next("2")
41 | ;
42 |
43 | OperatorWrapper wrapper2 = new OperatorWrapper()
44 | .id("2")
45 | .engine(engine)
46 | .operator(operator2)
47 | ;
48 |
49 | engine.runAndWait(9000);
50 | if (engine.getEx() != null) {
51 | engine.getEx().printStackTrace();
52 | }
53 | }
54 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/callback/Operator1.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.callback;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | import java.util.concurrent.TimeUnit;
7 |
8 | /**
9 | * Created by ytyht226 on 2022/6/23.
10 | */
11 | public class Operator1 implements IOperator {
12 |
13 | @Override
14 | public Integer execute(Void param) throws Exception {
15 | System.out.println("1...");
16 | TimeUnit.SECONDS.sleep(1);
17 | return 1;
18 | }
19 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/callback/Operator2.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.callback;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | import java.util.concurrent.TimeUnit;
7 |
8 | /**
9 | * Created by ytyht226 on 2022/6/23.
10 | */
11 | public class Operator2 implements IOperator {
12 |
13 | @Override
14 | public Integer execute(Void param) throws Exception {
15 | System.out.println("2...");
16 | TimeUnit.SECONDS.sleep(1);
17 | return 1;
18 | }
19 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/branch/ChooseBranchTest.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.branch;
2 |
3 | import com.google.common.collect.Sets;
4 | import org.taskflow.core.DagEngine;
5 | import org.taskflow.core.thread.pool.CustomThreadPool;
6 | import org.taskflow.core.wrapper.OperatorWrapper;
7 | import org.junit.Test;
8 |
9 | import java.util.concurrent.ExecutorService;
10 |
11 | /**
12 | * 分支选择
13 | * Created by ytyht226 on 2022/6/23.
14 | */
15 | @SuppressWarnings("all")
16 | public class ChooseBranchTest {
17 | ExecutorService executor = CustomThreadPool.newFixedThreadPoolWrapper(5);
18 | Operator1 operator1 = new Operator1();
19 | Operator2 operator2 = new Operator2();
20 | Operator3 operator3 = new Operator3();
21 | Operator4 operator4 = new Operator4();
22 | Operator5 operator5 = new Operator5();
23 | Operator6 operator6 = new Operator6();
24 |
25 | @Test
26 | public void test() {
27 | DagEngine engine = new DagEngine(executor);
28 | OperatorWrapper wrapper1 = new OperatorWrapper()
29 | .id("1")
30 | .engine(engine)
31 | .operator(operator1)
32 | .chooseBranch((w) -> {
33 | return Sets.newHashSet("2");
34 | })
35 | ;
36 | OperatorWrapper wrapper2 = new OperatorWrapper()
37 | .id("2")
38 | .engine(engine)
39 | .operator(operator2)
40 | .depend("1")
41 | ;
42 | OperatorWrapper wrapper3 = new OperatorWrapper()
43 | .id("3")
44 | .engine(engine)
45 | .operator(operator3)
46 | .depend("1")
47 | ;
48 | OperatorWrapper wrapper4 = new OperatorWrapper()
49 | .id("4")
50 | .engine(engine)
51 | .operator(operator4)
52 | .depend("1")
53 | ;
54 | OperatorWrapper wrapper5 = new OperatorWrapper()
55 | .id("5")
56 | .engine(engine)
57 | .operator(operator5)
58 | .depend("2")
59 | ;
60 | OperatorWrapper wrapper6 = new OperatorWrapper()
61 | .id("6")
62 | .engine(engine)
63 | .operator(operator6)
64 | .depend("2")
65 | ;
66 |
67 | engine.runAndWait(300_000);
68 | if (engine.getEx() != null) {
69 | engine.getEx().printStackTrace();
70 | }
71 | }
72 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/branch/Operator1.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.branch;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator1 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("1...");
14 | return 3;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/branch/Operator2.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.branch;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator2 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("2...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/branch/Operator3.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.branch;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator3 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("3...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/branch/Operator4.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.branch;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator4 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("4...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/branch/Operator5.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.branch;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator5 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("5...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/branch/Operator6.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.branch;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator6 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("6...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/group_group/ChooseOpTest.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.group_group;
2 |
3 | import com.google.common.collect.Sets;
4 | import org.taskflow.core.DagEngine;
5 | import org.taskflow.core.thread.pool.CustomThreadPool;
6 | import org.taskflow.core.wrapper.OperatorWrapper;
7 | import org.taskflow.core.wrapper.OperatorWrapperGroup;
8 | import org.junit.Test;
9 |
10 | import java.util.concurrent.ExecutorService;
11 |
12 | /**
13 | * 节点选择
14 | * 待选择的都是节点组
15 | * Created by ytyht226 on 2022/6/23.
16 | */
17 | @SuppressWarnings("all")
18 | public class ChooseOpTest {
19 | ExecutorService executor = CustomThreadPool.newFixedThreadPoolWrapper(5);
20 | Operator1 operator1 = new Operator1();
21 | Operator2 operator2 = new Operator2();
22 | Operator3 operator3 = new Operator3();
23 | Operator4 operator4 = new Operator4();
24 | Operator5 operator5 = new Operator5();
25 | Operator6 operator6 = new Operator6();
26 |
27 | @Test
28 | public void test() {
29 | DagEngine engine = new DagEngine(executor);
30 |
31 | //节点2、4是一个节点组
32 | OperatorWrapperGroup group1 = buildGroup1(engine);
33 | //节点3、5是一个节点组
34 | OperatorWrapperGroup group2 = buildGroup2(engine);
35 |
36 | OperatorWrapper wrapper1 = new OperatorWrapper()
37 | .id("1")
38 | .engine(engine)
39 | .operator(operator1)
40 | .next(group1.getGroupBeginId())
41 | .next(group2.getGroupBeginId())
42 | .chooseOp(wrapper -> {
43 | //节点组1、2都执行
44 | return Sets.newHashSet(group1.getGroupBeginId(), group2.getGroupBeginId());
45 | })
46 | ;
47 |
48 | group1.next("6");
49 | group2.next("6");
50 |
51 | OperatorWrapper wrapper6 = new OperatorWrapper()
52 | .id("6")
53 | .engine(engine)
54 | .operator(operator6)
55 | ;
56 |
57 | engine.runAndWait(300_000);
58 | if (engine.getEx() != null) {
59 | engine.getEx().printStackTrace();
60 | }
61 | }
62 |
63 | private OperatorWrapperGroup buildGroup1(DagEngine engine) {
64 | OperatorWrapper wrapper2 = new OperatorWrapper()
65 | .id("2")
66 | .engine(engine)
67 | .operator(operator2)
68 | .next("4")
69 | ;
70 | OperatorWrapper wrapper3 = new OperatorWrapper()
71 | .id("4")
72 | .engine(engine)
73 | .operator(operator4)
74 | ;
75 |
76 | return new OperatorWrapperGroup(engine)
77 | .beginWrapperIds("2")
78 | .endWrapperIds("4")
79 | .children("2", "4")
80 | .init()
81 | ;
82 | }
83 |
84 | private OperatorWrapperGroup buildGroup2(DagEngine engine) {
85 | OperatorWrapper wrapper3 = new OperatorWrapper()
86 | .id("3")
87 | .engine(engine)
88 | .operator(operator3)
89 | .next("5")
90 | ;
91 | OperatorWrapper wrapper5 = new OperatorWrapper()
92 | .id("5")
93 | .engine(engine)
94 | .operator(operator5)
95 | ;
96 |
97 | return new OperatorWrapperGroup(engine)
98 | .beginWrapperIds("3")
99 | .endWrapperIds("5")
100 | .children("3", "5")
101 | .init()
102 | ;
103 | }
104 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/group_group/Operator1.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.group_group;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator1 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("1...");
14 | return 3;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/group_group/Operator2.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.group_group;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator2 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("2...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/group_group/Operator3.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.group_group;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator3 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("3...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/group_group/Operator4.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.group_group;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator4 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("4...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/group_group/Operator5.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.group_group;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator5 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("5...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/group_group/Operator6.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.group_group;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator6 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("6...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/group_op/ChooseOpTest.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.group_op;
2 |
3 | import com.google.common.collect.Sets;
4 | import org.taskflow.core.DagEngine;
5 | import org.taskflow.core.thread.pool.CustomThreadPool;
6 | import org.taskflow.core.wrapper.OperatorWrapper;
7 | import org.taskflow.core.wrapper.OperatorWrapperGroup;
8 | import org.junit.Test;
9 |
10 | import java.util.concurrent.ExecutorService;
11 |
12 | /**
13 | * 节点选择
14 | * 待选择的是节点、节点组
15 | * Created by ytyht226 on 2022/6/23.
16 | */
17 | @SuppressWarnings("all")
18 | public class ChooseOpTest {
19 | ExecutorService executor = CustomThreadPool.newFixedThreadPoolWrapper(5);
20 | Operator1 operator1 = new Operator1();
21 | Operator2 operator2 = new Operator2();
22 | Operator3 operator3 = new Operator3();
23 | Operator4 operator4 = new Operator4();
24 | Operator5 operator5 = new Operator5();
25 |
26 | @Test
27 | public void test() {
28 | DagEngine engine = new DagEngine(executor);
29 |
30 | //节点2、4是一个节点组
31 | OperatorWrapperGroup group1 = buildGroup1(engine);
32 |
33 | OperatorWrapper wrapper1 = new OperatorWrapper()
34 | .id("1")
35 | .engine(engine)
36 | .operator(operator1)
37 | .next(group1.getGroupBeginId())
38 | .next("3")
39 | .chooseOp(wrapper -> {
40 | //执行节点组1
41 | return Sets.newHashSet(group1.getGroupBeginId());
42 | })
43 | ;
44 |
45 | group1.next("5");
46 |
47 | OperatorWrapper wrapper3 = new OperatorWrapper()
48 | .id("3")
49 | .engine(engine)
50 | .operator(operator3)
51 | .next("5")
52 | ;
53 | OperatorWrapper wrapper4 = new OperatorWrapper()
54 | .id("5")
55 | .engine(engine)
56 | .operator(operator5)
57 | ;
58 |
59 | engine.runAndWait(300_000);
60 | if (engine.getEx() != null) {
61 | engine.getEx().printStackTrace();
62 | }
63 | }
64 |
65 | private OperatorWrapperGroup buildGroup1(DagEngine engine) {
66 | OperatorWrapper wrapper2 = new OperatorWrapper()
67 | .id("2")
68 | .engine(engine)
69 | .operator(operator2)
70 | .next("4")
71 | ;
72 | OperatorWrapper wrapper3 = new OperatorWrapper()
73 | .id("4")
74 | .engine(engine)
75 | .operator(operator4)
76 | ;
77 |
78 | return new OperatorWrapperGroup(engine)
79 | .beginWrapperIds("2")
80 | .endWrapperIds("4")
81 | .children("2", "4")
82 | .init()
83 | ;
84 | }
85 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/group_op/Operator1.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.group_op;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator1 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("1...");
14 | return 3;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/group_op/Operator2.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.group_op;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator2 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("2...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/group_op/Operator3.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.group_op;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator3 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("3...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/group_op/Operator4.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.group_op;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator4 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("4...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/group_op/Operator5.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.group_op;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator5 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("5...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/nest_group/ChooseOpTest.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.nest_group;
2 |
3 | import com.google.common.collect.Sets;
4 | import org.taskflow.core.DagEngine;
5 | import org.taskflow.core.thread.pool.CustomThreadPool;
6 | import org.taskflow.core.wrapper.OperatorWrapper;
7 | import org.taskflow.core.wrapper.OperatorWrapperGroup;
8 | import org.junit.Test;
9 |
10 | import java.util.concurrent.ExecutorService;
11 |
12 | /**
13 | * 节点选择
14 | * 待选择的都是节点组
15 | * Created by ytyht226 on 2022/6/23.
16 | */
17 | @SuppressWarnings("all")
18 | public class ChooseOpTest {
19 | ExecutorService executor = CustomThreadPool.newFixedThreadPoolWrapper(5);
20 | Operator1 operator1 = new Operator1();
21 | Operator2 operator2 = new Operator2();
22 | Operator3 operator3 = new Operator3();
23 | Operator4 operator4 = new Operator4();
24 | Operator5 operator5 = new Operator5();
25 | Operator6 operator6 = new Operator6();
26 | Operator7 operator7 = new Operator7();
27 | Operator8 operator8 = new Operator8();
28 | Operator9 operator9 = new Operator9();
29 |
30 | @Test
31 | public void test() {
32 | DagEngine engine = new DagEngine(executor);
33 |
34 | //节点2、4是一个节点组
35 | OperatorWrapperGroup group1 = buildGroup1(engine);
36 | //节点3、5是一个节点组
37 | OperatorWrapperGroup group2 = buildGroup2(engine);
38 | //节点1、节点组group1、group2是一个节点组
39 | OperatorWrapperGroup group3 = buildGroup3(engine, group1, group2);
40 |
41 | OperatorWrapper wrapper7 = new OperatorWrapper()
42 | .id("7")
43 | .engine(engine)
44 | .operator(operator7)
45 | .next(group3.getGroupBeginId())
46 | .next("8")
47 | .chooseOp(wrapper -> {
48 |
49 | return Sets.newHashSet(group3.getGroupBeginId());
50 | // return Sets.newHashSet("8");
51 | })
52 | ;
53 |
54 | group3.next("9");
55 |
56 | OperatorWrapper wrapper8 = new OperatorWrapper()
57 | .id("8")
58 | .engine(engine)
59 | .operator(operator8)
60 | .next("9")
61 | ;
62 |
63 | OperatorWrapper wrapper9 = new OperatorWrapper()
64 | .id("9")
65 | .engine(engine)
66 | .operator(operator9)
67 | ;
68 |
69 | engine.runAndWait(300_000);
70 | if (engine.getEx() != null) {
71 | engine.getEx().printStackTrace();
72 | }
73 | }
74 |
75 | private OperatorWrapperGroup buildGroup1(DagEngine engine) {
76 | OperatorWrapper wrapper2 = new OperatorWrapper()
77 | .id("2")
78 | .engine(engine)
79 | .operator(operator2)
80 | .next("4")
81 | ;
82 | OperatorWrapper wrapper3 = new OperatorWrapper()
83 | .id("4")
84 | .engine(engine)
85 | .operator(operator4)
86 | ;
87 |
88 | return new OperatorWrapperGroup(engine)
89 | .beginWrapperIds("2")
90 | .endWrapperIds("4")
91 | .children("2", "4")
92 | .init()
93 | ;
94 | }
95 |
96 | private OperatorWrapperGroup buildGroup2(DagEngine engine) {
97 | OperatorWrapper wrapper3 = new OperatorWrapper()
98 | .id("3")
99 | .engine(engine)
100 | .operator(operator3)
101 | .next("5")
102 | ;
103 | OperatorWrapper wrapper5 = new OperatorWrapper()
104 | .id("5")
105 | .engine(engine)
106 | .operator(operator5)
107 | ;
108 |
109 | return new OperatorWrapperGroup(engine)
110 | .beginWrapperIds("3")
111 | .endWrapperIds("5")
112 | .children("3", "5")
113 | .init()
114 | ;
115 | }
116 |
117 | private OperatorWrapperGroup buildGroup3(DagEngine engine, OperatorWrapperGroup group1, OperatorWrapperGroup group2) {
118 | OperatorWrapper wrapper1 = new OperatorWrapper()
119 | .id("1")
120 | .engine(engine)
121 | .operator(operator1)
122 | .chooseOp(wrapper -> {
123 |
124 | return Sets.newHashSet(group1.getGroupBeginId());
125 | // return Sets.newHashSet(group2.getGroupBeginId());
126 | })
127 | .next(group1.getGroupBeginId(), group2.getGroupBeginId())
128 | ;
129 |
130 | group1.next("6");
131 | group2.next("6");
132 |
133 | OperatorWrapper wrapper6 = new OperatorWrapper()
134 | .id("6")
135 | .engine(engine)
136 | .operator(operator6)
137 | ;
138 |
139 | return new OperatorWrapperGroup(engine)
140 | .beginWrapperIds("1")
141 | .endWrapperIds("6")
142 | .init()
143 | ;
144 | }
145 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/nest_group/Operator1.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.nest_group;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator1 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("1...");
14 | return 3;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/nest_group/Operator2.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.nest_group;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator2 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("2...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/nest_group/Operator3.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.nest_group;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator3 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("3...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/nest_group/Operator4.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.nest_group;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | import java.util.concurrent.TimeUnit;
7 |
8 | /**
9 | * Created by ytyht226 on 2022/6/23.
10 | */
11 | public class Operator4 implements IOperator {
12 | @Override
13 | public Integer execute(Integer param) throws Exception {
14 | //业务逻辑部分
15 | TimeUnit.MILLISECONDS.sleep(1000);
16 | System.out.println("4...");
17 | return null;
18 | }
19 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/nest_group/Operator5.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.nest_group;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | import java.util.concurrent.TimeUnit;
7 |
8 | /**
9 | * Created by ytyht226 on 2022/6/23.
10 | */
11 | public class Operator5 implements IOperator {
12 | @Override
13 | public Integer execute(Integer param) throws Exception {
14 | //业务逻辑部分
15 | TimeUnit.MILLISECONDS.sleep(1000);
16 | System.out.println("5...");
17 | return null;
18 | }
19 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/nest_group/Operator6.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.nest_group;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | import java.util.concurrent.TimeUnit;
7 |
8 | /**
9 | * Created by ytyht226 on 2022/6/23.
10 | */
11 | public class Operator6 implements IOperator {
12 | @Override
13 | public Integer execute(Integer param) throws Exception {
14 | //业务逻辑部分
15 | TimeUnit.MILLISECONDS.sleep(1000);
16 | System.out.println("6...");
17 | return null;
18 | }
19 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/nest_group/Operator7.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.nest_group;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator7 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("7...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/nest_group/Operator8.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.nest_group;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator8 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("8...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/nest_group/Operator9.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.nest_group;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator9 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("9...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/op_op/ChooseOpTest.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.op_op;
2 |
3 | import com.google.common.collect.Sets;
4 | import org.taskflow.core.DagEngine;
5 | import org.taskflow.core.thread.pool.CustomThreadPool;
6 | import org.taskflow.core.wrapper.OperatorWrapper;
7 | import org.junit.Test;
8 |
9 | import java.util.concurrent.ExecutorService;
10 |
11 | /**
12 | * 节点选择
13 | * 待选择的都是节点
14 | * Created by ytyht226 on 2022/6/23.
15 | */
16 | @SuppressWarnings("all")
17 | public class ChooseOpTest {
18 | ExecutorService executor = CustomThreadPool.newFixedThreadPoolWrapper(5);
19 | Operator1 operator1 = new Operator1();
20 | Operator2 operator2 = new Operator2();
21 | Operator3 operator3 = new Operator3();
22 | Operator4 operator4 = new Operator4();
23 |
24 | @Test
25 | public void test() {
26 | DagEngine engine = new DagEngine(executor);
27 | OperatorWrapper wrapper1 = new OperatorWrapper()
28 | .id("1")
29 | .engine(engine)
30 | .operator(operator1)
31 | .next("2", "3")
32 | .chooseOp((w) -> {
33 | return Sets.newHashSet("3");
34 | });
35 | OperatorWrapper wrapper2 = new OperatorWrapper()
36 | .id("2")
37 | .engine(engine)
38 | .operator(operator2)
39 | .next("4")
40 | ;
41 | OperatorWrapper wrapper3 = new OperatorWrapper()
42 | .id("3")
43 | .engine(engine)
44 | .operator(operator3)
45 | .next("4")
46 | ;
47 | OperatorWrapper wrapper4 = new OperatorWrapper()
48 | .id("4")
49 | .engine(engine)
50 | .operator(operator4)
51 | ;
52 |
53 | engine.runAndWait(300_000);
54 | if (engine.getEx() != null) {
55 | engine.getEx().printStackTrace();
56 | }
57 | }
58 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/op_op/Operator1.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.op_op;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator1 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("1...");
14 | return 3;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/op_op/Operator2.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.op_op;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator2 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("2...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/op_op/Operator3.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.op_op;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator3 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("3...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/choose/op/op_op/Operator4.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.choose.op.op_op;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator4 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("4...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/condition/ConditionTest.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.condition;
2 |
3 | import org.junit.Test;
4 | import org.taskflow.core.DagContextHolder;
5 | import org.taskflow.core.DagEngine;
6 | import org.taskflow.core.callback.ICondition;
7 | import org.taskflow.core.enums.ResultState;
8 | import org.taskflow.core.operator.OperatorResult;
9 | import org.taskflow.core.thread.pool.CustomThreadPool;
10 | import org.taskflow.core.wrapper.OperatorWrapper;
11 |
12 | import java.util.List;
13 | import java.util.concurrent.ExecutorService;
14 |
15 | /**
16 | * 准入条件判断
17 | * Created by ytyht226 on 2022/3/17.
18 | */
19 | @SuppressWarnings("all")
20 | public class ConditionTest {
21 | ExecutorService executor = CustomThreadPool.newFixedThreadPoolWrapper(5);
22 | Operator1 operator1 = new Operator1();
23 | Operator2 operator2 = new Operator2();
24 | Operator3 operator3 = new Operator3();
25 | Operator4 operator4 = new Operator4();
26 | Operator5 operator5 = new Operator5();
27 |
28 | @Test
29 | public void test100() {
30 | for (int i = 0; i < 100; i++) {
31 | test();
32 | }
33 | }
34 |
35 | @Test
36 | public void test() {
37 | DagEngine engine = new DagEngine(executor);
38 | int param = 1;
39 | OperatorWrapper wrapper1 = new OperatorWrapper()
40 | .id("1")
41 | .engine(engine)
42 | .operator(operator1)
43 | .context(param)
44 | ;
45 | OperatorWrapper wrapper2 = new OperatorWrapper()
46 | .id("2")
47 | .engine(engine)
48 | .operator(operator2)
49 | .addParamFromWrapperId("1")
50 | ;
51 | OperatorWrapper wrapper3 = new OperatorWrapper()
52 | .id("3")
53 | .engine(engine)
54 | .operator(operator3)
55 | .addParamFromWrapperId("1")
56 | ;
57 | OperatorWrapper wrapper4 = new OperatorWrapper()
58 | .id("4")
59 | .engine(engine)
60 | .operator(operator4)
61 | .addParamFromWrapperId("1")
62 | ;
63 | OperatorWrapper, Integer> wrapper5 = new OperatorWrapper, Integer>()
64 | .id("5")
65 | .engine(engine)
66 | .operator(operator5)
67 | .addParamFromWrapperId("2", "3", "4")
68 | .depend("2", false)
69 | .depend("3", false)
70 | .depend("4", false)
71 | .condition(new Wrapper5Condition())
72 | ;
73 |
74 | long begin = System.currentTimeMillis();
75 | engine.runAndWait(900_000);
76 | long end = System.currentTimeMillis();
77 | System.out.println("result: " + wrapper5.getOperatorResult().getResult() + ", cost: " + (end - begin));
78 | if (engine.getEx() != null) {
79 | engine.getEx().printStackTrace();
80 | }
81 | }
82 |
83 | /**
84 | * 节点5根据 2、3、4的执行情况判断是否执行该节点
85 | */
86 | private static class Wrapper5Condition implements ICondition {
87 |
88 | @Override
89 | public boolean judge(OperatorWrapper wrapper) {
90 | OperatorResult wrapper2Result = DagContextHolder.getOperatorResult("2");
91 | OperatorResult wrapper3Result = DagContextHolder.getOperatorResult("3");
92 | OperatorResult wrapper4Result = DagContextHolder.getOperatorResult("4");
93 | int result = 0;
94 | if (wrapper2Result != null && wrapper2Result.getResultState() == ResultState.SUCCESS) {
95 | result = result + wrapper2Result.getResult();
96 | }
97 | if (wrapper3Result != null && wrapper3Result.getResultState() == ResultState.SUCCESS) {
98 | result = result + wrapper3Result.getResult();
99 | }
100 | if (wrapper4Result != null && wrapper4Result.getResultState() == ResultState.SUCCESS) {
101 | result = result + wrapper4Result.getResult();
102 | }
103 | System.out.println("Current result: " + result);
104 | //如果result >= 5,则返回 true,可以直接执行节点5,因为节点2、4都是sleep(10),节点3 sleep(100)
105 | //result(2)+result(4)=6 > 5,执行完节点2、4后就可以执行节点5,此时节点3还在执行中会被中断,最终的
106 | //执行路径为 1 -> (2,4) -> 5
107 | return result >= 5;
108 | }
109 | }
110 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/condition/Operator1.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.condition;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | import java.util.concurrent.TimeUnit;
7 |
8 | /**
9 | * Created by ytyht226 on 2022/4/1.
10 | */
11 | public class Operator1 implements IOperator {
12 | @Override
13 | public Integer execute(Integer param) throws Exception {
14 | TimeUnit.MILLISECONDS.sleep(10);
15 | return param;
16 | }
17 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/condition/Operator2.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.condition;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | import java.util.concurrent.TimeUnit;
7 |
8 | /**
9 | * Created by ytyht226 on 2022/4/1.
10 | */
11 | public class Operator2 implements IOperator {
12 | @Override
13 | public Integer execute(Integer param) throws Exception {
14 | TimeUnit.MILLISECONDS.sleep(10);
15 | return param * 2;
16 | }
17 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/condition/Operator3.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.condition;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | import java.util.concurrent.TimeUnit;
7 |
8 | /**
9 | * Created by ytyht226 on 2022/4/1.
10 | */
11 | public class Operator3 implements IOperator {
12 | @Override
13 | public Integer execute(Integer param) throws Exception {
14 | TimeUnit.MILLISECONDS.sleep(10);
15 | return param * 3;
16 | }
17 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/condition/Operator4.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.condition;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | import java.util.concurrent.TimeUnit;
7 |
8 | /**
9 | * Created by ytyht226 on 2022/4/1.
10 | */
11 | public class Operator4 implements IOperator {
12 | @Override
13 | public Integer execute(Integer param) throws Exception {
14 | TimeUnit.MILLISECONDS.sleep(10);
15 | return param * 4;
16 | }
17 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/condition/Operator5.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.condition;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | import java.util.List;
7 | import java.util.concurrent.TimeUnit;
8 |
9 | /**
10 | * Created by ytyht226 on 2022/4/1.
11 | */
12 | public class Operator5 implements IOperator, Integer> {
13 | @Override
14 | public Integer execute(List param) throws Exception {
15 | TimeUnit.MILLISECONDS.sleep(10);
16 | int sum = 0;
17 | for (Integer i : param) {
18 | if (i != null) {
19 | sum += i;
20 | }
21 | }
22 | return sum;
23 | }
24 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/context/ContextTest.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.context;
2 |
3 | import org.taskflow.core.DagEngine;
4 | import org.taskflow.core.thread.pool.CustomThreadPool;
5 | import org.taskflow.core.wrapper.OperatorWrapper;
6 | import org.junit.Test;
7 |
8 | import java.util.concurrent.ExecutorService;
9 |
10 | /**
11 | * 全局上下文
12 | * Created by ytyht226 on 2022/6/23.
13 | */
14 | public class ContextTest {
15 | ExecutorService executor = CustomThreadPool.newFixedThreadPoolWrapper(5);
16 | Operator1 operator1 = new Operator1();
17 | Operator2 operator2 = new Operator2();
18 |
19 | @Test
20 | public void test() {
21 | DagEngine engine = new DagEngine(executor);
22 | OperatorWrapper wrapper1 = new OperatorWrapper()
23 | .id("1")
24 | .engine(engine)
25 | .operator(operator1)
26 | ;
27 | OperatorWrapper wrapper2 = new OperatorWrapper()
28 | .id("2")
29 | .engine(engine)
30 | .operator(operator2)
31 | .depend("1")
32 | ;
33 | engine.runAndWait(9000);
34 | if (engine.getEx() != null) {
35 | engine.getEx().printStackTrace();
36 | }
37 | }
38 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/context/Operator1.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.context;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | import java.util.concurrent.TimeUnit;
7 |
8 | /**
9 | * Created by ytyht226 on 2022/6/23.
10 | */
11 | public class Operator1 implements IOperator {
12 |
13 | @Override
14 | public Integer execute(Void param) throws Exception {
15 | System.out.println("1...");
16 | TimeUnit.SECONDS.sleep(1);
17 | return 1;
18 | }
19 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/context/Operator2.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.context;
2 |
3 |
4 | import org.taskflow.core.DagContextHolder;
5 | import org.taskflow.core.operator.IOperator;
6 |
7 | /**
8 | * Created by ytyht226 on 2022/6/23.
9 | */
10 | public class Operator2 implements IOperator {
11 | @Override
12 | public Integer execute(Void param) throws Exception {
13 | //业务逻辑部分
14 | System.out.println(DagContextHolder.getOperatorResult("1"));
15 | System.out.println("2...");
16 | return 2;
17 | }
18 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/dependencytype/DependencyTypeTest.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.dependencytype;
2 |
3 | import org.taskflow.core.DagEngine;
4 | import org.taskflow.core.thread.pool.CustomThreadPool;
5 | import org.taskflow.core.wrapper.OperatorWrapper;
6 | import org.junit.Test;
7 |
8 | import java.util.concurrent.ExecutorService;
9 |
10 | /**
11 | * 节点依赖类型 强依赖、弱依赖
12 | * Created by ytyht226 on 2022/6/23.
13 | */
14 | @SuppressWarnings("all")
15 | public class DependencyTypeTest {
16 | ExecutorService executor = CustomThreadPool.newFixedThreadPoolWrapper(5);
17 | Operator1 operator1 = new Operator1();
18 | Operator2 operator2 = new Operator2();
19 | Operator3 operator3 = new Operator3();
20 | Operator4 operator4 = new Operator4();
21 |
22 | /**
23 | * 强依赖
24 | */
25 | @Test
26 | public void strongTypeTest() {
27 | DagEngine engine = new DagEngine(executor);
28 | OperatorWrapper wrapper1 = new OperatorWrapper()
29 | .id("1")
30 | .engine(engine)
31 | .operator(operator1)
32 | .next("2", "3")
33 | ;
34 | OperatorWrapper wrapper2 = new OperatorWrapper()
35 | .id("2")
36 | .engine(engine)
37 | .operator(operator2)
38 | .next("4")
39 | ;
40 | OperatorWrapper wrapper3 = new OperatorWrapper()
41 | .id("3")
42 | .engine(engine)
43 | .operator(operator3)
44 | .next("4")
45 | ;
46 |
47 | OperatorWrapper wrapper4 = new OperatorWrapper()
48 | .id("4")
49 | .engine(engine)
50 | .operator(operator4)
51 | ;
52 |
53 | engine.runAndWait(3000);
54 | if (engine.getEx() != null) {
55 | engine.getEx().printStackTrace();
56 | }
57 | }
58 |
59 | /**
60 | * 弱依赖
61 | * 节点4弱依赖2、3,只要2、3 中有任意一个执行完,就可以执行节点4
62 | */
63 | @Test
64 | public void weakTypeTest() {
65 | DagEngine engine = new DagEngine(executor);
66 | OperatorWrapper wrapper1 = new OperatorWrapper()
67 | .id("1")
68 | .engine(engine)
69 | .operator(operator1)
70 | .next("2", "3")
71 | ;
72 | OperatorWrapper wrapper2 = new OperatorWrapper()
73 | .id("2")
74 | .engine(engine)
75 | .operator(operator2)
76 | .next("4", false)
77 | ;
78 | OperatorWrapper wrapper3 = new OperatorWrapper()
79 | .id("3")
80 | .engine(engine)
81 | .operator(operator3)
82 | .next("4", false)
83 | ;
84 |
85 | OperatorWrapper wrapper4 = new OperatorWrapper()
86 | .id("4")
87 | .engine(engine)
88 | .operator(operator4)
89 | ;
90 |
91 | engine.runAndWait(3000);
92 |
93 | if (engine.getEx() != null) {
94 | engine.getEx().printStackTrace();
95 | }
96 | }
97 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/dependencytype/Operator1.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.dependencytype;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | import java.util.concurrent.TimeUnit;
7 |
8 | /**
9 | * Created by ytyht226 on 2022/6/23.
10 | */
11 | public class Operator1 implements IOperator {
12 | @Override
13 | public Integer execute(Integer param) throws Exception {
14 | //业务逻辑部分
15 | TimeUnit.MILLISECONDS.sleep(100);
16 | System.out.println("1...");
17 | return null;
18 | }
19 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/dependencytype/Operator2.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.dependencytype;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | import java.util.concurrent.TimeUnit;
7 |
8 | /**
9 | * Created by ytyht226 on 2022/6/23.
10 | */
11 | public class Operator2 implements IOperator {
12 | @Override
13 | public Integer execute(Integer param) throws Exception {
14 | //业务逻辑部分
15 | TimeUnit.MILLISECONDS.sleep(100);
16 | System.out.println("2...");
17 | return null;
18 | }
19 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/dependencytype/Operator3.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.dependencytype;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | import java.util.concurrent.TimeUnit;
7 |
8 | /**
9 | * Created by ytyht226 on 2022/6/23.
10 | */
11 | public class Operator3 implements IOperator {
12 | @Override
13 | public Integer execute(Integer param) throws Exception {
14 | //业务逻辑部分
15 | TimeUnit.MILLISECONDS.sleep(300);
16 | System.out.println("3...");
17 | return null;
18 | }
19 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/dependencytype/Operator4.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.dependencytype;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator4 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("4...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/endpoint/EndpointTest.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.endpoint;
2 |
3 | import org.taskflow.core.DagEngine;
4 | import org.taskflow.core.thread.pool.CustomThreadPool;
5 | import org.taskflow.core.wrapper.OperatorWrapper;
6 | import org.junit.Test;
7 |
8 | import java.util.concurrent.ExecutorService;
9 |
10 | /**
11 | * 自定义流程中断
12 | * Created by ytyht226 on 2022/6/23.
13 | */
14 | @SuppressWarnings("all")
15 | public class EndpointTest {
16 | ExecutorService executor = CustomThreadPool.newFixedThreadPoolWrapper(5);
17 | Operator1 operator1 = new Operator1();
18 | Operator2 operator2 = new Operator2();
19 | Operator3 operator3 = new Operator3();
20 | Operator4 operator4 = new Operator4();
21 |
22 | @Test
23 | public void test() throws InterruptedException {
24 | DagEngine engine = new DagEngine(executor);
25 | OperatorWrapper wrapper1 = new OperatorWrapper()
26 | .id("1")
27 | .engine(engine)
28 | .operator(operator1)
29 | .next("2")
30 | ;
31 | OperatorWrapper wrapper2 = new OperatorWrapper()
32 | .id("2")
33 | .engine(engine)
34 | .operator(operator2)
35 | .next("3")
36 | .next("4")
37 | .after((w) -> {
38 | //设置结束节点
39 | w.getEngine().stopAt("3");
40 | })
41 | ;
42 | OperatorWrapper wrapper3 = new OperatorWrapper()
43 | .id("3")
44 | .engine(engine)
45 | .operator(operator3)
46 | ;
47 |
48 | OperatorWrapper wrapper4 = new OperatorWrapper()
49 | .id("4")
50 | .engine(engine)
51 | .operator(operator4)
52 | ;
53 |
54 | engine.runAndWait(300_000);
55 |
56 | if (engine.getEx() != null) {
57 | engine.getEx().printStackTrace();
58 | }
59 | }
60 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/endpoint/Operator1.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.endpoint;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator1 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("1...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/endpoint/Operator2.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.endpoint;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator2 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("2...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/endpoint/Operator3.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.endpoint;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | import java.util.concurrent.TimeUnit;
7 |
8 | /**
9 | * Created by ytyht226 on 2022/6/23.
10 | */
11 | public class Operator3 implements IOperator {
12 | @Override
13 | public Integer execute(Integer param) throws Exception {
14 | //业务逻辑部分
15 | TimeUnit.MILLISECONDS.sleep(10);
16 | System.out.println("3...");
17 | return null;
18 | }
19 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/endpoint/Operator4.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.endpoint;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | import java.util.concurrent.TimeUnit;
7 |
8 | /**
9 | * Created by ytyht226 on 2022/6/23.
10 | */
11 | public class Operator4 implements IOperator {
12 | @Override
13 | public Integer execute(Integer param) throws Exception {
14 | //业务逻辑部分
15 | TimeUnit.MILLISECONDS.sleep(100);
16 | System.out.println("4...");
17 | return null;
18 | }
19 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/group/GroupTest.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.group;
2 |
3 | import org.taskflow.core.DagEngine;
4 | import org.taskflow.core.thread.pool.CustomThreadPool;
5 | import org.taskflow.core.wrapper.OperatorWrapper;
6 | import org.taskflow.core.wrapper.OperatorWrapperGroup;
7 | import org.junit.Test;
8 |
9 | import java.util.concurrent.ExecutorService;
10 |
11 | /**
12 | * 节点组
13 | * Created by ytyht226 on 2022/6/23.
14 | */
15 | @SuppressWarnings("all")
16 | public class GroupTest {
17 | ExecutorService executor = CustomThreadPool.newFixedThreadPoolWrapper(5);
18 | Operator1 operator1 = new Operator1();
19 | Operator2 operator2 = new Operator2();
20 | Operator3 operator3 = new Operator3();
21 | Operator4 operator4 = new Operator4();
22 | Operator5 operator5 = new Operator5();
23 | Operator6 operator6 = new Operator6();
24 | Operator7 operator7 = new Operator7();
25 | Operator8 operator8 = new Operator8();
26 | Operator9 operator9 = new Operator9();
27 | Operator10 operator10 = new Operator10();
28 |
29 | @Test
30 | public void test() {
31 | DagEngine engine = new DagEngine(executor);
32 | //节点1、2、3、4是一个节点组
33 | OperatorWrapperGroup group1 = buildGroup1(engine);
34 | //节点5、6、7、8是一个节点组
35 | OperatorWrapperGroup group2 = buildGroup2(engine);
36 | //节点组1的后继节点是节点组2的开始节点
37 | group1.next(group2.getGroupBeginId());
38 | //节点组2(结束节点)的后继节点是节点9
39 | group2.next("9");
40 |
41 | OperatorWrapper wrapper9 = new OperatorWrapper()
42 | .id("9")
43 | .engine(engine)
44 | .operator(operator9)
45 | //节点9的后继节点是节点10
46 | .next("10")
47 | ;
48 | OperatorWrapper wrapper10 = new OperatorWrapper()
49 | .id("10")
50 | .engine(engine)
51 | .operator(operator10)
52 | ;
53 | engine.runAndWait(300_000);
54 | if (engine.getEx() != null) {
55 | engine.getEx().printStackTrace();
56 | }
57 | }
58 |
59 | private OperatorWrapperGroup buildGroup1(DagEngine engine) {
60 | OperatorWrapper wrapper1 = new OperatorWrapper()
61 | .id("1")
62 | .engine(engine)
63 | .operator(operator1)
64 | ;
65 | OperatorWrapper wrapper2 = new OperatorWrapper()
66 | .id("2")
67 | .engine(engine)
68 | .operator(operator2)
69 | .depend("1")
70 | ;
71 | OperatorWrapper wrapper3 = new OperatorWrapper()
72 | .id("3")
73 | .engine(engine)
74 | .operator(operator3)
75 | .depend("1")
76 | ;
77 | OperatorWrapper wrapper4 = new OperatorWrapper()
78 | .id("4")
79 | .engine(engine)
80 | .operator(operator4)
81 | .depend("1")
82 | ;
83 |
84 | return new OperatorWrapperGroup(engine)
85 | .beginWrapperIds("1")
86 | .endWrapperIds("2", "3", "4")
87 | .init()
88 | ;
89 | }
90 |
91 | private OperatorWrapperGroup buildGroup2(DagEngine engine) {
92 | OperatorWrapper wrapper5 = new OperatorWrapper()
93 | .id("5")
94 | .engine(engine)
95 | .operator(operator5)
96 | ;
97 | OperatorWrapper wrapper6 = new OperatorWrapper()
98 | .id("6")
99 | .engine(engine)
100 | .operator(operator6)
101 | .depend("5")
102 | ;
103 | OperatorWrapper wrapper7 = new OperatorWrapper()
104 | .id("7")
105 | .engine(engine)
106 | .operator(operator7)
107 | .depend("5")
108 | ;
109 | OperatorWrapper wrapper8 = new OperatorWrapper()
110 | .id("8")
111 | .engine(engine)
112 | .operator(operator8)
113 | .depend("5")
114 | ;
115 |
116 | return new OperatorWrapperGroup(engine)
117 | .beginWrapperIds("5")
118 | .endWrapperIds("6", "7", "8")
119 | .init()
120 | ;
121 | }
122 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/group/Operator1.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.group;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator1 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("1...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/group/Operator10.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.group;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator10 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("10...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/group/Operator2.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.group;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator2 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("2...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/group/Operator3.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.group;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator3 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("3...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/group/Operator4.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.group;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator4 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("4...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/group/Operator5.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.group;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | import java.util.concurrent.TimeUnit;
7 |
8 | /**
9 | * Created by ytyht226 on 2022/6/23.
10 | */
11 | public class Operator5 implements IOperator {
12 | @Override
13 | public Integer execute(Integer param) throws Exception {
14 | //业务逻辑部分
15 | TimeUnit.MILLISECONDS.sleep(1000);
16 | System.out.println("5...");
17 | return null;
18 | }
19 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/group/Operator6.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.group;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator6 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("6...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/group/Operator7.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.group;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator7 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("7...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/group/Operator8.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.group;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | /**
7 | * Created by ytyht226 on 2022/6/23.
8 | */
9 | public class Operator8 implements IOperator {
10 | @Override
11 | public Integer execute(Integer param) throws Exception {
12 | //业务逻辑部分
13 | System.out.println("8...");
14 | return null;
15 | }
16 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/group/Operator9.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.group;
2 |
3 |
4 | import org.taskflow.core.operator.IOperator;
5 |
6 | import java.util.concurrent.TimeUnit;
7 |
8 | /**
9 | * Created by ytyht226 on 2022/6/23.
10 | */
11 | public class Operator9 implements IOperator {
12 | @Override
13 | public Integer execute(Integer param) throws Exception {
14 | //业务逻辑部分
15 | TimeUnit.MILLISECONDS.sleep(1000);
16 | System.out.println("9...");
17 | return null;
18 | }
19 | }
--------------------------------------------------------------------------------
/taskflow-example/src/main/java/org/taskflow/example/group/nest/GroupTest.java:
--------------------------------------------------------------------------------
1 | package org.taskflow.example.group.nest;
2 |
3 | import org.taskflow.core.DagEngine;
4 | import org.taskflow.core.thread.pool.CustomThreadPool;
5 | import org.taskflow.core.wrapper.OperatorWrapper;
6 | import org.taskflow.core.wrapper.OperatorWrapperGroup;
7 | import org.junit.Test;
8 |
9 | import java.util.concurrent.ExecutorService;
10 |
11 | /**
12 | * 嵌套节点组
13 | * Created by ytyht226 on 2022/6/23.
14 | */
15 | @SuppressWarnings("all")
16 | public class GroupTest {
17 | ExecutorService executor = CustomThreadPool.newFixedThreadPoolWrapper(5);
18 | Operator1 operator1 = new Operator1();
19 | Operator2 operator2 = new Operator2();
20 | Operator3 operator3 = new Operator3();
21 | Operator4 operator4 = new Operator4();
22 | Operator5 operator5 = new Operator5();
23 | Operator6 operator6 = new Operator6();
24 | Operator7 operator7 = new Operator7();
25 | Operator8 operator8 = new Operator8();
26 | Operator9 operator9 = new Operator9();
27 |
28 | @Test
29 | public void test() {
30 | DagEngine engine = new DagEngine(executor);
31 | //节点2、3、4、5是节点组 group1
32 | OperatorWrapperGroup group1 = buildGroup1(engine);
33 | //节点6、7是节点组 group2
34 | OperatorWrapperGroup group2 = buildGroup2(engine);
35 | //节点组 group1、group2 和 节点8是节点组 group3
36 | OperatorWrapperGroup group3 = buildGroup3(engine, group1, group2);
37 |
38 | //节点1的后继节点是节点组group3
39 | OperatorWrapper wrapper1 = new OperatorWrapper()
40 | .id("1")
41 | .engine(engine)
42 | .operator(operator1)
43 | .next(group3.getGroupBeginId())
44 | ;
45 | //节点组3的后继节点是节点9
46 | group3.next("9");
47 |
48 | OperatorWrapper wrapper9 = new OperatorWrapper()
49 | .id("9")
50 | .engine(engine)
51 | .operator(operator9)
52 | ;
53 | engine.runAndWait(300_000);
54 | if (engine.getEx() != null) {
55 | engine.getEx().printStackTrace();
56 | }
57 | }
58 |
59 | private OperatorWrapperGroup buildGroup1(DagEngine engine) {
60 |
61 | OperatorWrapper wrapper2 = new OperatorWrapper()
62 | .id("2")
63 | .engine(engine)
64 | .operator(operator2)
65 | ;
66 | OperatorWrapper wrapper3 = new OperatorWrapper