社区精选 | Flowable 流程部署与删除
今天小编为大家带来的是社区作者 江南一点雨 的文章,本文我们一起来看看流程的部署等细节问题。
1. 默认行为
flowable.check-process-definitions=false
flowable.process-definition-location-prefix=classpath*:/processes/
flowable.process-definition-location-suffixes=**.bpmn20.xml,**.bpmn
flowable.check-process-definitions
:这个表示是否在项目启动的时候,去检查文件目录是否有对应的流程文件,该属性为 true 表示如果有流程文件就自动部署,false 表示不检查,那么也就不会自动部署。flowable.process-definition-location-prefix
:这个是流程文件的位置,默认就是classpath*:/processes/
,当然开发者也可以进行配置。flowable.process-definition-location-suffixes
:这个是流程文件的后缀,默认有两个,分别是**.bpmn20.xml
和**.bpmn
,当然开发者也可以进行配置。
2. 动态部署
@RestController
public class ProcessDeployController {
@Autowired
RepositoryService repositoryService;
@PostMapping("/deploy")
public RespBean deploy(MultipartFile file) throws IOException {
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment()
.category("javaboy的工作流分类")
.name("javaboy的工作流名称")
.addInputStream(file.getOriginalFilename(), file.getInputStream())
.key("javaboy的工作流key");
Deployment deployment = deploymentBuilder
.deploy();
return RespBean.ok("部署成功",deployment.getId());
}
}
首先通过 repositoryService.createDeployment() 方法来创建一个流程部署构建器,即 DeploymentBuilder。 接下来为 DeploymentBuilder 设置分类、名称以及 key 等属性。 关键的方法是 addInputStream,通过该方法去指定流程文件。官方的提供的指定流程文件的方式有好几种;除了 addInputStream 之外,另外还有一个 addString,这个就是将流程文件转为一个字符串传入进来;addBytes 是将流程文件转为字节数组传进来;addClasspathResource 方法则是直接从 classpath 目录下去加载流程文件,这几个方法根据自己的使用场景选择一个合适的方法去调用即可。 这里有一个需要跟大家强调的地方,就是 addInputStream/addBytes/addString 等方法都需要设置资源名,这个名称是可以随意设置的,但是注意名称的后缀,需要是 bpmn20.xml 或者 bpmn,否则流程没有部署。为什么流程名后缀要是 bpmn20.xml 或者 bpmn 呢?参考第一小节。
3. 表分析





4. 查询操作
logging.level.org.flowable=debug
4.1 查询部署信息
@Test
void test01() throws IOException {
List<Deployment> list = repositoryService.createDeploymentQuery().list();
for (Deployment deployment : list) {
logger.info("id:{};key:{}", deployment.getId(), deployment.getKey());
}
}


javaboy的工作流key
的流程部署文件,但是这个流程我之前部署过多次(版本升级),现在我想查询最近一次的流程部署信息,查询方式如下:@Test
void test01() throws IOException {
Deployment deployment = repositoryService.createDeploymentQuery().deploymentKey("javaboy的工作流key").latest().singleResult();
logger.info("id:{};key:{}", deployment.getId(), deployment.getKey());
}
--- [ main] i.p.e.D.selectDeploymentsByQueryCriteria : ==> Preparing: SELECT RES.* from ACT_RE_DEPLOYMENT RES WHERE RES.KEY_ = ? and RES.DEPLOY_TIME_ = (select max(DEPLOY_TIME_) from ACT_RE_DEPLOYMENT where KEY_ = RES.KEY_ and DERIVED_FROM_ is null and ( (TENANT_ID_ IS NOT NULL and TENANT_ID_ = RES.TENANT_ID_) or (TENANT_ID_ IS NULL and RES.TENANT_ID_ IS NULL) ) ) order by RES.ID_ asc
--- [ main] i.p.e.D.selectDeploymentsByQueryCriteria : ==> Parameters: javaboy的工作流key(String)
--- [ main] i.p.e.D.selectDeploymentsByQueryCriteria : <== Total: 1
javaboy的工作流key
,查询时间是一个最大的时间,这就很好懂了。4.2 查询流程定义信息
@Test
void test02() {
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();
for (ProcessDefinition pd : list) {
logger.info("id:{};key:{};version:{};",pd.getId(),pd.getKey(),pd.getVersion());
}
}

@Test
void test02() {
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().processDefinitionKey("javaboy_submit_an_expense_account").list();
for (ProcessDefinition pd : list) {
logger.info("id:{};key:{};version:{};",pd.getId(),pd.getKey(),pd.getVersion());
}
}

4.3 原生查询
javaboy的工作流key
的流程部署文件,但是这个流程我之前部署过多次(版本升级),现在我想查询最近一次的流程部署信息,查询方式如下:@Test
void test03() {
Deployment deployment = repositoryService.createNativeDeploymentQuery().sql("SELECT RES.* from ACT_RE_DEPLOYMENT RES WHERE RES.KEY_ = #{key} and RES.DEPLOY_TIME_ = (select max(DEPLOY_TIME_) from ACT_RE_DEPLOYMENT where KEY_ = RES.KEY_) order by RES.ID_ asc").parameter("key", "javaboy的工作流key").singleResult();
logger.info("id:{};key:{}", deployment.getId(), deployment.getKey());
}
@Test
void test04() {
List<ProcessDefinition> list = repositoryService.createNativeProcessDefinitionQuery()
.sql("SELECT RES.* from ACT_RE_PROCDEF RES WHERE RES.KEY_ = #{key} order by RES.ID_ asc")
.parameter("key", "javaboy_submit_an_expense_account").list();
for (ProcessDefinition pd : list) {
logger.info("id:{};key:{};version:{};", pd.getId(), pd.getKey(), pd.getVersion());
}
}


关注公众号:拾黑(shiheibook)了解更多
赞助链接:
关注数据与安全,洞悉企业级服务市场:https://www.ijiandao.com/
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

随时掌握互联网精彩