flowable通过代码创建流程

本文介绍如何使用Flowable流程引擎(版本6.4.0)通过代码生成并部署流程定义,包括动态添加任务监听器以进行节点操作人的设置。演示了从开始事件到结束事件的完整流程设计,涉及用户任务、网关、服务任务等元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  下面的代码主要功能是通过flowable代码生成流程定义并部署。节点添加task监听器,用于动态添加节点操作人等一些操作。       flowable为6.4.0 ,flowable用法很多可以参考activiti示例。

   @Test
    public void generate() {
        //开始事件
        StartEvent startEvent = new StartEvent();
        startEvent.setId("start");
        startEvent.setName("开始");
        //审批节点
        UserTask userTask = new UserTask();
        userTask.setId("CATEGORYID_FILE_AUDIT");
        userTask.setCategory(FlowNodeCategory.SEAL_AUDIT.name());
        userTask.setCandidateUsers(Arrays.asList("2422042842433986573"));
        userTask.setName("审批节点1");
        //添加任务节点Listener

         //permissinTaskListener 为实现TaskListener的一个类的bean名称

        //非spring下可以这样用

        //   listener.setImplementationType("class");
          //  listener.setImplementation("实现类的全限定名");
        List<FlowableListener> taskListeners = new ArrayList<>();
        FlowableListener listener = new FlowableListener();
        listener.setEvent("all");
        listener.setImplementationType("delegateExpression");
        listener.setImplementation("${permissinTaskListener}");
        //listener.setId("CATEGORYID_FILE_AUDIT_listener");
        taskListeners.add(listener);
        userTask.setTaskListeners(taskListeners);
        //
        ExclusiveGateway fileGateway = new ExclusiveGateway();
        fileGateway.setId("FILE_GATEWAY");
        
        UserTask userTask2 = new UserTask();
        userTask2.setId("CATEGORYID_SEAL_AUDIT");
        userTask2.setCategory(FlowNodeCategory.SEAL_AUDIT.name());
        userTask2.setCandidateUsers(Arrays.asList("2198741168097853440"));
        userTask2.setName("审批节点2");
        
        ExclusiveGateway sealGateway = new ExclusiveGateway();
        sealGateway.setId("SEAL_GATEWAY");
        //Service Task ,sealAuthDelegate 为实现JavaDelegate的spring bean 名称
        ServiceTask serviceTask = new ServiceTask();
        serviceTask.setId("SEAL_AUTH");
        serviceTask.setName("自动授权节点");
        serviceTask.setImplementationType("delegateExpression");
        serviceTask.setImplementation("${sealAuthDelegate}");
        
        //节点
        UserTask usesealTask = new UserTask();
        usesealTask.setCandidateUsers(Arrays.asList("${sealUsers}"));
        usesealTask.setId("CATEGORYID_SEAL_USE");
        usesealTask.setCategory(FlowNodeCategory.SEAL_USE.name());
        usesealTask.setName("使用节点");
        //拒绝
        EndEvent rejectEvent = new EndEvent();
        rejectEvent.setId("reject");
        rejectEvent.setName("拒绝");
        //结束事件
        EndEvent completeEvent = new EndEvent();
        completeEvent.setId("complete");
        completeEvent.setName("结束");
        
        SequenceFlow sequenceFlow = new SequenceFlow(startEvent.getId(), userTask.getId());
        SequenceFlow sequenceFlow2 = new SequenceFlow(userTask.getId(), fileGateway.getId());
        SequenceFlow sequenceFlow3 = new SequenceFlow(fileGateway.getId(),userTask2.getId());
        sequenceFlow3.setConditionExpression("${approve}");
        SequenceFlow sequenceFlow4 = new SequenceFlow(fileGateway.getId(), rejectEvent.getId());
        sequenceFlow4.setConditionExpression("${!approve}");
        SequenceFlow sequenceFlow5 = new SequenceFlow(userTask2.getId(), sealGateway.getId());
        SequenceFlow sequenceFlow6 = new SequenceFlow(sealGateway.getId(), serviceTask.getId());
        sequenceFlow6.setConditionExpression("${approve}");
        SequenceFlow sequenceFlow7 = new SequenceFlow(sealGateway.getId(), rejectEvent.getId());
        sequenceFlow7.setConditionExpression("${approve}");
        SequenceFlow sequenceFlow8 = new SequenceFlow(serviceTask.getId(),usesealTask.getId());
        SequenceFlow sequenceFlow9 = new SequenceFlow(usesealTask.getId(),completeEvent.getId());

        /*
         * 整合节点和连线成为一个 process
         */
        Process process = new Process();
        process.setId("CATAGORY_PHYSIC_SEAL_");
        process.setName("业务防伪用印分类流程");
        process.addFlowElement(startEvent);
        process.addFlowElement(userTask);
        process.addFlowElement(fileGateway);
        process.addFlowElement(userTask2);
        process.addFlowElement(sealGateway);
        process.addFlowElement(serviceTask);
        process.addFlowElement(usesealTask);
        process.addFlowElement(rejectEvent);
        process.addFlowElement(completeEvent);
        process.addFlowElement(sequenceFlow);
        process.addFlowElement(sequenceFlow2);
        process.addFlowElement(sequenceFlow3);
        process.addFlowElement(sequenceFlow4);
        process.addFlowElement(sequenceFlow5);
        process.addFlowElement(sequenceFlow6);
        process.addFlowElement(sequenceFlow7);
        process.addFlowElement(sequenceFlow8);
        process.addFlowElement(sequenceFlow9);
        BpmnModel bpmnModel = new BpmnModel();
        bpmnModel.addProcess(process);
        //new BpmnAutoLayout(bpmnModel).execute();
//        ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory();
//        ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator();
//        // 验证失败信息的封装ValidationError
//        List<ValidationError> validate = defaultProcessValidator.validate(bpmnModel);
        BpmnXMLConverter bpmnXMLConverter = new BpmnXMLConverter();
        byte[] convertToXML = bpmnXMLConverter.convertToXML(bpmnModel);
        String bytes = new String(convertToXML);
        System.out.println(bytes);
        String tenantId = "2422042838839468037";
        Deployment deploy = repositoryService.createDeployment().tenantId(tenantId).addString("分类流程.bpmn", bytes).deploy();
        logger.info("======部署id:"+deploy.getId());
    }

### 如何使用 Java 和 Flowable 完成 BPMN 流程定义及部署 以下是通过 Java 代码实现 Flowable 流程引擎的创建流程定义的部署以及流程实例化的具体方法: #### 创建流程引擎 Flowable 提供了一个简单的工厂类 `ProcessEngines` 来快速创建默认的流程引擎。 ```java import org.flowable.engine.ProcessEngine; import org.flowable.engine.ProcessEngines; public class FlowableExample { public static void main(String[] args) { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); System.out.println("流程引擎已成功创建:" + processEngine.getName()); } } ``` 上述代码展示了如何利用 `ProcessEngines.getDefaultProcessEngine()` 方法获得默认的流程引擎对象[^4]。 --- #### 部署 BPMN 流程定义 为了使 Flowable 能够识别并运行特定的业务流程,需要先将 BPMN 文件作为资源进行部署。以下是一个完整的示例: ```java import org.flowable.engine.RepositoryService; import org.flowable.engine.RuntimeService; import org.flowable.engine.repository.Deployment; import org.flowable.engine.runtime.ProcessInstance; public class DeployAndStartProcess { public static void main(String[] args) { // 获取流程引擎组件 RepositoryService repositoryService = processEngine.getRepositoryService(); RuntimeService runtimeService = processEngine.getRuntimeService(); // 部署流程定义文件 (假设 my-process.bpmn20.xml 存在于 classpath 中) Deployment deployment = repositoryService.createDeployment() .addClasspathResource("my-process.bpmn20.xml") // 添加 BPMN 文件到部署包中 .deploy(); String deploymentId = deployment.getId(); System.out.println("流程定义已成功部署,ID: " + deploymentId); // 启动流程实例 ProcessInstance instance = runtimeService.startProcessInstanceByKey("myProcess"); System.out.println("流程实例已启动,ID: " + instance.getId()); } } ``` 在此代码片段中,`repositoryService.createDeployment().addClasspathResource(...).deploy()` 是用来加载 BPMN 文件的核心逻辑[^1]。同时,`runtimeService.startProcessInstanceByKey("myProcess")` 利用了流程定义的关键字 `"myProcess"` 来触发新的流程实例。 --- #### 处理用户任务和其他扩展功能 如果流程中包含了用户任务或其他复杂行为,则可以通过额外的服务接口(如 `TaskService` 或 `FormService`)进一步管理这些交互过程。例如查询待办事项的任务服务如下所示: ```java import org.flowable.task.api.Task; import org.flowable.task.api.TaskService; // 假设当前存在未完成的任务 List<Task> tasks = taskService.createTaskQuery().taskAssignee("johnDoe").list(); for (Task task : tasks) { System.out.println("待办任务名称:" + task.getName() + ", ID:" + task.getId()); } // 完成指定任务 if (!tasks.isEmpty()) { taskService.complete(tasks.get(0).getId()); System.out.println("已完成任务:" + tasks.get(0).getName()); } ``` 此段代码演示了如何查找分配给某用户的任务,并最终标记其为“已完成”。这种操作对于实际应用场景非常常见。 --- #### 关于调用活动与子流程的区别 值得注意的是,在设计复杂的多层工作流时可能会遇到 **调用活动** 和 **嵌入式子流程** 的选择问题。虽然二者表面上相似,但实际上它们的行为模式不同:前者会引用外部独立存储的一个单独流程定义;而后者则是直接内联至父级流程之中[^2]。 另外还可以自定义分类标签以便更好地组织项目内的多个流程模型。比如设置目标命名空间属性即可达到这一目的[^3]: ```xml <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" targetNamespace="com.example.myCategory"> </definitions> ``` 以上 XML 片段说明了如何向 BPMN 文档附加专属类别信息。 --- ### 总结 综上所述,借助 Flowable 及其实现良好的 API 设计,开发者能够轻松地构建基于 BPMN 标准的工作流解决方案。无论是基础的功能还是高级特性都得到了充分支持。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值