Activiti是一款非常优秀的工作流引擎,主要作者是曾经开发JBPM的作者,因为JBPM存在很严重的版本不兼容的问题,所以有些项目已经开始转向用Activiti来开发了,我最近也在学习Activiti。Activiti目前最新的版本是5.9,本次学习的也是这一个版本,下载地址为:http:///download.html。学习的主要方式就是查看官方文档,将下载好的 activiti-5.9.zip解压并进入docs/userguide/index.html然后开始查看该官方文档。 下面是我翻译的官方文档的目录:
Activiti 5.9用户指南 目录 1. 介绍 许可证 下载 源码 所需软件 JDK 5+ Ant 1.8.1+ Eclipse 3.6.2 报告问题 实验性功能 内部实现类 2. 入门 一分钟版本 Demo安装 工作区中的示例工程 依赖库 Eclipse安装 检查数据库 数据库表名解释 3. 配置 创建一个ProcessEngine(流程引擎) ProcessEngineConfiguration(流程引擎配置) bean 数据库配置 作业执行者激活 邮件服务器配置 历史配置 暴露在表达式和脚本中的配置Bean 支持的数据库 创建数据库表 数据库升级 4. Spring集成 ProcessEngineFactoryBean(流程引擎工厂Bean) Transactions(事务) 表达式 自动资源调配 单元测试 5. API 引擎API 例外策略 单元测试 调试单元测试 在Web应用程序的流程引擎 流程虚拟机的API 表达式 6. 部署 业务档案 编程方式的部署 采用ant部署 使用Activiti Explorer部署 外部资源 Java类 从过程中使用的spring beans 创建一个单一的应用程序 流程定义的版本 提供流程图 生成流程图 7. BPMN 20 简介 什么是BPMN? 举例 定义一个流程 入门:十分钟教程 准备 目标 用例 流程图 XML表示方式 启动一个流程实例 任务列表 声明任务 完成任务 结束流程 代码概述 未来的增强 8. BPMN 20 构造 自定义扩展 事件 事件定义 计时器事件定义 错误事件定义 信号事件定义 消息事件定义 启动事件 无启动事件 定时器启动事件 消息启动事件 错误启动事件 结束事件 无结束事件 错误结束事件 取消结束事件 边界事件 定时器边界事件 错误边界事件 信号边界事件 取消边界事件 补偿边界事件 中间醒目事件 定时器中间醒目事件 信号中间醒目事件 中间抛出事件 中间无抛出事件 信号中间抛出事件 补偿中间抛出事件 顺序流 描述 图形符号 XML表示 有条件的顺序流 默认顺序流 网关 独有网关 并行网关 包容网管 事件网关 任务 用户任务 脚本任务 Java Service任务 WebService任务 业务规则任务 电子邮件任务 顽固(原:Mule)任务 人工任务 Java接受任务 外壳(原:Shell)任务 执行监听器 任务监听器 多实例(每个) 补偿处理程序 子流程和呼叫活动(原:Callactivities) 子流程 事件子流程 事务子流程 呼叫活动 (子流程) 事务个并发 异步连续 独有作业 9. 表单 表单属性 外形呈现 10. JPA(Java持久化API) 要求 配置 用法 简单示例 查询 JPA 流程变量 使用Spring Bean和JPA的高级示例 11. 历史 查询历史 HistoricProcessInstanceQuery(历史流程实例查询) HistoricActivityInstanceQuery(历史活动实例查询) HistoricDetailQuery(历史细节查询) HistoricTaskInstanceQuery(历史任务实例查询) 历史配置 历史的审计目的 12. Eclipse设计器 安装 Activiti Designer编辑的功能 Activiti Designer BPMN 功能 Activiti Designer 部署功能 扩展的Activiti Designer 自定义调色板 验证图表和导出自定义输出格式 13. Activiti Explorer 案例概述 案例 启动流程实例 我的实例 管理 更改数据库 14. Activiti附加组件 周期 基于Signavio核心组件的Activiti Modeler 15. REST API 知识库 上传部署 获取部署 获取部署资源 获取一个部署资源 删除一个部署 删除部署 引擎 获取流程引擎 流程 列举流程定义 获取表单属性流程定义 获取表单资源中流程定义 启动流程实例 列举流程实例 获取流程实例详细信息 获取流程实例图 任务 获取任务摘要 任务列表 获取任务 获取任务表单 执行任务操作 表单属性列表 给任务添加附件 给任务增加URL 身份 登录 获取用户 列举用户的组 获取组 列举组用户 管理 工作列表 获得工作 执行一个工作 执行多个工作 获取数据库中的表 获取表的元数据 获得表中的数据 16. CDI(上下文和依赖注入[Contexts and Dependency Injection for Java EE])整合 设定activiti-cdi 找到一个流程引擎 配置流程引擎 部署流程 结合CDI的上下文流程执行 与流程实例相关联的会话 声明式的流程控制 参考流程的Beans 使用 @BusinessProcessScoped beans工作 注入流程变量 接收流程事件 附加功能 已知的缺陷 目录表 2.1. 演示用户 2.2. webapp工具 3.1. 支持的数据库 6.1. 6.2. 8.1. 邮件服务器配置 8.2. 邮件服务器配置 8.3. 电驴服务器配置 8.4. 外壳任务参数配置
根据该目录进行查看官方文档感觉就好很多了,接下来就是正式的学习。 1.介绍 该部分基本上没有太多的关注点,主要讲述的是Activiti遵守的是Apache V2的协议,下载地址为http:///download.html,大部分的源码都放在了所下载的发布包中,其余的完整源码需要到https://svn./activiti寻找,运行所需的JDK版本是1.5或者更高,ant构建的版本是1.8.1+,Eclipse为3.6.2,还有其他的一些介绍。
2.入门 该部分主要介绍的是发布包中自带的demo的使用部署,以及相关的配置解释,然后就是eclipse插件的安装,官方文档中介绍的都很详细,这里就不赘述了。
3.配置 这一部分的内容比较琐碎和复杂,为了能够祈祷更好的学习效果,接下来讲述一个简单的应用Activiti的项目,以求快速入门。 |
|
评论
activiti下载包里有一个工程activiti-engine-examples
我拿 VacationRequest.bpmn20.xml 这个请假流程作为一个学习例子。假期申请人A提交一个开始节点的表单(request.form)时没有问题,这时启动一个流程实例,并给相关人员B生成一个代理任务,这也没问题,但当相应人员B处理该代理任务也就是处理A的请假请求时,他提交他的任务表单approve.form ,后台代码如下
String taskId = request.getParameter("taskId");
String vacationApproved = request.getParameter("vacationApproved");
String managerMotivation = request.getParameter("managerMotivation");
Map<String, String> formProperties = new HashMap<String, String>();
formProperties.put("vacationApproved_type", vacationApproved_type);
formProperties.put("vacationApproved", vacationApproved);
formProperties.put("managerMotivation", managerMotivation);
formService.submitTaskFormData(taskId, formProperties);
这时最后一句话 formService.submitTaskFormData(taskId, formProperties);报错误,错误如下:
严重: Error while closing command context
org.activiti.engine.ActivitiException: condition expression returns non-Boolean: true (java.lang.String)
at org.activiti.engine.impl.el.UelExpressionCondition.evaluate(UelExpressionCondition.java:43)
at org.activiti.engine.impl.bpmn.behavior.ExclusiveGatewayActivityBehavior.leave(ExclusiveGatewayActivityBehavior.java:63)
at org.activiti.engine.impl.bpmn.behavior.FlowNodeActivityBehavior.execute(FlowNodeActivityBehavior.java:36)
at org.activiti.engine.impl.pvm.runtime.AtomicOperationActivityExecute.execute(AtomicOperationActivityExecute.java:44)
at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:76)
at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:497)
意思是表达式返回的不是布尔值,确实不是布尔值,
在 approve.form 中vacationApproved确实要求是boolean类型的
<select name="vacationApproved">
<option value="true">Yes</option>
<option value="false">No</option>
</select>
<input type="hidden" name="vacationApproved_type" value="Boolean" />
我传递到后台的
String vacationApproved = request.getParameter("vacationApproved");
vacationApproved 是字符串 “true”,
可是流程文件中审批请假的这个用户任务后的这个分支节点的输入条件要求的表达式是
${vacationApproved}
流程文件片段如下
<sequenceFlow id="flow3" sourceRef="requestApprovedDecision" targetRef="sendApprovalMail">
<conditionExpression xsi:type="tFormalExpression">${vacationApproved}</conditionExpression>
</sequenceFlow>
看意思是要求vacationApproved是布尔类型的,可这个变量
是请假审批人提交表单的一个数据,这个数据只能是字符串型的,因为
formService 这个服务类提交用户任务表单的方法是
void submitTaskFormData(String taskId, Map<String, String>
properties);
只能传递字符串。
现在的问题就是我传递字符串过去后台报错说 返回值是字符串“true”,不是boolean 类型的,可是我也不能直接传递一个boolean 类型的过去呀,因为api 不允许。