Flowable 知识点
1、多租户
Flowable多租户有三种实现方式:
a、原始模式:多个flowable执行引擎,每个引擎对应不同的数据库
b、共享模式:共用一个flowable引擎和一个数据库,不同租户用 TenantId 字段进行区别(数据库表中多了一个TenantId字段)。
runtimeService.createProcessInstanceQuery() .processInstanceTenantId("tenant1") .list(); repositoryService.createDeployment() .addClasspathResource("...") .tenantId("tenant1") .deploy();
c、多Schema模式:一个flowable引擎,每个用户一个数据库的Schema,做到数据库层面分离。
config = new MultiSchemaMultiTenantProcessEngineConfiguration(tenantInfoHolder); config.setDatabaseType(MultiSchemaMultiTenantProcessEngineConfiguration.DATABASE_TYPE_H2); config.setDatabaseSchemaUpdate(MultiSchemaMultiTenantProcessEngineConfiguration.DB_SCHEMA_UPDATE_DROP_CREATE); config.registerTenant("tenant1", createDataSource("jdbc:h2:mem:flowable-tenant1;DB_CLOSE_DELAY=1000", "sa", "")); config.registerTenant("tenant2", createDataSource("jdbc:h2:mem:flowable-tenant2;DB_CLOSE_DELAY=1000", "sa", "")); config.registerTenant("tenantN", createDataSource("jdbc:h2:mem:flowable-tenantN;DB_CLOSE_DELAY=1000", "sa", "")); processEngine = config.buildProcessEngine();
2、异步节点
异步节点的真正含义不是 上述两个任务分在两个线程中单独执行,
而是在执行 上图中的任务1前,开启一个数据库事务,创建一个执行下一操作的Job,然后就关闭数据库事务。
再启动一个另外的事务,执行这个Job,执行完后,并将流程状态变更为执行一下操作,此时再关闭该事务。
流程就流转到下一个节点。
异步节点的核心在于:新开启了事务,然后通过Job去完成操作。
具体好处就是:可恢复。
如果是同步节点,在执行该节点任务时,如果抛出了异常(因为网络异常等等意外因素),流程就会回滚到用户提交前的状态,用户就得再填写一次数据,再提交流程(不管是否需要再填写一次数据,用户总会感知到系统出了问题)。
如果是异步节点,则是先创建个Job,用户那边已经得到流程提交成功的明确答复了。然后系统再执行这个Job,出错了,就再次尝试执行(默认是三次),还不行则进入死信表,还可以手动或自动重新恢复执行。
关于异步节点的详细解说可以参看:Demystifying the Asynchronous Flag