- 浏览: 666998 次
- 性别:
- 来自: 长沙
文章分类
- 全部博客 (364)
- quick start (57)
- bboss aop (43)
- bboss mvc (48)
- bboss persistent (96)
- bboss taglib (30)
- bboss event (10)
- bbossgroups (52)
- bboss (32)
- bboss会话共享 (17)
- bboss rpc (7)
- bboss 国际化 (5)
- bboss 序列化 (9)
- bboss cxf webservice (8)
- bboss hessian (3)
- bboss 安全认证SSO (15)
- bboss 工作流 (6)
- 平台 (18)
- bboss quartz (3)
- 杂谈 (5)
- 大数据 (1)
- bboss elastic (24)
- bboss http (1)
- bboss kafka (1)
- Elasticsearch Scroll和Slice Scroll查询API使用案例 (1)
最新评论
-
qianhao123:
...
采用gradle构建和发布bboss方法介绍 -
qianhao123:
[img][/img]
采用gradle构建和发布bboss方法介绍 -
yin_bp:
欢迎大家参与working
高性能elasticsearch ORM开发库使用介绍 -
qq641879434:
万分感谢
bboss 持久层sql xml配置文件编写和加载方法介绍 -
yin_bp:
qq641879434 写道怎么设置配置文件 可以查看执行的S ...
bboss 持久层sql xml配置文件编写和加载方法介绍
本文介绍开源工作流引擎activiti与bboss ioc框架整合方法,涉及内容如下:
a).activiti采用bboss ioc来配置和初始化流程引擎
b).在activiti流程中使用bboss ioc容器托管的组件
c).bboss 托管activiti引擎流程处理事务
下面介绍前两部分,事务部分请参考文章《bboss持久层事务管理组件托管第三方持久层框架(mybatis等)事务功能介绍 》。
1 activiti-bboss源码工程下载及构建方法
1.1 环境准备
安装好jdk 1.6,gradle 4或以上版本,并配置好jdk和gradle的环境变量
安装好mysql数据库(自行安装),并启动
在mysql中建立一个activiti的数据库
准备好eclipse或者idea
1.2 下载activiti与bboss结合的源码工程
基于activiti-5.12和最新的bboss
https://github.com/yin-bp/activiti-engine-5.12
1.3 下载后解压并构建
执行解压目录下的run.bat文件构建activiti流程引擎的jar包,生成的jar存放在每个子模块下面的build目录下:
构建完毕后,除了将上面打包生成的zip包中的jar文件集成到项目来集成activiti,还可以通过maven坐标将activiti导入自己的项目:
2 在源码工程中运行流程测试用例
解压目录是一个eclipse工程,将其导入eclipse中
2.1 修改activiti-engine\src\test\resources\poolman.xml中的数据库地址为mysql数据库地址,并设置账户:
2.2 修改activiti-engine/src/test/resources/activiti.cfg.xml文件内容
为activiti配置bboss数据源mysql(是刚才在poolman.xml文件中配置的dbname为mysql的数据源的名称,该名称可以根据自己需要进行命名,没有特殊约定):
为activiti配置bboss ioc容器对象,以便在测试用例中引用bboss ioc管理的组件来获取和设置流程环节处理人:
被activiti使用的bboss ioc容器可以是独立的ioc容器,例如如上配置就是一个加载beans.xml的类型为DefaultApplicationContext的独立ioc容器(本文以独立ioc容器为例);也可以是bboss mvc对应的ioc容器,这样web应用中的流程就可以使用mvc ioc容器中配置的各种业务组件,mvc容器配置示例如下:
下面是一个完整的activiti.cfg.xml文件:
加载activiti.cfg.xml并启动Activiti:
说明:之所以将初始化activiti流程引擎的逻辑包含在一个bboss 的事务上下文之中,是因为activiti使用的是mybatis 3.0.6版本存在一个缺陷,这个缺陷表现为:先通过sqlsession开启一个事务,然后直接通过sqlsession的getconnection方法获取一个DB链接来执行多次数据库的增删改操作,如果全部执行成功,调用sqlsession的commit方法提交事务,如果执行成功一部分操作后出现异常,再调用sqlsession的rollback回滚事务,这样问题就出来了,mybatis会直接把connection返回给链接池,并不会提交或者回滚之前的db操作(因为这些操作没有调用sqlsession的相关方法来执行,而是直接通过connection完成的),connection并没有被物理关闭而只是返回到池中,这样就导致了之前修改和删除的数据被锁定了,导致后续针对这些锁定的记录的修改操作全部被阻塞造成不可预估的后果。
activiti在启动时会从mybatis的sqlsession中直接获取一个connection来执行创建和更新流程的库表结构并往属性表中插入或者更新流程的版本信息,如果在执行的过程中出现了问题的话,会导致数据库死锁,但是我们采用bboss的事务管理框架来托管mybatis的事务后就能够正常解决这个问题。
2.3 beans.xml 配置和管理bboss ioc组件
我们在activiti-engine/src/test/resources/beans.xml文件中配置了一个组件:
org.frameworkset.activiti.test.AssigneeAssignment组件是一个activiti task listener ,同时有个getHandlerMan方法用来获取任务处理人,代码如下:
3 在activiti的流程定义文件中引用bboss ioc中的组件
3.1 组件作为任务监听器使用
流程定义文件activiti-engine/src/test/resources/org/activiti/examples/bpmn/tasklistener/CustomTaskAssignmentTest.testAssigneeAssignment.bpmn20.xml相关内容:
流程定义文件完整内容如下:
流程执行示例
测试用例:
activiti-engine/src/test/java/org/activiti/examples/bpmn/tasklistener/CustomTaskAssignmentTest.java
测试方法:
3.2 直接调用组件方法获取任务处理人
流程定义文件activiti-engine/src/test/resources/org/activiti/examples/bpmn/usertask/taskassignee/TaskAssigneeTest.testTaskAssignee.bpmn20.xml相关内容:
完整流程定义文件:
流程执行:
测试用例activiti-engine/src/test/java/org/activiti/examples/bpmn/usertask/taskassignee/TaskAssigneeTest.java
测试方法:
测试方法中我们将业务处理和流程的处理包含在bboss的事务上下文件,如果工作流中包含了监听器的执行,那么监听器中的业务处理也会受事务的控制。
4.activiti-bboss eclipse demo工程
为了更好地方便大家使用activiti-bboss的整合版本,特意整理了一个demo工程,工程下载地址:
http://www.bbossgroups.com/file/download.htm?fileName=activiti-bboss-example.zip
工程里面已经根据上文方法做好相关配置
activiti.cfg.xml
beans.xml
poolman.xml
下载解压后将其导入eclipse,修改poolman.xml中的数据库连接地址和账号即可运行demo工程中的测试用例:
/activiti-bboss-example/src/org/frameworkset/activiti/test/SimpleActivitTest.java
用例方法为:
和本文相关的两个流程的测试方法:
testAssigneeAssignment();// 执行测试用例
testTaskAssignee();// 执行测试用例
bboss开发交流
21220580
bboss微信公众号
a).activiti采用bboss ioc来配置和初始化流程引擎
b).在activiti流程中使用bboss ioc容器托管的组件
c).bboss 托管activiti引擎流程处理事务
下面介绍前两部分,事务部分请参考文章《bboss持久层事务管理组件托管第三方持久层框架(mybatis等)事务功能介绍 》。
1 activiti-bboss源码工程下载及构建方法
1.1 环境准备
安装好jdk 1.6,gradle 4或以上版本,并配置好jdk和gradle的环境变量
安装好mysql数据库(自行安装),并启动
在mysql中建立一个activiti的数据库
准备好eclipse或者idea
1.2 下载activiti与bboss结合的源码工程
基于activiti-5.12和最新的bboss
https://github.com/yin-bp/activiti-engine-5.12
1.3 下载后解压并构建
执行解压目录下的run.bat文件构建activiti流程引擎的jar包,生成的jar存放在每个子模块下面的build目录下:
构建完毕后,除了将上面打包生成的zip包中的jar文件集成到项目来集成activiti,还可以通过maven坐标将activiti导入自己的项目:
<dependency> <groupId>com.bbossgroups.activiti</groupId> <artifactId>activiti-engine</artifactId> <version>5.12.7</version> </dependency>
2 在源码工程中运行流程测试用例
解压目录是一个eclipse工程,将其导入eclipse中
2.1 修改activiti-engine\src\test\resources\poolman.xml中的数据库地址为mysql数据库地址,并设置账户:
...... <dbname>mysql</dbname> <driver>com.mysql.jdbc.Driver</driver> <url>jdbc:mysql://localhost:3306/activiti</url> <username>root</username> <password>123456</password> ............
2.2 修改activiti-engine/src/test/resources/activiti.cfg.xml文件内容
为activiti配置bboss数据源mysql(是刚才在poolman.xml文件中配置的dbname为mysql的数据源的名称,该名称可以根据自己需要进行命名,没有特殊约定):
.... <property name="dataSource" factory-class="com.frameworkset.common.poolman.util.SQLManager" factory-method="getTXDatasourceByDBName"> <construction> <property value="mysql" /> </construction> </property> .....
为activiti配置bboss ioc容器对象,以便在测试用例中引用bboss ioc管理的组件来获取和设置流程环节处理人:
<property name="beanFactory" factory-class="org.frameworkset.spi.DefaultApplicationContext" factory-method="getApplicationContext"> <construction> <property value="beans.xml"/> </construction> </property>
被activiti使用的bboss ioc容器可以是独立的ioc容器,例如如上配置就是一个加载beans.xml的类型为DefaultApplicationContext的独立ioc容器(本文以独立ioc容器为例);也可以是bboss mvc对应的ioc容器,这样web应用中的流程就可以使用mvc ioc容器中配置的各种业务组件,mvc容器配置示例如下:
<property name="beanFactory" factory-class="org.frameworkset.web.servlet.support.WebApplicationContextUtils" factory-method="getWebApplicationContext"/>
下面是一个完整的activiti.cfg.xml文件:
<?xml version="1.0" encoding="UTF-8"?> <properties> <property name="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <property name="dataSource" factory-class="com.frameworkset.common.poolman.util.SQLManager" factory-method="getTXDatasourceByDBName"> <construction> <property value="mysql" /> </construction> </property> <!-- Database configurations --> <property name="databaseSchemaUpdate" value="true" /> <!-- job executor configurations --> <property name="jobExecutorActivate" value="false" /> <!-- mail server configurations --> <property name="mailServerPort" value="5025" /> <property name="history" value="full" /> </property> <property name="beanFactory" factory-class="org.frameworkset.spi.DefaultApplicationContext" factory-method="getApplicationContext"> <construction> <property value="beans.xml"/> </construction> </property> </properties>
加载activiti.cfg.xml并启动Activiti:
TransactionManager tm = new TransactionManager(); try { tm.begin(); processEngine = ProcessEngineConfiguration .createProcessEngineConfigurationFromResource(xmlPath) .buildProcessEngine(); tm.commit(); } catch(Exception e) { throw new RuntimeException(e); } finally { tm.releasenolog(); }
说明:之所以将初始化activiti流程引擎的逻辑包含在一个bboss 的事务上下文之中,是因为activiti使用的是mybatis 3.0.6版本存在一个缺陷,这个缺陷表现为:先通过sqlsession开启一个事务,然后直接通过sqlsession的getconnection方法获取一个DB链接来执行多次数据库的增删改操作,如果全部执行成功,调用sqlsession的commit方法提交事务,如果执行成功一部分操作后出现异常,再调用sqlsession的rollback回滚事务,这样问题就出来了,mybatis会直接把connection返回给链接池,并不会提交或者回滚之前的db操作(因为这些操作没有调用sqlsession的相关方法来执行,而是直接通过connection完成的),connection并没有被物理关闭而只是返回到池中,这样就导致了之前修改和删除的数据被锁定了,导致后续针对这些锁定的记录的修改操作全部被阻塞造成不可预估的后果。
activiti在启动时会从mybatis的sqlsession中直接获取一个connection来执行创建和更新流程的库表结构并往属性表中插入或者更新流程的版本信息,如果在执行的过程中出现了问题的话,会导致数据库死锁,但是我们采用bboss的事务管理框架来托管mybatis的事务后就能够正常解决这个问题。
2.3 beans.xml 配置和管理bboss ioc组件
我们在activiti-engine/src/test/resources/beans.xml文件中配置了一个组件:
<properties> <property name="taskAssigneeAssignment" class="org.frameworkset.activiti.test.AssigneeAssignment"/> </properties>
org.frameworkset.activiti.test.AssigneeAssignment组件是一个activiti task listener ,同时有个getHandlerMan方法用来获取任务处理人,代码如下:
package org.frameworkset.activiti.test; import org.activiti.engine.delegate.DelegateTask; import org.activiti.engine.delegate.TaskListener; /** * @author biaoping.yin */ public class AssigneeAssignment implements TaskListener { public void notify(DelegateTask delegateTask) { delegateTask.setAssignee("kermit");//设置任务处理人 } public String getHandlerMan() { return "kermit"; } }
3 在activiti的流程定义文件中引用bboss ioc中的组件
3.1 组件作为任务监听器使用
流程定义文件activiti-engine/src/test/resources/org/activiti/examples/bpmn/tasklistener/CustomTaskAssignmentTest.testAssigneeAssignment.bpmn20.xml相关内容:
<activiti:taskListener event="create" delegateExpression="${taskAssigneeAssignment}" />
流程定义文件完整内容如下:
<?xml version="1.0" encoding="UTF-8"?> <definitions id="taskListenerExample" xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" targetNamespace="Examples"> <process id="setAssigneeInListener" name="Custom task assignment Example"> <startEvent id="theStart" /> <sequenceFlow id="flow1" sourceRef="theStart" targetRef="task1" /> <userTask id="task1" name="Schedule meeting" > <documentation> Schedule a meeting with management. </documentation> <extensionElements> <!--<activiti:taskListener event="create" class="org.activiti.examples.bpmn.tasklistener.AssigneeAssignment" /> --> <activiti:taskListener event="create" delegateExpression="${taskAssigneeAssignment}" /> </extensionElements> </userTask> <sequenceFlow id="flow2" sourceRef="task1" targetRef="theEnd" /> <endEvent id="theEnd" /> </process> </definitions>
流程执行示例
测试用例:
activiti-engine/src/test/java/org/activiti/examples/bpmn/tasklistener/CustomTaskAssignmentTest.java
测试方法:
public void testAssigneeAssignment() { //启动流程 runtimeService.startProcessInstanceByKey("setAssigneeInListener"); //通过任务监听器组件taskAssigneeAssignment以下方法指定了流程环节处理人为kermit,所以kermit会有一个待办任务 //public void notify(DelegateTask delegateTask) { // delegateTask.setAssignee("kermit");//设置任务处理人 // } assertNotNull(taskService.createTaskQuery().taskAssignee("kermit").singleResult()); assertEquals(0, taskService.createTaskQuery().taskAssignee("fozzie").count()); assertEquals(0, taskService.createTaskQuery().taskAssignee("gonzo").count()); }
3.2 直接调用组件方法获取任务处理人
流程定义文件activiti-engine/src/test/resources/org/activiti/examples/bpmn/usertask/taskassignee/TaskAssigneeTest.testTaskAssignee.bpmn20.xml相关内容:
<formalExpression>${taskAssigneeAssignment.getHandlerMan()}</formalExpression>
完整流程定义文件:
<?xml version="1.0" encoding="UTF-8"?> <definitions id="taskAssigneeExample" xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" targetNamespace="Examples"> <process id="taskAssigneeExampleProcess" name="Schedule meeting reminder"> <startEvent id="theStart" /> <sequenceFlow id="flow1" sourceRef="theStart" targetRef="theTask" /> <userTask id="theTask" name="Schedule meeting" > <documentation> Schedule an engineering meeting for next week with the new hire. </documentation> <humanPerformer> <resourceAssignmentExpression> <!-- <formalExpression>kermit</formalExpression> --> <formalExpression>${taskAssigneeAssignment.getHandlerMan()}</formalExpression> </resourceAssignmentExpression> </humanPerformer> </userTask> <sequenceFlow id="flow2" sourceRef="theTask" targetRef="theEnd" /> <endEvent id="theEnd" /> </process> </definitions>
流程执行:
测试用例activiti-engine/src/test/java/org/activiti/examples/bpmn/usertask/taskassignee/TaskAssigneeTest.java
测试方法:
public void testTaskAssignee() throws Throwable{ // Start process instance TransactionManager tm = new TransactionManager(); try { tm.begin();//start bboss transaction ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("taskAssigneeExampleProcess"); // Get task list //流程中通过${taskAssigneeAssignment.getHandlerMan()}表达式调用组件方法指定了kermit为任务处理人 List<Task> tasks = taskService .createTaskQuery() .taskAssignee("kermit") .list(); assertEquals(1, tasks.size()); Task myTask = tasks.get(0); assertEquals("Schedule meeting", myTask.getName()); assertEquals("Schedule an engineering meeting for next week with the new hire.", myTask.getDescription()); // Complete task. Process is now finished taskService.complete(myTask.getId()); // assert if the process instance completed assertProcessEnded(processInstance.getId()); //do some bussiness startmeeting(); tm.commit();//commit bboss transaction } catch (Throwable e) { throw e; } finally { tm.release(); } }
测试方法中我们将业务处理和流程的处理包含在bboss的事务上下文件,如果工作流中包含了监听器的执行,那么监听器中的业务处理也会受事务的控制。
4.activiti-bboss eclipse demo工程
为了更好地方便大家使用activiti-bboss的整合版本,特意整理了一个demo工程,工程下载地址:
http://www.bbossgroups.com/file/download.htm?fileName=activiti-bboss-example.zip
工程里面已经根据上文方法做好相关配置
activiti.cfg.xml
beans.xml
poolman.xml
下载解压后将其导入eclipse,修改poolman.xml中的数据库连接地址和账号即可运行demo工程中的测试用例:
/activiti-bboss-example/src/org/frameworkset/activiti/test/SimpleActivitTest.java
用例方法为:
@Test public void runBare() throws Throwable { initializeProcessEngine();// 初始化流程引擎,默认加载activiti.cfg.xml文件 initializeServices();// 初始化流程相关服务 initusers();// 初始化测试用户 String deploymentId = null; try { deploymentId = annotationDeploymentSetUp(processEngine);// 部署测试流程 testAssigneeAssignment();// 执行测试用例 testTaskAssignee();// 执行测试用例 } catch (AssertionFailedError e) { throw e; } catch (Throwable e) { throw e; } finally { annotationDeploymentTearDown(processEngine, deploymentId);// 卸载流程 deleteusers();//清除用户信息 assertAndEnsureCleanDb();// 重置activiti数据库表 ClockUtil.reset(); } }
和本文相关的两个流程的测试方法:
testAssigneeAssignment();// 执行测试用例
testTaskAssignee();// 执行测试用例
bboss开发交流
21220580
bboss微信公众号
评论
2 楼
yin_bp
2012-08-29
做了一些简单的修改,主要是数据源的地方,修改后的工程可以通过以下链接下载:
http://www.bbossgroups.com/file/download.htm?fileName=activiti-engine-bboss.zip
http://www.bbossgroups.com/file/download.htm?fileName=activiti-engine-bboss.zip
1 楼
gmh20052002
2012-08-29
标哥,请问这个集成有没有改动activiti的东西?
发表评论
-
bboss ioc快速入门教程
2017-08-13 11:28 1195bboss是一个非常不错的ioc框架,功能类似于spr ... -
bboss ioc配置文件中使用外部属性文件介绍
2016-09-20 11:35 1062bboss ioc配置文件中使用外部属性文件介绍 与spri ... -
bboss与spring中配置和引用bboss数据源和bboss dao组件方法说明
2016-08-10 16:04 859首先在项目中导入bboss 持久层包: maven坐标 & ... -
bboss ioc提供的组件初始化工具类介绍
2016-03-18 16:17 681bboss ioc提供的组件初始化工具类介绍 bboss i ... -
扩展bboss ioc语法实现自定义的ioc依赖注入功能
2015-01-20 23:08 1255bboss ioc配置语法简洁而严谨,提供了强大的依赖注入功能 ... -
bboss开发、模块工程目录结构及功能说明
2014-10-15 19:46 4704基于bboss开发项目说明 ... -
bboss版activiti 5.12扩展动态
2014-09-20 18:19 5167继扩展Activiti-5.12轻松实 ... -
bboss序列化cglib代理对象方法介绍
2014-06-22 15:14 1085本文介绍bboss序列化cglib代理对象方法。经过cglib ... -
bboss自定义类对象序列化机制介绍
2014-05-26 23:32 1384bboss自定义类对象序列 ... -
bboss将一个组件同时发布为webservice,hessian,http三种服务方法介绍
2014-04-12 14:31 1600bboss将一个组件同时发布为webservice,hessi ... -
bboss发布apache cxf 2.7.6服务和定义客户端服务实例可能产生冲突解决办法
2014-03-22 23:16 1026bboss发布apache cxf 2.7.6服务和定义客户端 ... -
扩展Activiti 5.12轻松搞定流程实例跟随流程版本一起升级
2013-06-24 12:59 4773扩展Activiti 5.12轻松搞定流程实例跟随流程版本一起 ... -
扩展Activiti-5.12轻松实现流程节点间自由跳转和任意驳回/撤回
2013-05-28 01:33 17811由于项目需要,最近对开源工作流引擎Activiti-5.12的 ... -
bboss离线开发文档下载
2013-05-14 18:08 1777bboss离线开发文档下载 为了便于bboss开发人员离线查找 ... -
bboss 发布和使用hessian服务方法介绍
2013-02-25 23:21 1985hessian是一款性能非常不错的RPC通讯组件,最近抽空将b ... -
bboss quartz组件全攻略
2013-01-27 13:31 2472bboss quartz组件全攻略 本 ... -
bboss aop拦截器使用简介
2012-11-29 23:20 1142bboss aop拦截器使用简介, ... -
bboss持久层事务管理组件TransactionManager增加两个release方法
2012-08-25 11:56 1459bboss持久层事务管理组件TransactionManage ... -
bboss ioc容器之间组件引用方法简介
2012-08-04 15:09 1216bboss ioc容器之间组件引用方法简介。我们可以在ioc容 ... -
Rest协议框架-bboss rpc
2012-08-03 12:51 1259restful风格rpc服务协议rest,定义的语法如下: ...
相关推荐
资料-最新工作流引擎Activiti7基础与进阶
工作流引擎Activiti的介绍和简单的例子
工作流引擎Activiti是开源的工作流引擎,这是一份简单的使用总结,希望对大家有用。
开源activiti开发,学习idea下开发工作流引擎。代码全
Activiti 是目前使用最为常用的工作流引擎,工作流业务在企业中应用非常广泛,目前企业中多使用Activiti6版本,Activiti7是目前的最新版本。Activiti7不但提高的工作流引擎的效率,提供了新封装的新API,还提供了和...
Activiti将提供宽松的Apache许可2.0,以便这个项目可以广泛被使用,同时促进Activiti BPM引擎和的BPMN 2.0的匹配,该项目现正由OMG通过标准审定。 加入Alfresco Activiti项目的是VMware的SpringSource分支,...
Activiti7工作流引擎教学视频 springboot-activiti是一个SpringBoot集成activiti实现在创建、部署流程、复制流程、删除流程以及流程规则配置,实现工单流程工作流流转和业务处理
开源工作流ACTIVITI使用手册,快速学习activiti.
(Activiti6.0集成springboot工作流引擎模板代码)Activiti6.0工作流引擎介绍与总结,工作流简介、流程体验、 Activiti与spring集成
工作流引擎Activiti预研报告,包含介绍,优缺点, 可行性分析
现在是我工作的第二家公司,因为要开发ERP、OA等系统需要使用工作流,在项目调研阶段我先搜索资料选择使用哪个开源工作流引擎,最终确定了Activiti5并基于公司的架构做了一些DEMO。对于Activiti、jBPM4、jBPM5我们...
最新工作流引擎Activiti7基础与进阶day01
最新工作流引擎Activiti7基础与进阶day04
最新工作流引擎Activiti7基础与进阶day02
最新工作流引擎Activiti7基础与进阶day03
最新工作流引擎Activiti7基础与进阶day05
前后端分离项目中引入activiti工作流引擎步骤
Activiti工作流示例ActivitiDemo 本示例带有全部源码,详细使用Canvas动画演示了Activiti工作流引擎的使用。非常实用,非常先进和完整。希望您会喜欢。
activiti-5.15开源工作流 官方安装包
3、已经对该流程引擎的activiti-engine-7.1.0.M3.1.jar进行了源码修改,下载直接使用即可,同时支持达梦数据库服务器多个数据库实例的场景,网上大多修改的方法只适合单个数据库实例(多个数据库实例下流程引擎的数据...