执行器
LiteFlow中执行器是执行流程的入口,这篇笔记我们详细介绍执行器的使用方式。
同步启动流程
使用执行器我们需要先获取执行器实例,在SpringBoot工程中,我们直接使用依赖注入FlowExecutor
对象即可。启动流程则需要使用execute2Resp()
方法,这是一个同步方法,它会阻塞到流程执行完成或出错。
package com.gacfox.demo.controller;
import com.gacfox.demo.common.ApiResult;
import com.yomahub.liteflow.core.FlowExecutor;
import com.yomahub.liteflow.flow.LiteflowResponse;
import com.yomahub.liteflow.slot.DefaultContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("/api/v1/demo")
public class DemoController {
@Resource
private FlowExecutor flowExecutor;
@GetMapping("/startFlow")
public ApiResult<?> startFlow() {
LiteflowResponse response = flowExecutor.execute2Resp("demoChain", null, DefaultContext.class);
return ApiResult.success("流程执行结果为: " + response.isSuccess());
}
}
execute2Resp()
方法中,第1个参数是流程名,即XML配置中<chain>
的name
属性,第2个参数是流程入参,第3个参数是流程的数据上下文类。该方法的返回值LiteflowResponse
对象包含流程执行的结果、执行详细信息、上下文数据、异常信息等。
注意:LiteflowResponse
不适合直接序列化作为接口返回结果,我们应手动从其中解析信息并传入自定义的响应对象。
异步启动流程
如果你想并发的启动多个流程,可以使用执行器的execute2Future()
方法,它会返回java.util.concurrent.Future
对象。这个方法是非阻塞的,由LiteFlow框架的线程池调度执行。
package com.gacfox.demo.controller;
import com.gacfox.demo.common.ApiResult;
import com.yomahub.liteflow.core.FlowExecutor;
import com.yomahub.liteflow.flow.LiteflowResponse;
import com.yomahub.liteflow.slot.DefaultContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
@Slf4j
@RestController
@RequestMapping("/api/v1/demo")
public class DemoController {
@Resource
private FlowExecutor flowExecutor;
@GetMapping("/startFlow")
public ApiResult<?> startFlow() {
Future<LiteflowResponse> responseFuture = flowExecutor.execute2Future("demoChain", "Hello, world!", DefaultContext.class);
LiteflowResponse response;
try {
response = responseFuture.get();
return ApiResult.success("流程执行结果为: " + response.isSuccess());
} catch (InterruptedException | ExecutionException e) {
log.error("流程执行失败: ", e);
return ApiResult.failure("流程执行失败");
}
}
}
在SpringBoot工程的application.properties
配置文件中,我们可以调整这个线程池的线程数或实现类。
liteflow.main-executor-works=64
liteflow.main-executor-class=com.yomahub.liteflow.thread.LiteFlowDefaultMainExecutorBuilder
组件编排时的线程池
LiteFlow中组件支持并行编排,例如WHEN(a, b, c)
中a
、b
、c
三个组件会并发执行,默认配置下所有组件的并发调度使用同一个全局线程池。全局线程池的线程数为64,队列大小为512。
liteflow.global-thread-pool-size=64
liteflow.global-thread-pool-queue-size=512
liteflow.global-thread-pool-executor-class=com.yomahub.liteflow.thread.LiteFlowDefaultGlobalExecutorBuilder
该线程池的默认拒绝策略是CallerRunsPolicy
,即触发拒绝策略时,只要线程池还没关闭就使用调用线程直接运行。这种策略适合并发量小、不允许失败的场景,如果并发量较大会导致主线程严重阻塞,性能损失较大,不过它对于LiteFlow的使用场景是合适的。
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。