首页 文章 精选 留言 我的

精选列表

搜索[AI工作流],共10000篇文章
优秀的个人博客,低调大师

云办公系统 skyeye v3.7.0 发布,工作流升级

项目介绍 智能办公 OA 系统[SpringBoot2-快速开发平台],适用于医院,学校,中小型企业等机构的管理。包含文件在线操作、工作日志、多班次考勤、CRM、ERP进销存、项目管理、EHR、拖拽式生成问卷、日程、笔记、工作计划、行政办公、薪资模块、动态表单、知识库、公告模块、企业论坛、云售后模块、生产模块、系统模块化同步模块等多种复杂业务功能。 云办公系统 skyeye v3.7.0发布,更新内容: US: 新增前后加签功能 新增委派功能 新增转办功能 FIX: 解决后加签子任务的关联问题 解决后加签选择下个任务审批人的选择问题 企业版改进计划,改进计划优惠多多哦。详情 erp:https://gitee.com/doc_wei01/erp-pro OA:https://gitee.com/doc_wei01/skyeye 报表:https://gitee.com/doc_wei01/skyeye-report 企业版信息:https://docs.qq.com/doc/DQlRxcVRMWWVjbU1i?_from=1&disableReturnList=1,有问题可以联系作者,详情请看开发计划。 效果图 效果图 效果图

优秀的个人博客,低调大师

云办公系统 skyeye v3.6.9 发布,工作流升级

项目介绍 智能办公 OA 系统[SpringBoot2-快速开发平台],适用于医院,学校,中小型企业等机构的管理。包含文件在线操作、工作日志、多班次考勤、CRM、ERP进销存、项目管理、EHR、拖拽式生成问卷、日程、笔记、工作计划、行政办公、薪资模块、动态表单、知识库、公告模块、企业论坛、云售后模块、生产模块、系统模块化同步模块等多种复杂业务功能。 云办公系统 skyeye v3.6.9发布,更新内容: US: Activiti5升级FlowAble6版本 MySQL版本升级为5.7.17 FIX: 解决流程撤回时未更新redis的问题 解决获取下一个UserTask审批人信息内容为空的问题 企业版改进计划,改进计划优惠多多哦。详情 erp:https://gitee.com/doc_wei01/erp-pro OA:https://gitee.com/doc_wei01/skyeye 报表:https://gitee.com/doc_wei01/skyeye-report 企业版信息:https://docs.qq.com/doc/DQlRxcVRMWWVjbU1i?_from=1&disableReturnList=1,有问题可以联系作者,详情请看开发计划。 效果图 效果图 效果图

优秀的个人博客,低调大师

工作流Activiti的Web端工具:Activiti Explorer使用详解

Activiti Explorer简介 Activiti Explorer: Activiti控制台,是一个web应用程序 从Activiti的官方网站下载Activiti的压缩zip文件时,Activiti控制台在 ${Activiti_home}/wars文件夹下面 该控制台的目的并不是创建一个完善的web应用程序,仅仅是为客户端用户准备的应用程序.对于该控制台,使用了一个内存数据库,也可以换成自定义的数据库(查看WEB-INF文件夹下面的applicationContext.xml文件) 登录控制台,有四个主要功能模块: Tasks: 任务管理功能 如果是任务执行人,可以看见运行中流程实例的待办任务,也可以拾取组任务 控制台涉及的功能有子任务的工作,不同角色的人... 控制台允许创建一个独立的任务,该任务不需要关联任何流程实例 Processes: 显示部署的流程定义列表,并且可以启动一个新的流程实例 Reports: 生成报表和显示之前保存历史的结果数据 Manage: 用于管理Activiti的流程引擎 管理用户和组 执行和查看停止的jobs 查看数据库和部署新的流程定义 登录的用户具有超级管理员权限才会显示 流程图 控制台包含的功能,使用RaphaëlJavascript框架自动生成一张流程图: 当流程定义XML包含的BPMN注入信息时,该流程图才能够生成 当流程定义XML中并没有BPMN注入信息,但是部署的时候包含一张流程图,那么该图片也将会被显示 如果不想使用Javascript生成流程图,可以在ui.properties文件禁用 activiti.ui.jsdiagram = false 控制台上显示流程图,也可以对流程图进行查看,根据流程定义的ID,显示流程定义图片: http://localhost:8080/activiti-explorer/diagram-viewer/index.html?processDefinitionId=reviewSaledLead:1:36 通过processInstanceId的请求参数,可以显示当前流程实例的状态: http://localhost:8080/activiti-explorer/diagram-viewer/index.html?processDefinitionId=reviewSaledLead:1:36&processInstanceId=41 Tasks 任务 Inbox: 显示登录用户需要办理的所有任务列表 My Tasks: 显示登录用户任务拥有者的任务列表: 当创建一个独立的任务时,可以自动化操作该任务 Queued: 显示不用的组任务列表,并且登录用户在该组中: 这里的所有任务都必须先拾取,然后才能够完成 Involved: 显示登录用户被参与的任务,即不是执行人和任务拥有者 Archived: 归档,包含已经完成历史任务 Processes Deployed process definitions(部署流程定义) 在流程定义选项卡中,允许查看Activiti流程引擎部署的所有流程定义 可以使用页面顶部右边的按钮启动一个新的流程实例 如果该流程定义有一个启动表单, 那么在启动流程实例之前就会先显示表单 My instances(我的流程实例) 显示当前登录用户未完成的用户任务的所有流程实例 直观地显示流程实例的当前活动和存储的流程变量 Manage 在管理功能中,只有当登录用户是权限组admin中的成员时,该功能才会显示 当点击Manage图标按钮: Database Database: 数据库.显示Activiti有关内容.当开发流程或者排除故障等问题的时候是非常有用的 Deployments Deployments: 部署.显示当前部署的流程引擎,并且可以看到部署的内容:流程定义,流程图,业务规则,等等... 当点击部署按钮时,可以上传新的部署: 从自己的计算机中选择一个业务文档或者一个BPMN20.XML文件 简单的拖拽到指定的区域就可以部署一个新的业务流程 Jobs Jobs: 作业 在左边显示当前的作业(定时器等等)并且运行手动执行(例如在截止时间之前触发定时器) 如果作业执行失败(例如邮件服务器不能正常工作),那么就会显示所有的异常 Users Users: 管理用户 创建,修改和删除用户.关联用户 获取权限查看任务分配特定用户信息 Groups Groups: 管理组 创建,修改和删除组,关联组 获取权限查看任务分配特定组等信息 Reports 报表: ==注意:== 如果要让报表工作,控制台需要配置历史的级别不能为none.默认的配置是满足要求的 报表选项卡的子选项卡有2个: 生成报表: 显示系统中已知的报表列表 允许运行生成的报表 保存报表: 显示之前保存的所有报表列表 仅仅显示的是个人保存的报表,并且不能看见其他人保存的报表 流程的数据被用于生成报表中的列表和图标.使用流程生成报表数据的优势: 该流程能够直接访问Activiti流程引擎的内部: 直接可以使用流程引擎访问数据库 作业执行器能够用于任何其他的流程: 能够异步生成流程 仅仅异步执行某些步骤 可以使用定时器:在某些时间点上面生成报表数据 可以用已知的工具和已知的概念创建一个新的报表: 没有新的概念,服务或者应用被需要 部署或者上传一个新的报表与部署一个新的流程是一样的 可以使用BPMN2.0结构: 意味着所有的东西:比如并行网关,可以实现基于数据或用户请求输入生成分支 生成报表数据的流程定义需要把activiti-report设置为分类,这样就能在Explorer的报表列表中显示出来。 能够看到报表的唯一要求是: 流程创建一个名为reportData的流程变量,这个变量必须是json对象的二进制数组 变量必须保存到Activiti的历史表中,所以要求引擎必须启用历史功能 因此可以在后面报表保存时获取 reportData 报表流程必须生成一个变量reportData, 作为展示给用户的JSON数据: { "title": "My Report", "datasets": [ { "type" : "lineChart", "description" : "My first chart", "xaxis" : "Year" "yaxis" : "Total sales" "data" : { "2010" : 50, "2011" : 33, "2012" : 17, "2013" : 87, } } ] } json数据会在Explorer中获取,并用来生成图表或列表 json的元素有: title: 报表的标题 datasets: 数据集的数组,对应报表中不同的图表和列表 type: 数据集的类型. 这个类型会用来决定如何渲染数据,支持的值: pieChart lineChart barChart list description: 每个图表在报表中显示一个描述,这个是可选的 xaxis: 只对lineChart类型起作用,这个参数是可选的,用来修改图表坐标系x轴的名称 yaxis: 只对lineChart类型起作用,这个参数是可选的,用来修改图表坐标系y轴的名称 data: 实际的数据,数据是一个key:value格式的json对象 流程实例 流程实例总览报表: 只包含一个脚本任务:使用javascript生成json数据集 虽然所有Explorer中的例子都使用javascript, 也可以使用java服务任务 执行流程最后的结果就是reportData变量,保存数据 <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="activiti-report"> <process id="process-instance-overview-report" name="Process Instance Overview" isExecutable="true"> <startEvent id="startevent1" name="Start" /> <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="generateDataset" /> <scriptTask id="generateDataset" name="Execute script" scriptFormat="JavaScript" activiti:autoStoreVariables="false"> <script><![CDATA[ importPackage(java.sql); importPackage(java.lang); importPackage(org.activiti.explorer.reporting); var result = ReportingUtil.executeSelectSqlQuery("SELECT PD.NAME_, PD.VERSION_ , count(*) FROM ACT_HI_PROCINST PI inner join ACT_RE_PROCDEF PD on PI.PROC_DEF_ID_ = PD.ID_ group by PROC_DEF_ID_"); var reportData = {}; reportData.datasets = []; var dataset = {}; dataset.type = "pieChart"; dataset.description = "Process instance overview (" + new java.util.Date() + ")"; dataset.data = {}; while (result.next()) { // process results one row at a time var name = result.getString(1); var version = result.getLong(2) var count = result.getLong(3); dataset.data[name + " (v" + version + ")"] = count; } reportData.datasets.push(dataset); execution.setVariable("reportData", new java.lang.String(JSON.stringify(reportData)).getBytes("UTF-8")); ]]></script> </scriptTask> <sequenceFlow id="flow3" sourceRef="generateDataset" targetRef="theEnd" /> <endEvent id="theEnd" /> </process> </definitions> 除了流程xml顶部的标准xml,主要区别是targetNamespace设置为activiti-report, 把分类设置为与部署的流程定义一样的名称 脚本的第一行是进行一些导入,避免每次使用时,都要写包名 第一个有意义的代码是使用ReportingUtil读取activiti数据库.返回结果是一个JDBC 结果集 查询语句下面 ,javascript创建了使用的json.json是符合上面描述的需求的 最后一行脚本,首先需要把json对象转换成字符串,使用javascript函数JSON.stringify(). 字符串需要保存为二进制数组类型的变量 这是一个技术问题: 二进制数组的大小是无限的,但是字符串的长度有限制 这就是为什么javascript字符串必须转换成一个java字符串以获得转换成二进制的功能 原生json功能无法使用,这里提供了一些帮助类ReportData和Dataset: <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="activiti-report"> <process id="process-instance-overview-report" name="Process Instance Overview" isExecutable="true"> <startEvent id="startevent1" name="Start" /> <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="generateDataset" /> <scriptTask id="generateDataset" name="Execute script" scriptFormat="js" activiti:autoStoreVariables="false"> <script><![CDATA[ importPackage(java.sql); importPackage(java.lang); importPackage(org.activiti.explorer.reporting); var result = ReportingUtil.executeSelectSqlQuery("SELECT PD.NAME_, PD.VERSION_ , count(*) FROM ACT_HI_PROCINST PI inner join ACT_RE_PROCDEF PD on PI.PROC_DEF_ID_ = PD.ID_ group by PROC_DEF_ID_"); var reportData = new ReportData; var dataset = reportData.newDataset(); dataset.type = "pieChart"; dataset.description = "Process instance overview (" + new java.util.Date() + ")" while (result.next()) { // process results one row at a time var name = result.getString(1); var version = result.getLong(2); var count = result.getLong(3); dataset.add(name + " (v" + version + ")", count); } execution.setVariable("reportData", reportData.toBytes()); ]]></script> </scriptTask> <sequenceFlow id="flow3" sourceRef="generateDataset" targetRef="theEnd" /> <endEvent id="theEnd" /> </process> </definitions> 报告开始表单 报表是使用普通流程来生成的,所以表单功能也可以使用 直接在开始事件里加一个开始表单 ,Explorer就会在生成报表之前展示给用户 <startEvent id="startevent1" name="Start"> <extensionElements> <activiti:formProperty id="processDefinition" name="Select process definition" type="processDefinition" required="true" /> <activiti:formProperty id="chartType" name="Chart type" type="enum" required="true"> <activiti:value id="pieChart" name="Pie chart" /> <activiti:value id="barChart" name="Bar chart" /> </activiti:formProperty> </extensionElements> </startEvent> 为用户渲染一个普通的表单: 表单属性会在启动流程时提交,然后就可以像普通的流程变量一样使用.脚本中可以使用这些流程变量来生成数据: var processDefinition = execution.getVariable("processDefinition"); 流程示例 控制台中包含4个报表示例: Employee productivity(员工的工作效率): 报表演示使用折线图和开始表单 报表的脚本比其他例子要复杂,因为数据会在脚本中先进行解释,再保存到报表数据中 Helpdesk(一线与升级): 使用饼图进行展示 结合两个不同的数据库查询结果 Process instance overview(流程实例总览): 使用多个数据集的报表实例 报表包含使用相同数据的饼图和列表视图 展示多种数据集可以用来在一个页面中生成不同图表 Task duration(任务持续时间): 另一个使用开始表单的例子 会使用对应的变量来动态生成SQL查询语句 修改数据库 要修改控制台例子所用的数据库: 改变属性文件:apps/apache-tomcat-6.x/webapps/activiti-explorer/WEB-INF/classes/db.properties 在类路径下放上合适的数据库驱动: Tomcat共享类库 在apps/apache-tomcat-6.x/webapps/activiti-explorer/WEB-INF/lib/ 中

优秀的个人博客,低调大师

工作流引擎Activiti集成JPA持久化保存流程数据

Activiti中JPA简介 可以使用JPA实体作为流程变量, 并进行操作: 基于流程变量更新已有的JPA实体,可以在用户任务的表单中填写或者由服务任务生成 重用已有的领域模型,不需要编写显示的服务获取实体或者更新实体的值 根据已有实体的属性做出判断(网关即分支聚合) JPA实体要求 Activiti中JPA只支持符合以下要求的实体: 实体应该使用JPA注解进行配置, 支持字段和属性访问两种方式.@MappedSuperclass也要能够被使用 实体中应该有一个使用@Id注解的主键,不支持复合主键@EmbeddedId 和 @IdClass: Id字段或者属性能够使用JPA规范支持的任意类型: 原生态数据类型和他们的包装类型(Boolean除外) String BigInteger BigDecimal java.util.Date java.sql.Date JPA配置 引擎必须有一个对EntityManagerFactory的引用才能够使用JPA的实体,这样可以通过配置引用或者提供一个持久化单元名称 作为变量的JPA实体将会被自动检测并进行相应的处理 使用jpaPersistenceUnitName配置: <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration"> <!-- 数据库的配置 --> <property name="databaseSchemaUpdate" value="true" /> <property name="jdbcUrl" value="jdbc:h2:mem:JpaVariableTest;DB_CLOSE_DELAY=1000" /> <property name="jpaPersistenceUnitName" value="activiti-jpa-pu" /> <property name="jpaHandleTransaction" value="true" /> <property name="jpaCloseEntityManager" value="true" /> <!-- job executor configurations --> <property name="jobExecutorActivate" value="false" /> <!-- mail server configurations --> <property name="mailServerPort" value="5025" /> </bean> 配置一个自定义的EntityManagerFactory, 这里使用了OpenJPA实体管理器 该代码片段仅仅包含与例子相关的beans,去掉了其他beans. OpenJPA实体管理的完整并可以使用的例子可以在activiti-spring-examples(/activiti-spring/src/test/java/org/activiti/spring/test/jpa/JPASpringTest.java) 中找到 <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="persistenceUnitManager" ref="pum"/> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter"> <property name="databasePlatform" value="org.apache.openjpa.jdbc.sql.H2Dictionary" /> </bean> </property> </bean> <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"> <property name="dataSource" ref="dataSource" /> <property name="transactionManager" ref="transactionManager" /> <property name="databaseSchemaUpdate" value="true" /> <property name="jpaEntityManagerFactory" ref="entityManagerFactory" /> <property name="jpaHandleTransaction" value="true" /> <property name="jpaCloseEntityManager" value="true" /> <property name="jobExecutorActivate" value="false" /> </bean> 也可以在编程式创建一个引擎时完成配置: ProcessEngine processEngine = ProcessEngineConfiguration .createProcessEngineConfigurationFromResourceDefault() .setJpaPersistenceUnitName("activiti-pu") .buildProcessEngine(); 配置的属性有: jpaPersistenceUnitName: 使用持久化单元的名称: 要确保该持久化单元在类路径下是可用的,默认的路径是 /META-INF/persistence.xml 要么使用jpaEntityManagerFactory要么或者是jpaPersistenceUnitName jpaEntityManagerFactory: 一个实现了javax.persistence.EntityManagerFactory的bean的引用: 将被用来加载实体并且刷新更新 要么使用jpaEntityManagerFactory要么或者是jpaPersistenceUnitName jpaHandleTransaction: 在被使用的EntityManager实例上,该标记表示流程引擎是否需要开始和提交或者回滚事务: 当使用Java事务API(JTA) 时,设置为false jpaCloseEntityManager: 该标记表示流程引擎是否应该关闭从 EntityManagerFactory获取的EntityManager的实例: 当EntityManager是由容器管理的时候需要设置为false: 当使用并不是单一事务作用域的扩展持久化上下文的时候 JPA用法 简单示例 首先,需要创建一个基于META-INF/persistence.xml的EntityManagerFactory作为持久化单元:包含持久化单元中所有的类和一些供应商特定的配置 使用一个简单的实体作为测试,其中包含有一个id和String类型的value属性,也将会被持久化 在测试之前,创建一个实体并且保存: @Entity(name = "JPA_ENTITY_FIELD") public class FieldAccessJPAEntity { @Id @Column(name = "ID_") private Long id; private String value; public FieldAccessJPAEntity() { // Empty constructor needed for JPA } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } 启动一个新的流程实例,添加一个实体作为变量. 其他的变量,将会被存储在流程引擎的持久化数据库中.下一次获取该变量的时候,将会根据该类和存储Id从EntityManager中加载: Map<String, Object> variables = new HashMap<String, Object>(); variables.put("entityToUpdate", entityToUpdate); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("UpdateJPAValuesProcess", variables); 流程定义中的第一个节点是一个服务任务,将会调用entityToUpdate上的setValue方法,其实就是之前在启动流程实例时候设置的JPA变量并且将会从当前流程引擎的上下文关联的EntityManager中加载: <serviceTask id='theTask' name='updateJPAEntityTask' activiti:expression="${entityToUpdate.setValue('updatedValue')}" /> 当完成服务任务时,流程实例将会停留在流程定义中定义的用户任务环节上: 可以查看该流程实例 EntityManager已经被刷新了并且改变的实体已经被保存进数据库中 获取entityToUpdate的变量value时,该实体将会被再次加载并且获取该实体属性的值将会是updatedValue // Servicetask in process 'UpdateJPAValuesProcess' should have set value on entityToUpdate. Object updatedEntity = runtimeService.getVariable(processInstance.getId(), "entityToUpdate"); assertTrue(updatedEntity instanceof FieldAccessJPAEntity); assertEquals("updatedValue", ((FieldAccessJPAEntity)updatedEntity).getValue()) 查询JPA流程变量 以查询某一JPA实体作为变量的ProcessInstances和Executions 在ProcessInstanceQuery和ExecutionQuery查询中仅仅variableValueEquals(name, entity) 支持JPA实体变量: [variableValueNotEquals],[variableValueGreaterThan],[variableValueGreaterThanOrEqual],[variableValueLessThan],[variableValueLessThanOrEqual]不被支持并且传递JPA实体值的时候会抛出一个ActivitiException ProcessInstance result = runtimeService.createProcessInstanceQuery().variableValueEquals("entityToQuery", entityToQuery).singleResult(); 使用Spring beans和JPA结合的高级例子 JPASpringTest, 在activiti-spring-examples中: 已经存在了一个使用JPA实体的Spring-bean, 用来存储贷款申请 使用Activiti,可以通过已经存在的bean获取已经使用的实体,并使用它作为变量用于流程中 流程定义步骤: 服务任务: 创建一个新的贷款申请,使用已经存在的LoanRequestBean接受启动流程时候的变量(来自流程启动时候的表单) 使用activiti:resultVariable(作为一个变量对表达式返回的结果进行存储)将创建出来的实体作为变量进行存储 用户任务: 允许经理查看贷款申请,并填入审批意见(同意/不同意) 审批意见将作为一个boolean变量approvedByManager进行存储 服务任务: 更新贷款申请实体,因此该实体与流程保持同步 根据贷款申请实体变量approved的值,将利用唯一网关自动决定下一步该选择那一条路径: 当申请批准,流程结束 否则,一个额外的任务将会使用(发送拒绝信),这样就可以发送拒绝信手动通知客户 <?xml version="1.0" encoding="UTF-8"?> <definitions id="taskAssigneeExample" xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" targetNamespace="org.activiti.examples"> <process id="LoanRequestProcess" name="Process creating and handling loan request"> <startEvent id='theStart' /> <sequenceFlow id='flow1' sourceRef='theStart' targetRef='createLoanRequest' /> <serviceTask id='createLoanRequest' name='Create loan request' activiti:expression="${loanRequestBean.newLoanRequest(customerName, amount)}" activiti:resultVariable="loanRequest"/> <sequenceFlow id='flow2' sourceRef='createLoanRequest' targetRef='approveTask' /> <userTask id="approveTask" name="Approve request" /> <sequenceFlow id='flow3' sourceRef='approveTask' targetRef='approveOrDissaprove' /> <serviceTask id='approveOrDissaprove' name='Store decision' activiti:expression="${loanRequest.setApproved(approvedByManager)}" /> <sequenceFlow id='flow4' sourceRef='approveOrDissaprove' targetRef='exclusiveGw' /> <exclusiveGateway id="exclusiveGw" name="Exclusive Gateway approval" /> <sequenceFlow id="endFlow1" sourceRef="exclusiveGw" targetRef="theEnd"> <conditionExpression xsi:type="tFormalExpression">${loanRequest.approved}</conditionExpression> </sequenceFlow> <sequenceFlow id="endFlow2" sourceRef="exclusiveGw" targetRef="sendRejectionLetter"> <conditionExpression xsi:type="tFormalExpression">${!loanRequest.approved}</conditionExpression> </sequenceFlow> <userTask id="sendRejectionLetter" name="Send rejection letter" /> <sequenceFlow id='flow5' sourceRef='sendRejectionLetter' targetRef='theOtherEnd' /> <endEvent id='theEnd' /> <endEvent id='theOtherEnd' /> </process> </definitions> 上面的例子展示了JPA结合Spring和参数化方法表达式的强大优势 :所有的流程就不需要自定义java代码(Spring bean除外),大幅度的加快了流程部署

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册