假设不需要全部的任务数据,只需要其中的一小部分.可以使用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用来替换默认的user和group管理器类,使用处理LDAP用户存储的类
基本上一个configurator允许很大程度上修改或增强流程引擎,对高级的场景非常有用
使用自定义的版本替换流程定义缓存, 如下:
public class ProcessDefinitionCacheConfigurator extends AbstractProcessEngineConfigurator { public void configure(ProcessEngineConfigurationImpl processEngineConfiguration) { MyCache myCache = new MyCache(); processEngineConfiguration.setProcessDefinitionCache(enterpriseProcessDefinitionCache); } }流程引擎配置器也可以通过ServiceLoader自动从classpath中加载:
放在jar中的configurator实现必须放在classpath下
并在jar的META-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的方式在某些环境下可能无法正常运行.使用ProcessEngineConfiguration的enableConfiguratorServiceLoader属性来禁用这个功能,这个属性的默认值为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引擎的事件机制,默认是禁用的