德玛西亚之WorkFlow(三)流程引擎配置与服务组件
德玛西亚之WorkFlow(三)流程引擎配置与服务组件
1 配置文件
1.1 默认配置文件
工作流引擎默认会加载ClassPath路径下的 activiti.cfg.xml 文件。这样并不实用使用 spring 容器的配置。最简单的方式生成 ProcessEngine 就是使用 org.activiti.engine.ProcessEngines 生成:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine()
这将在ClassPaht 下查找 activiti.cfg.xml , 并根据该文件的配置构造引擎。
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"><property name="jdbcUrl" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000" /><property name="jdbcDriver" value="org.h2.Driver" /><property name="jdbcUsername" value="sa" /><property name="jdbcPassword" value="" /><property name="databaseSchemaUpdate" value="true" /><property name="asyncExecutorActivate" value="false" /><property name="mailServerHost" value="mail.my-corp.com" /><property name="mailServerPort" value="5025" /></bean>
</beans>
请注意,配置XML实际上是一个Spring配置。**这并不意味着Activiti只能在Spring环境中使用!**我们只是在内部利用Spring的解析和依赖注入功能来构建引擎。
ProcessEngineConfiguration对象也可以使用配置文件以编程方式创建。也可以使用不同的bean id。
ProcessEngineConfiguration.createProcessEngineConfigurationFromResourceDefault();
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(String resource);
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(String resource, String beanName);
ProcessEngineConfiguration.createProcessEngineConfigurationFromInputStream(InputStream inputStream);
ProcessEngineConfiguration.createProcessEngineConfigurationFromInputStream(InputStream inputStream, String beanName);
也可以不使用配置文件,并根据默认值创建配置。
ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration();
如果需要,所有这些ProcessEngineConfiguration.createXXX()
方法都返回ProcessEngineConfiguration
可以进一步调整的方法。调用buildProcessEngine()
操作后,ProcessEngine
创建一个:
ProcessEngine processEngine = ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration().setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE).setJdbcUrl("jdbc:h2:mem:my-own-db;DB_CLOSE_DELAY=1000").setAsyncExecutorActivate(false).buildProcessEngine();
1.2 ProcessEngineConfiguration bean
在activiti.cfg.xml
必须包含有ID的Bean 'processEngineConfiguration'
。
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
然后使用这个bean来构造ProcessEngine
。有多个类可用于定义processEngineConfiguration
。这些类表示不同的环境,并相应地设置默认值。选择匹配(最多)环境的类是最佳实践,以最小化配置引擎所需的属性数。目前可以使用以下类(将来的版本中将会有更多类):
- org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration:流程引擎以独立方式使用。Activiti将负责交易。默认情况下,仅在引擎引导时检查数据库(如果没有Activiti架构或架构版本不正确,则抛出异常)。
- org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration:这是一个用于单元测试的便利类。Activiti将负责交易。默认情况下使用H2内存数据库。引擎启动和关闭时将创建和删除数据库。使用此功能时,可能不需要其他配置(例如,使用作业执行程序或邮件功能时除外)。
- org.activiti.spring.SpringProcessEngineConfiguration:在Spring环境中使用流程引擎时使用。有关更多信息,请参阅Spring集成部分。
- org.activiti.engine.impl.cfg.JtaProcessEngineConfiguration:在引擎以独立模式运行时使用JTA事务。
1.3 数据库配置
有两种方法可以配置Activiti引擎将使用的数据库。第一个选项是定义数据库的JDBC属性:
- jdbcUrl:数据库的JDBC URL。
- jdbcDriver:实现特定数据库类型的驱动程序。
- jdbcUsername:用于连接数据库的用户名。
- jdbcPassword:连接数据库的密码。
基于提供的JDBC属性构造的数据源将具有默认的MyBatis连接池设置。可以选择设置以下属性来调整该连接池(取自MyBatis文档):
- jdbcMaxActiveConnections:任何时候连接池最多可以包含的活动连接数。默认值为10。
- jdbcMaxIdleConnections:任何时候连接池最多可以包含的空闲连接数。
- jdbcMaxCheckoutTime:在强制返回连接之前,可以从连接池中检出连接的时间量(以毫秒为单位)。默认值为20000(20秒)。
- jdbcMaxWaitTime:这是一个低级别设置,它为池提供了一个机会来打印日志状态,并在它花费异常时间的情况下重新尝试获取连接(以避免在池配置错误时永远无声地失败)默认值是20000(20秒)。
示例数据库配置:
<property name="jdbcUrl" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000" />
<property name="jdbcDriver" value="org.h2.Driver" />
<property name="jdbcUsername" value="sa" />
<property name="jdbcPassword" value="" />
使用数据库连接池(例如DBCP,C3P0,Hikari,Tomcat连接池等):
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" ><property name="driverClassName" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql://localhost:3306/activiti" /><property name="username" value="activiti" /><property name="password" value="activiti" /><property name="defaultAutoCommit" value="false" />
</bean>
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"><property name="dataSource" ref="dataSource" />...
请注意,Activiti不附带允许定义此类数据源的库。所以你必须确保库在你的类路径上。
无论您使用的是JDBC还是数据源方法,都可以设置以下属性:
- databaseType:通常不需要指定此属性,因为它是从数据库连接元数据中自动分析的。只应在自动检测失败的情况下指定。可能的值:{h2,mysql,oracle,postgres,mssql,db2}。此设置将确定将使用哪些创建/删除脚本和查询。请参阅该支持的数据库部分用于哪些类型支持的概述。
- databaseSchemaUpdate:允许设置策略以在流程引擎启动和关闭时处理数据库模式。
false
(默认值):在创建流程引擎时检查库模式的版本,如果版本不匹配则抛出异常。true
:构建流程引擎时,将执行检查,并在必要时执行架构更新。如果架构不存在,则创建它。create-drop
:在创建流程引擎时创建架构,并在关闭流程引擎时删除架构。
其他属性的配置
除前面介绍的属性外, Activiti 还提供了其他的属性配置,这些属性包括邮件服务、 历史数据配置、任务调度器等 对于某些属性,使用者可以不进行指定,使用 Activiti 提供的默认值即可,但是如果需要定制更个性化的流程引擎,还是需要知道这些属性的作用
history 配置
在流程执行的过程中,会产生一些流程相关的数据,例如流程实例、流程任务和流程参数等,随着流程的进行与结束,这些数据将会被从流程数据表中删除,为了能保存这些数据,Activiti 提供了历史数据表,可以将这些数据保存到历史数据表中。对于这些历史数据,保存到何种粒度, Activiti 提供了 history 属性对其进行配置 hi即可属性有点像 log4j 的日志输出级别,该属性有以下四个值
none 不保存任何的历史数据 因此,在流程执行过程中,这是最高效的
activity 级别高于 none ,保存流程实例与流程行为,其他数据不保存
audit: activity 级别会保存的数据外,还会保存全部的流程任务及其属性数据 audit 为 history 的默认值。
full :保存历史数据的最高级别,除了会保存 audit 级别的数据外,还会保存其他全部
流程相关的细节数据,包括 些流程参数等。
asyncExecutorActivate 配置
as cExecutorActivate 属性主要用于配置异步执行器是否启动, true 则表示 Activiti 在创建
流程引擎时,需要启动异步执行器,该属性默认值为也lse 。异步执行器启动后,会启动定时
器扫描并执行各种工作,如果查找到符合执行条件的工作,则会启动 条线程并交由线程池去
执行。
邮件服务器配置
Activiti 支持邮件服务,当流程执行到某一个节点时, Activiti 会根据流程文件配置 (EmailTask) ,发送邮件到相应的邮箱 以下为 ProcessEngineConfiguration 中提供的邮件服务器配置项。
- mailServerHost:邮件服务器地址,非必填,默认值为 localhost。
- mailServerHost : SMTP 发送邮件服务器端口,默认值为 250
- mailServerDefaultFrom :非必填,发送人的邮箱地址,默认值为 activiti@activiti.org。
- mailServerUsemame :邮箱登录用户名。
- mailServerPassword :邮箱登录密码。
- mailServerUseSSL :是否使用 SSL 协议通信,默认为 false。
- mailServerUseTLS :是否使用 TLS 协议通信,默认为 false。
1.4 支持的数据库
下面列出了Activiti用于引用数据库的类型(区分大小写!)。
Activiti database type | Example JDBC URL | Notes |
---|---|---|
h2 | jdbc:h2:tcp://localhost/activiti | Default configured database |
mysql | jdbc:mysql://localhost:3306/activiti?autoReconnect=true | Tested using mysql-connector-java database driver |
oracle | jdbc:oracle:thin:@localhost:1521:xe | |
postgres | jdbc:postgresql://localhost:5432/activiti | |
db2 | jdbc:db2://localhost:50000/activiti | |
mssql | jdbc:sqlserver://localhost:1433;databaseName=activiti (jdbc.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver) OR jdbc:jtds:sqlserver://localhost:1433/activiti (jdbc.driver=net.sourceforge.jtds.jdbc.Driver) | Tested using Microsoft JDBC Driver 4.0 (sqljdbc4.jar) and JTDS Driver |
1.5 Spring 集成
虽然你绝对可以使用没有Spring的Activiti,但我们提供了一些非常好的集成功能。
1.5.1 ProcessEngineFactoryBean
该ProcessEngine
可配置为一个普通的Spring bean。集成的起点是类org.activiti.spring.ProcessEngineFactoryBean
。该bean采用流程引擎配置并创建流程引擎。这意味着Spring的属性的创建和配置与配置部分中记录的相同。对于Spring集成,配置和引擎bean将如下所示:
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">...
</bean><bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean"><property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>
请注意,processEngineConfiguration
bean现在使用org.activiti.spring.SpringProcessEngineConfiguration
该类。
1.5.2 Transactions (事务)
我们将逐步解释在Spring分发示例中找到的SpringTransactionIntegration测试。下面是我们在本例中使用的Spring配置文件(您可以在SpringTransactionIntegrationTest Context.xml中找到它)。下面显示的部分包含数据源、TransactionManager、ProcessEngine和Activiti引擎服务。
当将数据源传递给SpringProcessEngineConfiguration(使用属性“datasource”)时,Activiti在内部使用org.springframework.jdbc.datasource.TransactionAwaredataSourceCroxy,它包装传递的数据源。这样做是为了确保从数据源和Spring事务中检索到的SQL连接能够良好地协同工作。这意味着,在Spring配置中不再需要自己代理数据源,尽管它仍然允许将TransactionWaredataSource代理传递到SpringProcessEngineConfiguration中。在这种情况下,不会发生额外的包装。
确保在自己在Spring配置中声明TransactionWaredataSourceCroxy时,不会将其用于已经知道Spring事务的资源(例如,DataSourceTransactionManager和JPatransactionManager需要未代理的数据源)。
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"><bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource"><property name="driverClass" value="org.h2.Driver" /><property name="url" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000" /><property name="username" value="sa" /><property name="password" value="" /></bean><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></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="asyncExecutorActivate" value="false" /></bean><bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean"><property name="processEngineConfiguration" ref="processEngineConfiguration" /></bean><bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" /><bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService" /><bean id="taskService" factory-bean="processEngine" factory-method="getTaskService" /><bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService" /><bean id="managementService" factory-bean="processEngine" factory-method="getManagementService" />...
这个Spring配置文件的其余部分包含了bean和我们将在这个特定示例中使用的配置:
<beans>...<tx:annotation-driven transaction-manager="transactionManager"/><bean id="userBean" class="org.activiti.spring.test.UserBean"><property name="runtimeService" ref="runtimeService" /></bean><bean id="printer" class="org.activiti.spring.test.Printer" /></beans>
2 服务组件
RepositoryService:提供一系列管理流程定义和流程部署的API。
RuntimeService:在流程运行时对流程实例进行管理与控制。
TaskService:对流程任务进行管理,例如任务提醒、任务完成和创建任务分本任务等。
IdentityService:提供对流程角色数据进行管理的API,这些角色数据包括用户组、用户以及它们之间的关系。
ManagementService:提供对流程引擎进行管理和维护的服务。
HistoryService:对流程的历史数据进行操作,包括查询、删除这些历史数据。
DynamicBpmnService:使用该服务,可以不需要重新部署流程模型,就可以实现对流程模型的部分修改。
爷儿您要是看的乐,打个赏也让姑娘乐一乐
德玛西亚之WorkFlow(三)流程引擎配置与服务组件相关推荐
- 德玛西亚之WorkFlow(五)流程引擎创建
德玛西亚之WorkFlow(五)流程引擎创建 在之前了解了 Activiti 的配置和数据库各个表的功能含义.现在我们需要根据这些配置生成工作流引擎.Activiti 提供了多种创建流程引擎的方式供研 ...
- 德玛西亚之WorkFlow(七)流程的发布与定义
德玛西亚之WorkFlow(七)流程的发布与定义 流程的存储和部署主要涉及的服务组件是RepositoryService.RepositoryService 主要用于对 Activiti 中的流程存储 ...
- 德玛西亚之WorkFlow(四)数据库设计
德玛西亚之WorkFlow(四)数据库设计 在流程的产生.执行及结束等周期,都会产生各种与流程相关的数据, Activiti 提供了一整套数据表来保存这些数据. Activiti 流程引擎的数据表分 ...
- 德玛西亚之WorkFlow(二)程序演示
德玛西亚之WorkFlow(二)程序演示 1 程序的基本配置 1.1 maven依赖的配置 <properties><project.build.sourceEncoding> ...
- 德玛西亚之WorkFlow(一)工作流介绍
德玛西亚之WorkFlow(一)工作流介绍 1 什么是工作流 工作流(WorkFlow),就是将一项多人或者多任务的工作按照固定的顺序进行逐项操作,直至此工作结束.举个简单的例子:多个人协同做饭,首先 ...
- 德玛西亚之WorkFlow(六)用户与用户组
德玛西亚之WorkFlow(六)用户与用户组 1 用户组的操作 public void createGroup() {Group newGroup1 = identityService.newGrou ...
- [NC15034]德玛西亚万岁
状压dp 第一次写状压dp的题目,可能是因为这种类型的比较难吧,所以是第一次做到. 题解: 我们可以用二进制来描述方格,1表示有德玛西亚,0表示没有. 样例1中第一行的三个方格都可以站人 一共有五种情 ...
- 牛客每日练习----德玛西亚万岁,求最值,小牛再战
我喜欢给自己压力,必须得定一个很高的目标,逼自己朝着这个目标前进,不管会不会实现,都是一个动力. ----喻言 链接:http ...
- 德玛西亚服务器维护,德玛西亚大区被玩家吐槽是最贵的服务器,游戏体验没法玩!...
原标题:德玛西亚大区被玩家吐槽是最贵的服务器,游戏体验没法玩! 大家好,我是你们的租号玩小姐姐! 在英雄联盟刚开始的时候,整个游戏还只有三个大区,电一艾欧尼亚.网一比尔吉沃特和网二德玛西亚.一直都有北 ...
最新文章
- HTML5培训教程:HTML5基础介绍
- CRM User Status profile中Business Transaction字段的用途 1
- 【五线谱】变音记号 ( 升号 # | 降号 b | 重升号 x | 重降号 bb )
- HashSet/HashMap 存取值的过程
- 大约C++ const 全面总结
- linux使用root操作文件,以root用户登录Linux系统,当前目录是/root,要求完成如下操作和功...
- java 悬浮提示框_表格(悬浮框提示)
- 前端:实现div等块元素添加X轴滚动显示(Y轴不滚动)
- Spring Cloud源码分析(四)Zuul:核心过滤器
- 华为彭松:基于C.A.F模型构建联接竞争力,创造新增长
- HEVC码流简单分析
- 您觉得目前网页最小字体应该多大呢?
- Android Activity生命周期以及LoCat的使用
- win10系统鼠标右键一直转圈的两种解决方法
- 计算机基础:13、计算机CPU--运算器
- 解决IDEA输入ctrl+空格,和输入法冲突的问题
- nginx openresty waf动态黑名单 白名单 、centos 、windows下部署
- ECL、LVDS和CML电平
- 扩充虚拟机文件系统的磁盘空间
- threeJS中4*4矩阵实现平移和旋转的原理
热门文章
- 用户态的内存泄漏定位,memwatch的使用
- 王者客服信息服务器,王者荣耀客服反馈在哪 王者荣耀客服反馈入口位置介绍...
- 出行大数据绘制的“城市星云图”是怎样的?我们还总结出了5种城市结构
- 别好奇了,excel 绘制闪到发光的三维地图真的很简单!
- html跳转代码 搜索引擎,HTML JS跳转代码:蜘蛛正常访问 用户访问直接跳转
- 免费微信多开软件(PC端) 微博领会员一个月
- 分享53戏源代码总有一个是你想要的(亲测每一个均可用)
- 走马灯 (滚动字幕效果)
- creator发布oppo小游戏
- 纯软件公司的先驱 甲骨文公司(一)——硅谷老兵新传