执行器

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)abc三个组件会并发执行,默认配置下所有组件的并发调度使用同一个全局线程池。全局线程池的线程数为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进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。