@@ -143,7 +143,30 @@ RouteAble Work的定义,如下:
143143- start: 起始Task;从指定Task开始执行;必填
144144- finish:最终Task;无论如何都会执行,即使执行过程中出现异常;选填
145145
146- #### 3.4 Extra的配置
146+ #### 3.4 复用Work
147+ 有时,一个work的通用性较好,希望将其作为其它work的一个task而被复用;使用taskWrapper标签将该work封装为task:
148+ ```
149+ <!- 通用性较好的work,将被复用 ->
150+ <tf:work id="subWork" start="calTask" traceable="true"/>
151+ <!-- 将subWork封装为task供其它work使用 -->
152+ <tf:taskWrapper id="subWorkWrapper" refWork="subWork" resultKey="subWorkResultName">
153+ <tf:routing toTask="someTask"/>
154+ </tf:taskWrapper>
155+
156+
157+ <tf:work id="mainWork" class="taskflow.work.SequentialRouteWork">
158+ <tf:task-ref value="task1"/>
159+ <tf:task-ref value="task2"/>
160+ <!-- 复用subWork,方式一:使用task-ref标签指定被taskWrapper封装过的work -->
161+ <tf:task-ref value="subWorkWrapper"/>
162+ <!-- 复用subWork,方式二:使用work-ref标签指定workId -->
163+ <!-- <tf:work-ref value="subWork"/> -->
164+ </tf:work>
165+ ```
166+ 配置文件详情见[ task-config.xml] ( ./src/test/resources/task-config.xml ) ;
167+ 编程式用例见[ WorkBuilderDemoApplication] ( ./src/test/java/demo/WorkBuilderDemoApplication.java ) 。
168+
169+ #### 3.5 Extra的配置
147170在开发中往往需要定义许多的Work,这些不同的Work可能会引用到同一个Task,在执行该Task时,不同的Work可能会需要不同的参数;
148171
149172extra可以用来指定处于不同Work中的同一个Task的执行参数;extra的数据类型为String,建议定义为JSON,这样更灵活;定义方式如下:
@@ -179,12 +202,15 @@ public class GetDiffTask {
1792023 . 如果最大值和最小值的差大于{x}输出“no”,否则输入“ok”
1802034 . {x}通过配置extra指定
181204
205+ #### 4.1 XML方式
182206在classpath下新建配置文件task-config.xml
183207
184- #### 第一步 编写Task类
208+ ##### 第一步 编写Task类
209+
185210编写相应的业务逻辑代码,详见test/demo
186211
187212例如getDiff的核心代码如下:
213+
188214```
189215private NumberService numberService;
190216public void getDiff(@Taskparam("maxValue") int a, @Taskparam("minValue") int b,WorkContext workContext) {
@@ -196,8 +222,11 @@ public void getDiff(@Taskparam("maxValue") int a, @Taskparam("minValue") int b,W
196222 }
197223}
198224```
199- #### 第二步 定义Task
225+
226+ ##### 第二步 定义Task
227+
200228task-config.xml加入如下配置
229+
201230```
202231<bean id="findNumberTaskBean" class="demo.task.FindNumber"/>
203232
@@ -214,12 +243,16 @@ task-config.xml加入如下配置
214243<tf:task id="soutOutOkTask" ref="findNumberTaskBean" method="soutOutOk"/>
215244<tf:task id="soutOutNoTask" ref="findNumberTaskBean" method="soutOutNo"/>
216245```
217- #### 第三步 定义Work
246+ ##### 第三步 定义Work
247+
218248task-config.xml加入如下配置
249+
219250```
220251<tf:work id="testWork" start="findMaxTask" class="taskflow.work.CustomRouteWork"/>
221252```
222- #### 第四步 运行
253+
254+ ##### 第四步 运行
255+
223256```
224257public class DemoApplication {
225258 public static void main(String[] args) {
@@ -240,6 +273,53 @@ public class DemoApplication {
240273}
241274```
242275
276+ #### 4.2 编程方式
277+ 编程式定义work/task时,taskflow框架不再跟spring耦合,所有要使用到的业务bean应该自行管理。
278+
279+ ##### 第一步 定义Task
280+ 编写相应的业务逻辑代码,详见test/demo/WorkBuilderDemoApplication.java
281+
282+ 示例代码如下:
283+
284+ ```
285+ Task findMaxTask = (workContext)->{
286+ List<Integer> input = workContext.get("intList");
287+ int maxValue = numberService.findMax(input);
288+ workContext.put("maxValue", maxValue);
289+ };
290+ @Autowired
291+ FindNumber findNumber;
292+ Task getDiffTask = (workContext) -> {
293+ int maxValue = workContext.get("maxValue");
294+ int minValue = workContext.get("minValue");
295+ findNumber.getDiff(maxValue, minValue, workContext);
296+ };
297+ ```
298+
299+ ##### 第二步 使用WorkBuilder创建Work
300+
301+ WorkBuilder可以创建RouteAbleWorkBuilder和SequentialWorkBuilder,分别用来生成顺序Work和可路由Work。
302+
303+ ```
304+ RouteAbleWorkBuilder workBuilder = WorkBuilder.newRouteableInstance();
305+ //添加task后可立即为其添加routing,多个routing可连续调用多次putRouting()方法来添加
306+ //定义routing时,若key和toTask都为空则routing无效,会被忽略
307+ //routing可指向当前task以循环执行,最大次数受maxTasks的影响;见test/demo.WorkBuilderApplication示例
308+ workBuilder.addTask(findMaxTask).putRouting(findMaxTask,RoutingBuilder.newInstance().toTask(findMinTask.getId()).build())
309+ .addTask(getDiffTask,"{threshold:1}").putRouting(RoutingBuilder.newInstance().key("ok").toTask(soutOutOkTask.getId()).extra("HighPriority_OK").build())
310+ .putRouting(RoutingBuilder.newInstance().key("no").toTask(soutOutNoTask.getId()).extra("HighPriority_NO").build()
311+ ...
312+ .addTask(findNumber::soutOutOk);
313+ ```
314+
315+ ##### 第三步 运行work
316+
317+ ```
318+ Work work=workBuilder.build();
319+ work.putContext("intList", Arrays.asList(5, 7, 1, 0, 1, 3, 4, 5, 6, 4));
320+ String result = work.run().getResult();
321+ ```
322+
243323### 5.异步Task
244324Sequential Work支持异步执行Task(RouteAble Work不支持,因为每一个Task是否执行由上一个Task决定)。
245325当Sequential Work中的某些Task跟其它Task没有依赖或执行顺序要求时,可以将该Task设置为异步方式执行,方式如下:
@@ -294,6 +374,11 @@ Task在执行时依然按照定义的顺序调用,若为异步Task则触发调
294374 <td>允许运行时动态重载work</td>
295375 <td>true</td>
296376 </tr>
377+ <tr>
378+ <td>taskflow.work.maxTasks</td>
379+ <td>允许执行的task次数上限</td>
380+ <td>1000</td>
381+ </tr>
297382 <tr>
298383 <td>taskflow.work.traceable</td>
299384 <td>允许记录task执行时的参数情况;开启时每个task执行会记录下当时workcontext的快照</td>
@@ -361,4 +446,14 @@ Task在执行时依然按照定义的顺序调用,若为异步Task则触发调
361446 3.xml形式注册work支持输出注册记录</td>
362447 <td>2022-2-11</td>
363448 </tr>
449+ <tr>
450+ <td>3.1.0</td>
451+ <td>1.work可复用<br/>
452+ 2.Task接口参数由Work修改为WorkContext<br/>
453+ 3.所有Task的入参不再接受Work,统一为WorkContext<br/>
454+ 4.支持编程式定义work/task<br/>
455+ 5.新增系统参数maxTasks<br/>
456+ </td>
457+ <td>2022-4-25</td>
458+ </tr>
364459</table >
0 commit comments