posts - 26,comments - 77,trackbacks - 0
     摘要: 随着jBPM4.0GA版本的发布,使用jBPM4的人也开始多起来,虽然我们已经翻译了jBPM-4的用户手册和开发指南,但jBPM4的官方文档内容还是不够全面,虽然理论知识比较丰富,但是缺少实践教授内容。我们推出的《每天一课,jBPM4》是jBPM4第一份系列视频教程,手把手教您学会jBPM4,并将jBPM4应用在工作流管理平台中,同时我们还会提供视频课程里的源代码。  阅读全文
posted @ 2009-07-29 18:04 卡宴 阅读(3098) | 评论 (7)编辑 收藏
     摘要: 这2天我们忙着做了下jBPM4和Spring Security的专题页面,提供了不少关于jBPM4和Spring Security的技术资料和示例。  阅读全文
posted @ 2009-07-28 14:02 卡宴 阅读(1690) | 评论 (4)编辑 收藏
     摘要: 在oa里我们实现一套权限管理,包括资源管理、角色管理、用户管理、菜单管理以及组织机构管理,整套权限采用的是RBAC的模型。下面给大家分享下效果,同时也提供源码下载,希望大家多提建议。  阅读全文
posted @ 2009-07-22 11:56 卡宴 阅读(2519) | 评论 (6)编辑 收藏
     摘要: 鉴于各位都非常期待PDF的版本,我便把用户指南提供给大家下载,希望大家能够多多反馈,这样才能提高我们的翻译质量,对大家更是有好处。开发指南的内容更丰富些,如果有感兴趣帮忙校稿的朋友可以联系我们O(∩_∩)O哈哈~  阅读全文
posted @ 2009-07-15 01:14 卡宴 阅读(1938) | 评论 (10)编辑 收藏

开发文档更新到了jBPM4的GA版本,这次开发文档变更非常大,添加了好几章,并且原来的部分章节也改了名字,具体细节可以查看修改日志。不过架构那章更新的并不多,和jBPM4实际的架构还有些区别,所以这部分大家最好看jBPM4的源码。(用户指南的翻译见上一篇博客)

1. 简介
1.1. 目标读者
1.2. 概述
1.3. 源代码和WIKI
1.4. Maven仓库
1.5. 依赖库
2. 孵化器
2.1. timer定时器
2.1.1. 持续时间表达式
2.1.2. 工作日历
2.1.3. 定时器流向
2.1.4. 定时器事件
2.1.5. 定时器工作时间
2.1.6. 定时器重复
2.2. group
2.2.1. 简单group
2.2.2. group 定时器
2.2.3. group 多入口
2.2.4. group 同步
2.2.5. group 秘密
2.3. 创建组
2.4. Task outcomes
3. 从jBPM3转换到jBPM4
3.1. jBPM4的目标
3.2. 知识范围
3.3. 流程转换工具
3.3.1. 概述
3.3.2. 参数
3.3.3. 使用示例
3.3.4. 高级应用
3.4. 解释和修改
4. 流程虚拟机
5. 架构
5.1. APIs
5.2. 活动API
5.3. 事件监听API
5.4. 客户端API
5.5. 环境
5.6. 命令
5.7. 服务
6. 实现基本活动
6.1. ActivityBehaviour
6.2. ActivityBehaviour实例
6.3. ExternalActivityBehaviour
6.4. ExternalActivity实例
6.5. 基本流程执行
6.6. 事件
6.7. 事件传播
7. 流程剖析
8. 高级图形执行
8.1. 循环
8.2. 默认执行行为
8.3. 功能活动
8.4. 执行和线程
8.5. 流程同步
8.6. 异常处理器
8.7. 流程修改
8.8. 锁定和流程状态
9. 配置
9.1. 基本配置
9.2. 自定义身份认证组件
10. 持久化
11. 计划执行器
11.1. 概述
11.2. 配置
12. 高级邮件支持
12.1. 生产者
12.1.1. 默认生产者
12.2. 模板
12.3. 服务器
12.3.1. 多服务器
12.4. 扩展点
12.4.1. 自定义生产者
12.4.1.1. 例子:自定义附件
13. 软件日志
13.1. 配置
13.2. 目录
13.3. JDK日志
13.4. 调试持久化
14. 历史
15. JBoss集成
15.1. 打包流程归档
15.2. 把流程归档发布成一个jBoss实例
15.3. 流程发布和版本管理
15.4. 流程引擎和J2EE/JEE编程模型
16. Spring集成
16.1. 概述
16.2. 配置
16.3. 使用
16.4. 测试
A. 修改日志
posted @ 2009-07-14 00:28 卡宴 阅读(3331) | 评论 (11)编辑 收藏
jBPM4的GA将会在明天发布,官方的用户手册已经更新到GA版本了。每次新的版本一发布,我们也会立刻更新,这次用户手册主要是修改了jPDL的内容,然后给变量那章添加了不少内容,其他章节基本都是补充了部分内容。现在还没有经过完整的校对,有翻译不妥的地方还请大家多提反馈意见。

1. 导言
1.1. 许可证与最终用户许可协议
1.2. 下载
1.3. 源码
1.4. 什么是jBPM
1.5. 文档内容
1.6. 从jBPM 3升级到jBPM 4
2. 安装配置
2.1. 发布
2.2. 必须安装的软件
2.3. 快速上手
2.4. Ant脚本
2.5. JBoss
2.6. Database
2.7. Tomcat
2.8. 配置文件
2.9. 流程设计器(GPD)
2.9.1. 获得eclipse
2.9.2. 添加更新站点gpd/jbpm-gpd-site.zip
2.9.3. 定义jBPM用户库
2.9.4. 在目录中添加jPDL4模式
2.9.5. 导入示例
2.9.6. 使用ant添加部分文件
3. 流程设计器(GPD)
3.1. 创建一个新的流程文件
3.2. 编辑流程文件的源码
4. 部署业务归档
4.1. 部署流程文件和流程资源
4.2. 部署java类
5. 服务
5.1. 流程定义,流程实例和执行
5.2. ProcessEngine流程引擎
5.3. Deploying a process部署流程
5.4. 卸载已发布的流程定义
5.5. 删除流程定义
5.6. 启动一个新的流程实例
5.6.1. 最新的流程实例
5.6.2. 指定流程版本
5.6.3. 使用key
5.6.4. 使用变量
5.7. 执行等待的流向
5.8. TaskService任务服务
5.9. HistoryService历史服务
5.10. ManagementService管理服务
6. jPDL
6.1. process流程处理
6.2. 控制流程Activities活动
6.2.1. start启动
6.2.2. State状态节点
6.2.2.1. 序列状态节点
6.2.2.2. 可选择的状态节点
6.2.3. decision决定节点
6.2.3.1. decision决定条件
6.2.3.2. decision expression唯一性表达式
6.2.3.3. Decision handler决定处理器
6.2.4. concurrency并发
6.2.5. end结束
6.2.5.1. end process instance结束流程处理实例
6.2.5.2. end execution结束流向
6.2.5.3. end multiple多个结束
6.2.5.4. end State结束状态
6.2.6. task
6.2.6.1. 任务分配者
6.2.6.2. task候选人
6.2.6.3. 任务分配处理器
6.2.6.4. 任务泳道
6.2.6.5. 任务变量
6.2.6.6. 在任务中支持e-mail
6.2.7. sub-process子流程
6.2.7.1. sub-process变量
6.2.7.2. sub-process外出值
6.2.7.3. sub-process外向活动
6.2.8. custom
6.3. 原子活动
6.3.1. java
6.3.2. script脚本
6.3.2.1. script expression脚本表达式
6.3.2.2. script 文本
6.3.3. hql
6.3.4. sql
6.3.5. mail
6.4. Common activity contents通用活动内容
6.5. Events事件
6.5.1. 事件监听器示例
6.5.2. 事件传播
6.6. 异步调用
6.6.1. 异步活动
6.6.2. 异步分支
6.7. 用户代码
7. Variables变量
7.1. 变量作用域
7.2. 变量类型
8. Scripting脚本
9. Indentity身份认证
10. 支持邮件
10.1. 生产者
10.1.1. 默认生产者
10.2. 模板
10.3. 服务器
10.3.1. 多服务器
10.4. 扩展点
10.4.1. 自定义生产者
10.4.1.1. 例子:自定义附件
A. 修改日志
posted @ 2009-07-09 10:35 卡宴 阅读(1468) | 评论 (4)编辑 收藏
  最近一直在整流程控制台,发现还是有不少成就感的,尤其昨天又实现了动画回放流程。这可是忽悠领导的最佳手段啊,我先给大家看一下我们控制台的规划和进度(提供源码下载地址
):

-------------------------------------------------近期
* 细化task的生命周期,重新整理task操作
* 流程实例历史
  * 表格方式查看流程历史
 

------------------------------------------------- 远景
* 流程仿真
* 修改流程图
* 细粒度权限控制
* 回退
* 会签
* 委派
* swimlane
* BI
* BAM
* 仪表盘


-------------------------------------------------ChangeLog

* 2009-07-01
* [DONE] 实现动画方式回放流程

* [DONE] 实现deployment的suspend, resume(CR1显示已暂停定义列表时出现问题,trunk下已修正,等待GA)
* [DONE] 实现processInstance的suspend, resume, end(CR1和trunk里,都没有暴露suspend和resume方法)
* [DONE] 实现personalTasks, groupTasks, take task, cancel task

* 2009-06-29

* [DONE] 登陆页面,登录名和密码为1/1
* [DONE] 添加start和signal,complete task时,添加变量
* [DONE] 整合web流程设计器,可以直接发布流程定义
* [DONE] 国际化

* 2009-06-01 and before

* [DONE] 发布xml格式的流程定义
* [DONE] 流程定义管理(list, start, delete)
* [DONE] 显示流程图(只在Process Instance详细信息中可显示)
* [DONE] 流程实例管理(list, signal, view, delete)
* [DONE] 任务管理(list, complete)
* [DONE] 追踪流程图(显示Process Instance的当前位置)
* [DONE] 多流向选择
* [DONE] 用户权限(user, group, membership的CRUD功能)
* [DONE] 报表(most active process)

呵呵,现在实现的功能毕竟还是有限,我们的功能规划在一定程度上可能有些局限,希望大家能给多提提建议,认为控制台里还可以加些什么功能。这可是开源的啊,大家为了自己也要多提出建议来,O(∩_∩)O哈哈~

下面是我们控制台一些功能的视频演示,包括流程设计和发布,动画回放流程等。
大家可以看看视频:http://www.family168.com/bbs/dispbbs.asp?boardid=6&Id=473
截图请看:http://www.family168.com/bbs/dispbbs.asp?boardid=6&Id=463
svn的下载地址:http://jbpmside.googlecode.com/svn/trunk

posted @ 2009-07-02 12:34 卡宴 阅读(1137) | 评论 (4)编辑 收藏
     摘要: 我们的控制台现已实现了流程管理、流程监控、流程建模和仿真以及报表等,建模和仿真是使用js做了一个web设计器jPDL整合在控制台中。  阅读全文
posted @ 2009-06-29 14:11 卡宴 阅读(1651) | 评论 (1)编辑 收藏
要知道如何将jBPM4与Spring整合,可以先了解jBPM4的IOC容器,如果不了解的可以先看ronghao的这篇文章http://www.javaeye.com/topic/381607,是介绍jBPM4的IOC容器的。下面我们介绍jBPM与Spring整合的2种方式:
   第一种:手工将SessionFactory放入jBPM4中。
   第1步:更改jbpm.spring.default.cfg.xml配置文件,将下面的部分注释掉
  <!--
    <hibernate-configuration>
      <cfg resource="jbpm.hibernate.cfg.xml" />
    </hibernate-configuration>

    <hibernate-session-factory />
  -->
   注释的部分是在jBPM4中创建了sessionFactory,而我们只需要一个sessionFactory。既然要将jBPM4与Spring的整 合,那就希望由Spring来统一管理sessionFactory和事务,在Spring的配置文件中构造一个sessionFactory。 ProcessEngine是jBPM4的Facade模式,一切由它与外部交互,
  第2步:在Spring配置文件中写一个bean:
<bean id="processEngine" class="com.family168.jbpm.ProcessEngineFactoryBean">
        <property name="sessionFactory" ref="sessionFactory"/>
</bean>
第3步:在ProcessFactoryBean中注入SessionFactory:
  public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
  }
第4步:在ProcessFactoryBean中创建一个SpringConfiguration,然后将sessionFactory放入 SpringConfiguration中,再从SpringConfiguration得到processEngine,代码如下:
     public void afterPropertiesSet() {
        SpringConfiguration cfg = new      SpringConfiguration(jbpmConfigurationLocation);
        cfg.setApplicationContext(applicationContext);

        cfg.setSessionFactory(sessionFactory);
        this.processEngine = cfg.buildProcessEngine();
    }
然后我们的工作就可以开展了,可以从processEngine得到所有的service。比如:
    ProcessEngine processEngine = (ProcessEngine) ctx.getBean("processEngine");
    RepositoryService repositoryService = processEngine.getRepositoryService();。
第2种:获得Hibernate的SessionFactory。
  第1步:与第一种方式的第1步一样。
  第2步:更改jbpm.tx.spring.cfg.xml配置文件:
  将     
     <standard-transaction-interceptor/>
  改成    <spring-transaction-interceptor current="true" />
  然后将
    <transaction/>
    <hibernate-session/>
  改成 <hibernate-session current="true"/>
这部分修改是将jBPM4创建的spring事务和hibernate的session改成从当前的ThreadLocal中获得session和事务。
第3步:在Spring配置文件中写bean,processEngine和template:
<bean id="jbpmConfiguration" class="org.jbpm.pvm.internal.cfg.SpringConfiguration">
        <constructor-arg value="jbpm/jbpm.cfg.xml" />
    </bean>

    <bean id="processEngine" factory-bean="jbpmConfiguration" factory-method="buildProcessEngine" />

    <bean id="jbpmTemplate" class="com.family168.jbpm.JbpmTemplate">
        <property name="processEngine" ref="processEngine"/>
        <property name="dataSource" ref="dataSource"/>
    </bean>
processEngine直接使用factory-bean指向jbpmConfiguration,也就是 org.jbpm.pvm.internal.cfg.SpringConfiguration,并从SpringConfiguration的 buildProcessEngine中获得。
jbpmTemplate主要是控制事务,在processEngine外面创建事务,这样使用的时候会先调用jbpmTemplate,再调用processEngine,否则它会说事务没有启动。在jbpmTemplate中注入processEngine:
    public void setProcessEngine(ProcessEngine processEngine) {
        this.processEngine = processEngine;
    }
    这里我的理解是我们在上面已经将事务改成从当前的Threadlocal中获得,所以jBPM4是必须当前有事务,如果我没有创建事务的话,在使用 processEngine时就会说事务没有启动。所以我们就封装了一个jbpmTemplate,如果我的理解有误还请大家指出。
   第1种整合方式的例子下载http://www.family168.com/,第2种整合方式之后可以看我们的jBPM-Side里的控制台。

posted @ 2009-06-29 13:27 卡宴 阅读(1473) | 评论 (0)编辑 收藏
7.6. 流程同步

为了进行流程同步建模,在执行中这是一个父子树形结构。 这个想法是执行主路径是树的根。 流程的主路径也被称作流程实例。 当在给定流程定义上启动或创建一个新流程实例时, 执行便被创建。

现在,因为执行的主路径和流程实例是相同对象, 这保证了用法的简单, 在没有同步情况的简单流程下。
基本执行结构的UML类图



图 7.6. 基本执行结构的UML类图

为了建立执行的多同步路径,活动实现比如一个分支或切分 创建子执行, 使用ActivityExecution.createExecution方法。 活动实现比如结合或合并可以停止流程的这些同步路径, 通过调用执行同步的stop方法。

只有叶子执行可以激活,非叶子执行应该不是激活的。 这个执行的树形结构没有坚持一个同步或结合行为的特殊类型。 它从事着分支或和切分 和结合或和合并来使用执行树结构, 用任何方式,他们想定义期望的同步行为。 这里我们看一个同步执行的例子。
执行的同步路径



图 7.7. 执行的同步路径

这里有执行的一个付款和一个发货路径。 在这种情况,水平线上的活动展示了分支和结合。这个执行显示了三个执行。 执行的主路径不是激活的(显示成灰色) 执行的付款和发货路径是激活的,分别指向了 bill和ship活动。

从事活动行为的实现,是他们想使用的执行结构。 假设多个任务必须在执行进行之前完成。 活动行为可以为这个产生一系列子执行。 或者可以选择,任务组件可以支持任务组, 分配给单独的执行。在那种情况, 任务组件成为同步任务的响应, 因此把这个责任移动到执行树形结构范围之外。
7.7. 异常处理器

在所有分配到流程的代码中,像 Activity,EventListeners和 Condition,可能分配给异常处理器。 这可以想成是把这些实现的方法实现包含在try-catch块中。 但是为了构建更多可复用的构建块, 为了委派类和异常处理逻辑, 异常处理器可以添加到核心流程模型中。

一个异常处理器可以分配给任何流程元素。 当一个异常发生在一个委派类中,一个匹配的异常处理器就会被找到。 如果找到了一个这样的异常处理器,它会有一个处理这个异常的机会。

如果一个异常处理器处理完成,没有出现问题,然后这个异常会 被认为是处理了,就会在委派代码调用后继续。 比如,一个转移有三个动作,第二个动作抛出一个异常, 这个异常被异常处理器处理,然后

编写自动活动,异常处理器提醒是很容易的。 默认是任意执行。没有方法需要在执行中调用。 所以如果一个自动活动抛出一个异常,被异常处理器处理, 这个执行会在这个执行后继续执行。这对于控制流向活动 就会有一个更大的困难。它们可能需要包含try-finally块 来调用执行中对应的方法,在异常处理器 获得一个机会来处理异常。比如,如果活动是等待状态, 然后发生了一个异常,这里就会有一个风险,线程会跳出 execution.waitForSignal()的调用, 导致执行在这个活动以后继续执行。

TODO: exceptionhandler.isRethrowMasked

TODO: transactional exception handlers

TODO: we never catch errors
7.8. 流程修改

TODO: 流程修改
7.9. 锁定和流程状态

一个执行的状态不是激活就是锁定。 一个激活的执行不是执行就是等待外部触发器。 如果一个执行不是STATE_ACTIVE,那么它就是被锁定。 一个锁定的执行是只读的,不能接受任何外部触发器。

当一个新执行被创建时,它是STATE_ACTIVE。 为了把状态修改成锁定状态,使用lock(String)。一些STATE_*常量 被提供了,它们演示了最常用的锁定状态。 但是在图片中的'...'状态展示了任何字符串 都可以作为状态提供给lock方法。
执行的状态



图 7.8. 执行的状态

如果一个执行被锁定,修改执行的方法会 抛出一个PvmException,信息会引用真实的锁定状态。 触发事件,更新变量,更新优先级,添加注释 不会当做是修改执行。 子节点的创建和删除也不会检测, 这意味着那些方法可以被外部API客户和活动行为调用, 即使执行在锁定状态。

确保比较getState()和STATE_*常量时 使用.equals,不要使用'==',因为如果执行从持久存储加载。 会创建一个新字符串,而不是使用常量。

一个执行实现会被锁定:

    * 当它结束
    * 当它暂停
    * 在异步延续过程中

更多的,锁定可以被活动实现使用, 让执行在等待状态下只读,然后为这个执行传递 的外部实例就像这样:

    * 一个人员任务
    * 一个服务调用
    * 一个等待状态当探测器检测一个文件的出现时就结束

在这些情况,策略是外部实例应该获得 执行的完全控制,因为它想要控制什么应该允许,什么不应该。 为了获得那种控制,他们锁定了执行,所以所有内部交互 必须通过外部实例传递。

一个创建外部实例的主要原因是, 它们可以在执行已经执行过还存在。比如, 在服务调用的情况,定时器可以导致执行获得超时转移。 当响应在超时后到达,服务调用实例应该 确认它没有signal这个执行。所以服务调用可以看做 一个活动实例(活动实例) 是对活动每个执行的唯一实例。

外部实例它们自己负责管理执行锁定。 如果定时器和客户端应用结果是选择 外部实例,而不是直接选择执行,然后在理论上是不必要的。 它是从事活动行为实现,无论它希望 执行锁定还是解锁。
posted @ 2009-06-26 12:05 卡宴 阅读(1078) | 评论 (0)编辑 收藏
仅列出标题
共3页: 上一页 1 2 3 下一页