工作流引擎Activiti使用进阶!详细解析工作流框架中高级功能的使用示例 (3)

假设不需要全部的任务数据,只需要其中的一小部分.可以使用Mapper实现:

public interface MyTestMapper { @Select("SELECT ID_ as id, NAME_ as name, CREATE_TIME_ as createTime FROM ACT_RU_TASK") List<Map<String, Object>> selectTasks(); }

Mapper需要设置到流程引擎配置中:

... <property> <set> <value>org.activiti.standalone.cfg.MyTestMapper</value> </set> </property> ...

这个Mapper是一个接口:

MyBatis框架会在运行阶段为这个接口创建一个实例

返回值是没有类型的,是一个map的list,和对应的行列对应

如果需要也可以使用MyBatis映射

执行上面的查询:

可以使用managementService.executeCustomSql方法

这个方法需要一个CustomSqlExecution实体

这个实体类是一个封装类,隐藏了引擎的内部实现所需执行的信息

但是由于Java泛型,查询返回的结果可读性差

示例:

mapper类和返回类型类

简单调用mapper方法 并返回结果

CustomSqlExecution<MyTestMapper, List<Map<String, Object>>> customSqlExecution = new AbstractCustomSqlExecution<MyTestMapper, List<Map<String, Object>>>(MyTestMapper.class) { public List<Map<String, Object>> execute(MyTestMapper customMapper) { return customMapper.selectTasks(); } }; List<Map<String, Object>> results = managementService.executeCustomSql(customSqlExecution);

list中的Map只包含id,name和create time, 不是全部的任务对象

可以通过这样的方式执行任意SQL:

@Select({ "SELECT task.ID_ as taskId, variable.LONG_ as variableValue FROM ACT_RU_VARIABLE variable", "inner join ACT_RU_TASK task on variable.TASK_ID_ = task.ID_", "where variable.NAME_ = #{variableName}" }) List<Map<String, Object>> selectTaskWithSpecificVariable(String variableName);

使用这种方法,任务表会与变量表关联.只会获得对应名称的变量,任务Id和对应的数值会被返回

使用ProcessEngineConfigurator实现流程引擎配置

可以使用ProcessEngineConfigurator实现一种高级的扩展流程引擎的配置:

创建一个org.activiti.engine.cfg.ProcessEngineConfigurator接口的实现

注入到流程引擎配置里

<bean> ... <property> <list> <bean> ... </bean> </list> </property> ... </bean>

实现ProcessEngineConfigurator接口需要实现两个方法:

configure: 将ProcessEngineConfiguration作为参数,可以通过这种方法添加自定义配置,这个方法在流程创建之前,在所有默认配置执行之前保证调用到

getPriority: 如果一些configurator存在依赖项的时候,允许对configurator进行排序

configurator实例:

LDAP集成:

这个configurator用来替换默认的usergroup管理器类,使用处理LDAP用户存储的类

基本上一个configurator允许很大程度上修改或增强流程引擎,对高级的场景非常有用

使用自定义的版本替换流程定义缓存, 如下:

public class ProcessDefinitionCacheConfigurator extends AbstractProcessEngineConfigurator { public void configure(ProcessEngineConfigurationImpl processEngineConfiguration) { MyCache myCache = new MyCache(); processEngineConfiguration.setProcessDefinitionCache(enterpriseProcessDefinitionCache); } }

流程引擎配置器也可以通过ServiceLoader自动从classpath中加载:

放在jar中的configurator实现必须放在classpath

并在jarMETA-INF/services目录下包含一个org.activiti.engine.cfg.ProcessEngineConfigurator文件

文件的内容是自定义实现的全类名

当流程引擎启动时,日志会显示找到了哪些configurator

INFO org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl - Found 1 auto-discoverable Process Engine Configurators INFO org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl - Found 1 Process Engine Configurators in total: INFO org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl - class org.activiti.MyCustomConfigurator

这种ServiceLoader的方式在某些环境下可能无法正常运行.使用ProcessEngineConfigurationenableConfiguratorServiceLoader属性来禁用这个功能,这个属性的默认值为true

启动安全BPMN 2.0xml

大多数情况下,BPMN 2.0流程发布到Activiti引擎是在严格的控制下的

然而在某些情况下,可能需要把比较随意的BPMN 2.0 xml上传到引擎,这时就要要考虑恶意用户会攻击服务器

为了避免BPMN 2.0xml引擎服务器受到攻击,可以在引擎中设置enableSafeBpmnXml:

<property value="true"/>

默认这个功能没有开启.因为这个功能需要使用StaxSource

由于JDK6,JBoss使用的是旧版的xml解析实现,无法使用StaxSource类,所以不能启用安全的BPMN 2.0xml

如果Activiti运行的平台支持安全的BPMN 2.0xml功能,建议打开

事件日志

在Activiti 5.16版本中,添加了事件日志机制:

这种日志机制构建在通用目的下的Activiti引擎的事件机制,默认是禁用的

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyjzwy.html