新流程引擎接入使用手册

新流程引擎接入使用手册

依赖引入

Maven

1. SpringBoot

在SpringBoot环境中,提供了开箱即用的starter。

<dependency>  
    <groupId>cn.com.agree.aops</groupId>  
    <artifactId>aops-bizflow-spring-boot-starter</artifactId>  
    <version>1.0</version>  
</dependency>

2. 纯Java

在普通java项目中,引入以下依赖

<dependency>  
    <groupId>cn.com.agree.aops</groupId>  
    <artifactId>aops-bizflow-api</artifactId>  
    <version>1.0</version>  
</dependency>  
<dependency>  
    <groupId>cn.com.agree.aops</groupId>  
    <artifactId>aops-bizflow-repository-impl</artifactId>  
    <version>1.0</version>  
</dependency>  
<dependency>  
    <groupId>cn.com.agree.aops</groupId>  
    <artifactId>aops-bizflow-engine-impl</artifactId>  
    <version>1.0</version>  
</dependency>

环境初始化

流程引擎需要使用数据库。目前支持以下数据库:

Mysql

CREATE TABLE IF NOT EXISTS  bizflow_identify(
    id varchar(64),
    db_next long,
    rev integer,
    primary key (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
INSERT INTO bizflow_identify(id,db_next,rev) values ('bizflow_global_identify',1,0)

CREATE TABLE IF NOT EXISTS  bizflow_ru_procinst (
    id varchar(64),
    rev integer,
    deleted tinyint UNSIGNED,
    business_key varchar(255),
    process_definition_id varchar(255),
    start_time varchar(255),
    history_ids varchar(255),
    executions blob,
    tasks blob,
    primary key (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;

使用

提供基于SpringBoot环境以及纯Java环境的两种使用方式。

第一步,获取服务调用入口

SpringBoot环境

1. 添加启动配置

bizflow:  
    baseDir: "E:\\工作\\赞同科技\\需求\\上海银行渠道中台改造\\BankCModule" # 流程定义文件目录  
    hikariConfig:  
        jdbcUrl: "jdbc:mysql://10.6.0.10:32306/activiti?autoReconnect=true&nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&useSSL=false&tcpRcvBuf=1024000"  
        username: <用户名>  
        password: <密码>  
        maximumPoolSize: 20

更多可选配置参考SpringBoot配置项说明

SpringBoot配置项说明
bizflow:  
    ttl: 10 # 单个流程实例缓存有效时间。默认 900。单位:秒  
    baseDir: "E:\\工作\\赞同科技\\需求\\上海银行渠道中台改造\\BankCModule" # 流程定义文件目录  
    cacheLevel: 3 # 缓存级别。0 不使用内存缓存,3 使用内存缓存,默认 3    
    idBuffers: 3 # 唯一ID缓存区数量,多个ID缓存区可以提供更多的可用ID数同时避免blockSize过大导致ID浪费过多。默认 3    
    blockSize: 5000 # 唯一ID申请的区段。总ID可用数:idBuffers*blockSize,默认 2500    
    asyncId: true # 异步唯一ID申请。开启后会启用后台线程提前预申请ID段减少业务申请ID的耗时(提前申请的数量取决于idBuffers数量),但是相对的也会导致更多的ID浪费,默认true  
    softDelete: false #软删除,将数据库中的流程实例标记为已删除而不是执行delete操作,然后通过后台线程批量删除。不建议开启,避免在高并发时出现性能波动。默认false。
    processDefinitionRefreshSeconds: 10 #流程定义文件更新检查间隔,配置后会定时对比文件MD5重载被修改的流程文件。单位:秒。默认0,不开启  
    maxCacheSize: 10 #流程实例缓存队列大小。达到最大值后,继续保存流程实例会触发部分流程实例入库,入库失败会丢弃该实例,流程实例在每次请求结束后会提交,然后删除内存缓存,所以理论上内存中缓存的流程实例数量最大值不会超过同时执行的业务请求数。默认值 1000。  
    maxLifetimeSecs: 10 #在流程实例触发驱逐后,即达到TTL时间,会触发入库操作,如果入库失败会尝试重新加入缓存队列(队列满除外),直到达到该配置的时间后直接丢弃该实例。单位:秒。默认86400(24小时)。要求为TTL的倍数。  
    warmup: true #预热开关,开启后会进行表达式预加载以及流程实例预热。默认:false  
    warmupTimes: 3 #流程实例预热的次数。默认:3
    hikariConfig:  
        jdbcUrl: "jdbc:mysql://10.6.0.10:32306/activiti?autoReconnect=true&nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&useSSL=false&tcpRcvBuf=1024000"  #数据库连接串
        username: root  # 用户名
        password: root  # 密码
        maximumPoolSize: 20 #最大连接数

2. 获取服务调用入口

@Service
public class BizFlowService {
    @Resource
    private BizFlowConfiguration configuration;
}

注入BizFlowConfiguration即可

纯Java环境

需要自行管理配置,参考以下代码初始化配置即可直接获取服务调用入口。

/**  
 * 用于测试的配置实现  
 */  
public class EngineBizFlowConfiguration {  
    public BizFlowConfiguration bizFlowConfiguration(){  
    DataSource dataSource = new SimpleDataSource("jdbc:mysql://10.6.0.14:3306/activiti?autoReconnect=true&nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&useSSL=false&tcpRcvBuf=1024000", "root", "liangyufu");  
    DefaultBizFlowConfiguration defaultBizFlowConfiguration = new DefaultBizFlowConfiguration();  
    defaultBizFlowConfiguration.setDataSource(dataSource);  
    defaultBizFlowConfiguration.setAbx5BizFlowClient(new Abx5BizFlowClientImpl(defaultBizFlowConfiguration));  
    defaultBizFlowConfiguration.setBizFlowService(new BizFlowServiceImpl(defaultBizFlowConfiguration));  
    defaultBizFlowConfiguration.setProcessDefinitionService(new ProcessDefinitionServiceImpl(defaultBizFlowConfiguration));  
    defaultBizFlowConfiguration.setTtl(10);  
    defaultBizFlowConfiguration.setBaseDir("E:\\工作\\赞同科技\\需求\\上海银行渠道中台改造\\BankCModule");  
    defaultBizFlowConfiguration.setDefaultCacheMask(3);  
    defaultBizFlowConfiguration.setMaxCacheSize(1000);  
    defaultBizFlowConfiguration.setMaxLifetimeSecs(24*60*60);  
    defaultBizFlowConfiguration.setActivityBehaviorFactory(new ActivityBehaviorFactoryImpl());  
    defaultBizFlowConfiguration.setRepositoryFactory(new DefaultRepositoryFactory(defaultBizFlowConfiguration));  
    defaultBizFlowConfiguration.setIdGenerator(new AsyncDbIdGenerator(dataSource, 2000, 2));  
    return defaultBizFlowConfiguration;  
}
}

第二步,调用服务

1. 启动流程实例

启动一个新的流程实例。

调用方法

public ProcessInstance startProcessInstance(String definitionKey,String businessKey,String stepKey, Map<String,Object> vars){
    BizFlowConfiguration configuration = getBizFlowConfiguration();  
    StartProcessInstanceParam param = new StartProcessInstanceParam();  
	param.setTransientVariables(vars);  
	param.setProcessDefinitionKey(definitionKey);  
	param.setBusinessKey(businessKey);  
	IBizFlowService bizFlowService = configuration.getBizFlowService();  
	ProcessInstance processInstance = bizFlowService.startProcessInstanceByKey(param);
	return processInstance;
}

请求参数

public class StartProcessInstanceParam {  
    protected String processDefinitionKey;  
    protected String businessKey;  
    protected Map<String, Object> transientVariables;  
}
  • processDefinitionKey:流程唯一Key
  • businessKey:唯一业务流水号。由调用方生成。
  • transientVariables:流程启动参数。可选,目前不使用。

响应参数

public class ProcessInstance {
    /**
     * 流程实例ID
     */
    protected String id;
    /**
     * 业务流水号
     */
    protected String businessKey;
    /**
     * 流程开始时间
     */
    protected Date startTime;

    /**
     * 流程定义
     */
    private ProcessDefinition processDefinition;
    /**
     * 用户任务
     */
    private Map<String, UserTask> userTaskMap = new HashMap<>();
}
  • id:流程实例ID
  • businessKey:唯一业务流水号。由调用方生成。
  • startTime:流程开始时间。
  • processDefinition:流程模型。
  • userTaskMap:当前待执行的所有用户任务。

2. 获取对象规则

对象指的是用户任务,该方法可以获取用户任务中通过参数绑定的子流程的待执行用户任务。

调用方法

public ProcessInstance getProcessRules(String objectRunningId,String definitionKey,String stepKey, Map<String,Object> vars){
    BizFlowConfiguration configuration = getBizFlowConfiguration();  
  
	GetRuleProcessParam param = new GetRuleProcessParam();  
	param.setId(objectRunningId);  
	param.setProcessDefinitionKey(definitionKey);  
	param.setActivityId(stepKey);  
	param.setTransientVariables(vars);  
	  
	IBizFlowService bizFlowService = configuration.getBizFlowService();  
	ProcessInstance processInstance = bizFlowService.getRuleProcess(param);
	return processInstance;
}

请求参数

public class GetRuleProcessParam {  
    protected String id;  
    protected String processDefinitionKey;  
    protected String activityId;  
    protected Map<String, Object> transientVariables;  
}
  • id:对应的用户任务id
  • processDefinitionKey:子流程唯一Key
  • activityId:初始节点id,不设置则默认从第一个节点开始。
  • transientVariables:流程启动参数。可选。

响应参数

public class ProcessInstance {
    /**
     * 流程实例ID
     */
    protected String id;
    /**
     * 业务流水号
     */
    protected String businessKey;
    /**
     * 流程开始时间
     */
    protected Date startTime;

    /**
     * 流程定义
     */
    private ProcessDefinition processDefinition;
    /**
     * 用户任务
     */
    private Map<String, UserTask> userTaskMap = new HashMap<>();
}
  • id:子流程实例ID
  • businessKey:唯一业务流水号。由调用方生成。
  • startTime:流程开始时间。
  • processDefinition:流程模型。
  • userTaskMap:当前子流程待执行的所有用户任务。

3. 提交任务

提交用户任务。即标记用户任务已完成,会返回下一个待执行的用户任务列表。

调用方法

public ProcessInstance completeTask(String objectRunningId,Map<String,Object> vars){
	BizFlowConfiguration configuration = getBizFlowConfiguration();
	Map<String, Object> vars = variablesDict;
	CompleteTaskParam param = new CompleteTaskParam();
	param.setId(objectRunningId);
	param.setTransientVariables(vars);

	IBizFlowService bizFlowService = configuration.getBizFlowService();
	ProcessInstance processInstance = bizFlowService.complete(param);
	return processInstance;
}

请求参数

public class CompleteTaskParam {  
    protected String id;  
    protected Map<String, Object> transientVariables;  
}
  • id:对应的用户任务id
  • transientVariables:附加参数。可选。

响应参数

public class ProcessInstance {
    /**
     * 流程实例ID
     */
    protected String id;
    /**
     * 业务流水号
     */
    protected String businessKey;
    /**
     * 流程开始时间
     */
    protected Date startTime;

    /**
     * 流程定义
     */
    private ProcessDefinition processDefinition;
    /**
     * 用户任务
     */
    private Map<String, UserTask> userTaskMap = new HashMap<>();
}
  • id:流程实例ID
  • businessKey:唯一业务流水号。由调用方生成。
  • startTime:流程开始时间。
  • processDefinition:流程模型。
  • userTaskMap:当前待执行的所有用户任务。

4. 回滚任务

回滚指定的任务,其余已被执行过的任务仍保持已完成状态。

调用方法

public ProcessInstance jumpTask(String rootProcessInstanceId,String jumpId){
	BizFlowConfiguration configuration = getBizFlowConfiguration();
	ProcessInstanceJumpParam param = new ProcessInstanceJumpParam();
	param.setId(rootProcessInstanceId);
	param.setJumpToActId(jumpId);
	IBizFlowService bizFlowService = configuration.getBizFlowService();
	ProcessInstance processInstance = bizFlowService.jump(param);
	return processInstance;
}

请求参数

public class ProcessInstanceJumpParam {  
    private String id;  
    private String jumpToActId;  
}
  • id:流程实例id
  • jumpToActId:需要回滚的节点id。

响应参数

public class ProcessInstance {
    /**
     * 流程实例ID
     */
    protected String id;
    /**
     * 业务流水号
     */
    protected String businessKey;
    /**
     * 流程开始时间
     */
    protected Date startTime;

    /**
     * 流程定义
     */
    private ProcessDefinition processDefinition;
    /**
     * 用户任务
     */
    private Map<String, UserTask> userTaskMap = new HashMap<>();
}
  • id:流程实例ID
  • businessKey:唯一业务流水号。由调用方生成。
  • startTime:流程开始时间。
  • processDefinition:流程模型。
  • userTaskMap:当前待执行的所有用户任务。

5. 持久化流程实例

持久化流程实例。

调用方法

public void saveProcessInstance(String rootProcessInstanceId){
	BizFlowConfiguration configuration = getBizFlowConfiguration();
	SaveProcessParam param = new SaveProcessParam();
	param.setId(rootProcessInstanceId);
	IBizFlowService bizFlowService = configuration.getBizFlowService();
	bizFlowService.saveProcessInstance(param);
}

请求参数

public class SaveProcessParam {  
    private String id;  
}
  • id:流程实例id

响应参数

无。

高级特性

自包含模式

注意:仅支持SpringBoot项目
该模式允许用户将bpmn资源直接封装在jar包中,在运行时直接使用,对外部的bpmn资源没有依赖。

使用方式

将bpmn资源复制到任意项目模块的src/main/resources目录下的bpmn目录即可。

FatJar自解压模式

注意:仅支持SpringBoot项目
该模式将bpmn资源打包到jar包中,引擎启动时将资源解压缩到指定的位置使用。

使用方式

第一步,修改配置

将原application.yml中的bizflow.baseDir配置项迁移到bootstrap.properties中,且建议修改为相对路径。然后加入:bizflow.fatjar=true配置项。

bizflow.fatjar=true  
bizflow.baseDir=./moduleHome

第二步,调整打包配置

在项目的src/main/目录新建子目录abx-resources/moduleHome,然后将bpmn资源复制到moduleHome目录

调整项目打包配置,将abx-resources目录打包到SpringBoot的可运行包中。


        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-resources-plugin</artifactId>  
            <version>3.2.0</version>  
            <executions>  
                <execution>  
                    <id>copy-resources</id>  
                    <phase>process-resources</phase>  
                    <goals>  
                        <goal>copy-resources</goal>  
                    </goals>  
                    <configuration>  
                        <outputDirectory>${project.build.directory}/classes/BOOT-INF/abx-resources</outputDirectory>  
                        <resources>  
                            <resource>  
                                <directory>src/main/abx-resources</directory>  
                            </resource>  
                        </resources>  
                    </configuration>  
                </execution>  
            </executions>  
        </plugin>