谈谈Activiti的引擎与引擎配置对象

标签: activiti 引擎 引擎 | 发表时间:2013-04-19 15:00 | 作者:
出处:http://www.kafeitu.me/

1. 引擎配置对象ProcessEngineConfiguration

引擎配置是配置Activiti的第一步,无论你使用Standalone还是Spring管理引擎都可以在配置文件中配置参数,虽然目前Activiti支持多种引擎配置对象,但是均继承自一个基础的配置对象(抽象类) org.activiti.engine.ProcessEngineConfiguration

除了基础的引擎配置对象之外还有一下几个具体的实现,不同的场合使用不用的引擎实现,均继承自 org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl

  1. StandaloneProcessEngineConfiguration:标准的单机引擎配置对象,默认读取activiti.cfg.xml文件的配置
  2. StandaloneInMemProcessEngineConfiguration:用于测试环境,jdbcUrl配置为jdbc:h2:mem:activiti,数据库的DDL操作配置:create-drop,在日常的快速测试中经常用到
  3. JtaProcessEngineConfiguration:顾名思义,支持JTA
  4. SpringProcessEngineConfiguration:这个恐怕是用的最多的一个,由Spring代理创建引擎,最最重要的是如果把引擎嵌入到业务系统中可以做到业务事务与引擎事务的统一管理

至于引擎中可以配置哪些属性在手册里面已经介绍了一部分,还有一部分隐藏的属性未介绍,如果有需要可以查看每个引擎中的 setter方法覆盖默认值。

2.配置引擎的别名以及获取引擎对象

Activiti允许创建多个引擎,每个引擎用别名区分,可以在引擎配置对象中设置一下属性,默认的引擎别名为: default

2.1 标准方式


其中的 myProcessEngine即为引擎的别名,当需要获取引擎对象时可以通过下面的代码获取:

ProcessEngine myProcessEngine = ProcessEngines.getProcessEngine("myProcessEngine");

当然如果只有一个引擎获取就更简单了,下面的代码可以直接获取一个默认的引擎对象。

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 等价于 ProcessEngines.getProcessEngine("default");

2.2 Spring方式

如果使用了Spring代理引擎可以使用“Spring”风格方式获取引擎对象,例如下面的配置:


    
    
    
    
    ...

@Controller
@RequestMapping(value = "/workflow")
public class ActivitiController {
    @Autowired
    ProcessEngineFactoryBean processEngineFactoryBean;
    
    @RequestMapping(value = "/print")
    public ModelAndView processList(HttpServletRequest request) {
        ProcessEngine processEngine = processEngineFactoryBean.getObject();
    }
}

2.3 在引擎外部设置引擎配置对象

或许这个小节的标题看不懂了。。。

原因是这样的,众所周知,在默认的配置情况下部署包含中文的流程文件会导致中文乱码(Linux、Windows,Mac平台没问题),所以需要覆盖引擎默认的字体配置属性(活动的字体与输出流文字字体),例如下面的配置:


    
    
    ...

字体名称根据平台的不同其值也不同,例如在Windows平台下可以使用诸如 宋体微软雅黑等,但是在Linux平台下引擎没有这些字体(或者名称不同)需要特殊设置,kft-activiti-demo的在线demo部署在Ubuntu Server上,而且是纯英文系统没有中文字体,为了解决部署后以及流程跟踪时的中文乱码问题我从Windows平台复制了宋体字体文件解决,字体的文件名为 simsun.ttc,使用的配置如下所示:


    
    
    ...

这样就解决了部署流程时的中文乱码问题,但是没有解决流程跟踪时的乱码问题。。。

原因在于流程图生成工具类 ProcessDiagramGenerator会从当前的ThreadLocal中获取引擎配置对象,但是目前仅仅是引擎自动在内部实现时把引擎配置对象设置到ThreadLocal中,所以很多人遇到在Struts(2)或者Spring MVC中直接调用下面的代码得到的图片是乱码:

InputStream imageStream = ProcessDiagramGenerator.generateDiagram(bpmnModel, "png", activeActivityIds);

既然知道引擎从ThreadLocal中获取引擎配置对象,而且我们已经获取了引擎对象(也就是说可以从中获取引擎配置对象),解决问题的办法很简单,手动把引擎配置对象设置到ThreadLocal中就解决问题了;下面的代码在kft-activiti-demo的ActivitiController类中。

@RequestMapping(value = "/process/trace/auto/{executionId}")
public void readResource(@PathVariable("executionId") String executionId, HttpServletResponse response)
throws Exception {
  ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
  .processInstanceId(executionId).singleResult();
  BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());
  List activeActivityIds = runtimeService.getActiveActivityIds(executionId);
  // 不使用spring请使用下面的两行代码
  //    ProcessEngineImpl defaultProcessEngine = (ProcessEngineImpl) ProcessEngines.getDefaultProcessEngine();
  //    Context.setProcessEngineConfiguration(defaultProcessEngine.getProcessEngineConfiguration());
  // 使用spring注入引擎请使用下面的这行代码
  Context.setProcessEngineConfiguration(processEngine.getProcessEngineConfiguration());

  InputStream imageStream = ProcessDiagramGenerator.generateDiagram(bpmnModel, "png", activeActivityIds);

  // 输出资源内容到相应对象
  byte[] b = new byte[1024];
  int len;
  while ((len = imageStream.read(b, 0, 1024)) != -1) {
    response.getOutputStream().write(b, 0, len);
  }
}

关键就在于在调用生成流程图的方法之前调用一次Context.setProcessEngineConfiguration()方法即可,这样引擎就可以获取到引擎配置对象,从而获取到自定义的字体名称属性,乱码问题自然没有了。

3. 结束语

本文大概介绍了一下引擎配置对象以及如何获取引擎对象,并且就大家关注最多的中文乱码问题给出了完美解决办法,想了解引擎配置对象的本文可以作为一个引子,打开你探索引擎内部的大门;里面有很多属性都可以配置,花点时间研究会有意外收获,引擎的架构做的很棒,想玩转它就多花点时间探索它的奥秘,通过引擎配置对象可以打造完全定制化的引擎工作方式。

转载自:

相关 [activiti 引擎 引擎] 推荐:

activiti工作流引擎思想探究

- - 开源软件 - ITeye博客
       研究activiti有一阵了,逐渐了解了开源activiti的相关api,但对期中的processinstanceId,executeId,taskId相关应用还是有些模糊,得益于activiti开源技术推广者临远同志的启发,明白了很多工作流引擎的核心思想源自佩特里网(英语:Petri net),采用token机制来执行流程.

Activiti - 新一代的开源 BPM 引擎

- - Web前端 - ITeye博客
Activiti 其核心是 BPMN 2.0 的流程引擎. BPMN 是目前被各 BPM 厂商广泛接受的 BPM 标准,全称为 Business Process Model and Notation,由 OMG 组织进行维护,2011 年 1 月份发布了其 2.0 的正式版. BPMN 2.0 对比于第一个版本,其最重要的变化在于其定义了流程的元模型和执行语义,即它自己解决了存储、交换和执行的问题.

谈谈Activiti的引擎与引擎配置对象

- - 咖啡兔
引擎配置对象ProcessEngineConfiguration. 引擎配置是配置Activiti的第一步,无论你使用Standalone还是Spring管理引擎都可以在配置文件中配置参数,虽然目前Activiti支持多种引擎配置对象,但是均继承自一个基础的配置对象(抽象类) org.activiti.engine.ProcessEngineConfiguration.

JS游戏引擎

- 米随随 - HTML5研究小组
If you don’t have anything better to do and want to help fellow redditors interested in JS game dev out, feel free to fork the list and modify it as you like.

mysql 引擎优化

- - CSDN博客推荐文章
MySQL数 据库引擎取决于MySQL在安装的时候是如何被编译的. 要添加一个新的引擎,就必须重新编译MYSQL. 在缺省情况下,MYSQL支持三个引擎:ISAM、MYISAM和HEAP. 另外两种类型INNODB和BERKLEY(BDB),也常常可以使用. 如果技术高超,还可以使用MySQL++ API自己做一个引擎.

谈流程引擎

- - 人月神话的BLOG
在分布式的架构中,流程引擎和权限引擎也不适合分离构建,两者之间的耦合度相当高,一个好的流程引擎首先要依赖于一个完善的权限模型和架构,其中包括了细粒度的数据权限控制等. 流程引擎中会产生动态权限控制,动态权限和静态权限的区别是静态权限是固定的,而动态权限是跟随流程节点的执行动态变化的,如当你处理到某个流程节点的时候,你对某个工单有查看权限,但是一旦审核或处理完成后,即权限自动回收.

Mysql Innodb 引擎优化

- 彦强 - 阿辉的空间
作/译者:吴炳锡,来源:http://imysql.cn/ & http://www.mysqlsupport.cn 转载请注明作/译者和出处,并且不能用于商业用途,违者必究. InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎. InnoDB锁定在行级并且也在SELECT语句提供 一个Oracle风格一致的非锁定读.

Zend引擎的优化

- Angus - 风雪之隅
作者: Laruence(. 本文地址: http://www.laruence.com/2011/07/14/2115.html. 在PHP 5.4的更新list上, 有一句: 提升了Zend引擎的性能, 减少了内存占用.. 那么, 到底是怎么提升的呢?. 避免不必要的Hashtable. 我们知道在PHP中, 类的属性/静态属性/常量, 都是保存在Hashtable中的, 而在以前, 即使一个类没有申明属性/静态属性/常量, Zend引擎也会为他们分配Hashtable..

JS游戏引擎列表

- sku - 酷壳 - CoolShell.cn
这里有一个网址收集了关于JS游戏引擎开发库的一个列表,转过来. 关于使用JS和HTML5做的一些小游戏,可参见《HTML5 小游戏展示》. Name Latest Release License Type Notes The Render Engine 1.5.3 MIT 跨浏览器; 大规模 API; 开源. 2 gameQuery 0.5.1 CC BY-SA 2.5 和 jQuery 一起使用 gTile 0.0.1 Tile based.

uSniff:BT种子搜索引擎

- leqoqo - 软件志
一、uSniff相关信息: 1、官方主页:http://www.usniff.com/ 2、简介:uSniff是一个BT种子搜索引擎,简单、易用、实时是其最大的优点,其搜索引擎数据库包含了17个知名种子站点的种子信息,目的是想发展成为世界上最大的BT种子搜索引擎,而且对于每个种子,该搜索引擎都会进行安全认证,以保证用户的正常使用.