JBPM介绍

1.      jBPM 的简单介绍
JBOSS jBPM是一个灵活的、可扩展的工作流管理系统。JBOSS jBPM拥有直观的流程语言,用任务、异步的等待状态、定时器、自动化动作…等来表示业务流程图,把这些操作绑定在一起,JBOSS jBPM就拥有了非常强大和可扩展的控制流机制。
JBOSS jBPM只有最小的依赖,可以象使用java库一样非常容易的使用它。另外,也可以通过把它部署在J2EE集群应用服务器中,用在吞吐量极为关键的环境中。
JBOSS jBPM可被配置为任何数据库,并且可以部署到任何应用服务器。
   参考
1.1 概述
核心工作流和BPM功能被打包为一个简单的java库,这个库包括一个存储到数据库、从数据库更新和获取流程信息的服务。
                       图 1 .1 JBOSS jBPM组件概观
1.2 JBOSS jBPM入门套件
入门套件是一个包含了所有jBPM组件的下载包,包括:
l        Jbpm-server ,一个预配置好的jboss应用服务器。
l        Jbpm-designer ,图形化设计jBPM流程的eclipse插件。
l        Jbpm-db ,jBPM数据库兼容包(见下文)。
l        Jbpm ,核心jbpm组件,包括库和本指南。
l        Jbpm-bpel ,JBOSS jBPM BPEL扩展参考。
预配置好的JBOSS应用服务器安装了下列组件:
l        核心的jBPM 组件 ,被打包为了一个服务档案。
l        一个包括jBPM 库表的集成数据库 :默认的hypersonic数据库包含了jBPM表,另外还包含一个流程。
l        jBPM 控制台web 应用程序 ,可以由流程参与者使用,也可以由jBPM管理员使用。
l        jBPM 调度程序 ,用于定时器执行。调度程序在入门套件中被配置为一个servlet,这个servlet将产生一个线程来监视和执行定时器。
l        jBPM 命令执行器 ,用于命令的异步执行。命令执行器也被配置为一个servlet,这个servlet将产生一个线程来监视和执行命令。
l        一个流程实例 ,已经被部署到了jBPM数据库中。
1.3 JBOSS jBPM图形化流程设计器
JBOSS jBPM还包括一个图形化设计工具,这个设计器是一个创作业务流程的图形化工具。
JBOSS jBPM图形化流程设计器是一个eclipse插件,可以独立安装的设计器已经在开发目标中。
图形化设计器非常重要的特性是它同时支持业务分析者和技术开发者,这使的业务流程建模可以平滑的转换到实际实现。
插件可以被用作本地更新设置(普通的zip文件),通过标准的eclipse软件更新机制安装。另外还有一个包,你可以直接把它解压到eclipse主目录里。
1.4 JBOSS jBPM核心组件
JBOSS jBPM核心组件是普通java(J2SE)软件,用来管理流程定义和流程实例执行的运行时环境。
JBOSS jBPM是一个java库,因此,它可以被用在任何java环境,例如web应用、swing应用、EJB、webservice…等,jBPM库还可以 被打包为无状态会话EJB,这允许被作为集群部署,并且适用于极高的吞吐量。无状态会话EJB按照J2EE1.3规范编写,因此它可以部署到任何应用服务 器。
JBOSS jBPM核心组件被打包为一个简单的java库文件,依赖于你所使用的功能,jbpm-3.0.jar库对第三方库有些依赖,如hibernate、dom4j和其他,这些在“第5章 部署”TODO中有清晰的说明。
为了持久化,jBPM内部使用hibernate,除了传统的O/R影射之外,hibernate还解决了不同数据库之间的SQL方言(dialect)问题,使jBPM可以方便的在当前所有数据库上移植。
JBOSS jPBM API可以从你的项目中任何定制的java软件中访问,例如你的web应用、你的EJB、你的webservice组件、你的消息驱动bean,或者其他java组件。
1.5 JBOSS jBPM控制台web应用程序
jBPM控制台web应用程序服务于两个目的。首先,它作为与由流程执行所产生的运行时任务相交互的一个重要的用户接口;其次,它是一个管理和监控控制台,允许检查和操纵运行时实例。
1.6 JBOSS jBPM身份组件
JBOSS jBPM可以与任何包含用户或其他组织信息目录的公司集成,但是对于没有组织信息组件可用的项目,JBOSS jBPM包含了它自己的组件。身份组件所使用的模型比传统的servlet、ejb和portlet(译者注:portlet是portal中最重要的组 件,与servlet类似,portlet是部署在容器中用来生成动态内容的web组件。)模型更丰富。
更多信息,请看“11.11 身份组件”。TODO
1.7 JBOSS jBPM调度程序
JBOSS jBPM调度程序是一个用来监视和执行定时器的组件,它在流程执行期间被调度。
定时器组件软件被打包进核心的jbpm库,但是它需要被部署进下列环境之一:要么配置调度程序servlet去产生监视线程,要么用调度程序的main方法启动一个独立的JVM。
1.8 JBOSS jBPM数据库兼容包
JBOSS jBPM数据库兼容包是一个包含能使jBPM在你所选择的数据库上运行的所有信息、驱动程序和脚本的下载包。

2.      jBPM 和myeclipse 的冲突
当eclipse安装了myeclipse 和jBPM 时候,可能有冲突,具体表现在jBPM 的流程设计器不能在eclipse中使用。
 
3.      Hibernate连接mysql 数据库的一般参数
下面的配置参数,根据需要可以修改:
jbpmtest 是mysql 中的schema的名字;
GBK 是字符集,可以根据需要修改;
username=root ,mysql 数据库的用户名是root ;
password=mysql ,mysql 数据库的用户密码是mysql ;
 
hibernate.dialect = org.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class = com.mysql.jdbc.Driver
hibernate.connection.url= jdbc : mysql://localhost/jbpmtest?useUnicode=true&characterEncoding=GBK
hibernate.connection.username = root
hibernate.connection.password = mysql
 
hibernate.show_sql = true
hibernate.c3p0.min_size= 1
hibernate.c3p0.max_size= 3
 
4.      Hibernate连接Oracle数据库的一般参数
hibernate.dialect = org.hibernate.dialect.Oracle9Dialect
hibernate.connection.driver_class= oracle.jdbc.driver.OracleDriver
hibernate.connection.url = jdbc:oracle:thin:@ localhost :1521:orcl hibernate.connection.username = jbpm
hibernate.connection.password = jbpm
 
5.      为jBPM 创建数据库表等内容
5.1.             为mysql 创建数据库以及数据内容
JbpmSessionFactory.buildJbpmSessionFactory ( ). getJbpmSchema().dropSchema();
JbpmSessionFactory.buildJbpmSessionFactory ( ). getJbpmSchema().createSchema();
这2个语针对 mysq 有效.
5.2.             为oralce 创建数据库以及数据内容
JbpmSessionFactory.buildJbpmSessionFactory ( ). getJbpmSchema().dropSchema();
JbpmSessionFactory.buildJbpmSessionFactory ( ). getJbpmSchema().createSchema();
上面的语句对 oralce 无效。
模型目录jBPM\jbpm_database\jBPM_oralce10g.pdm 是 jBPM 的 Oralce 模型,包含对应的Sequence的信息.
需要在数据库中创建 Sequence name= hibernate_sequence
5.3.             流程信息保存到数据库
JbpmSessionFactory  factory =   JbpmSessionFactory.buildJbpmSessionFactory();
        JbpmSession session = factory.openJbpmSession ();
        GraphSession graphSession =  session.getGraphSession ();
        session.beginTransaction ();
        
        /// new ProcessDefinition 实例
        ProcessDefinition myProcessDefinition = null;
    ProcessInstance processInstance = new ProcessInstance (processDefinition);
      processInstance.getContextInstance ().setVariable("myvar","xxx");
        ///
        graphSession.saveProcessDefinition (myProcessDefinition);
        session.commitTransaction ();
session.close ( );
jBPM 和 Hibernate,MySQL 的使用中会遇到字符集的问题.
需要注意几个地方。
5.4.             在Mysql 安装过程指定字符集
   在 Mysql 安装过程中指定相应的默认字符集是GBK
5.5.             Hibernate.properties 文件中的字符集设置
hibernate.connection.url=jdbc:mysql://localhost/jbpmtest?useUnicode=true&characterEncoding=GBK
5.6.             hibernate.cfg.xml 文件中的字符集设置
< property name="hibernate.connection.url">jdbc:mysql://192.168.1.2/jbpmtest</property>
5.7.             MySQL 的配置文件的修改:
   my.ini 中 default-character-set=GBK
   注意有2处需要修改
 
6.      为流程定义变量
分成3种流程变量
全局变量(全局流程变量)
全局临时变量(全局流程临时变量)
局部变量(流程某个接点内有效的变量)
@see org.jbpm.context.exe.ContextInstance














目前还没有使用过局部变量(流程某个接点内有效的变量)
流程变量的定义
6.1.             流程变量的类型
·         java.lang.String
·         java.lang.Boolean
·         java.lang.Character
·         java.lang.Float
·         java.lang.Double
·         java.lang.Long
·         java.lang.Byte
·         java.lang.Short
·         java.lang.Integer
·         java.util.Date
·         byte[]
·         java.io.Serializable
·         classes that are persistable with hibernate
 所有基本类型的包裹类型,以及实现了 Serializable 的类型都可以作为流程参数变量使用,注意参数类不能是一个类的内部类或者属性类(除非包含参数类的类实现了Serializable 接口)
参考 org.jbpm.context.exe.VariableInstance









6.2.             流程变量的使用
l         变量的定义和获取
void ContextInstance.setVariable(String variableName, Object value);
void ContextInstance.setVariable(String variableName, Object value, Token token);
Object ContextInstance.getVariable (String variableName);
Object ContextInstance.getVariable (String variableName, Token token);
l        Variables can be deleted with
ContextInstance.deleteVariable ( String variableName);
ContextInstance.deleteVariable ( String variableName, Token token);
 
6.3.             Variable lifetime
     一个变量在被定义后,在变量从 ContextInstance 删除前,都可以被访问。当变量被删除后,去获取该变量将返回为空。
6.4.             自定义类的实例作为流程变量
   如果一个类的实例要作为流程变量使用,该类需要实现 java.io.Serializable 接口,并且定义序列化版本.
 
//一个可以作为流程变量使用的类
class Wdz implements Serializable{
    // 为类指定序列化版本号
    private static final long serialVersionUID = 1L;    
       private String name="wdz";
       private int age=10;
       public String toString(){
              return "name="+name+",age="+age;    
       }    
}
上面的例子中,如果把类 Wdz 作为类 WdzParent 内部类使用,然后当成流程变量使用,那类 WdzParent 必须 也实现 Serializable 接口,否则会有问题.
6.5.             Transient variables
流程的历史变量是不能持久化的,作用范围是对整个流程全局有效的。
在 ContextInstance 类内部,采用的是一个Map来存储 TransientVariable 的信息
参考代码
org.jbpm.context.exe.ContextInstance 的源代码。
主要的相关方法
public void deleteTransientVariable (java.lang.String name)
public void setTransientVariable (java.lang.String name,
                                 java.lang.Object  value)
public java.lang.Object getTransientVariable( java.lang.String  name)
 
6.6.             Variables overloading
 当一个变量和流实例关联(变量名字= ”wdz”,value =”test”) ,如果在设置一个变量
(变量名字= ”wdz”,value = new Integer(10)) , 那最后变量(变量名字= ”wdz )的值是Integer(10)。
这称之为overload.
 
6.7.             Variables overriding
 如果父流程有变量A(值= ”value1”), 子流程又定义了变量A值= ”value2”, 那在子流程范围内,获取变量A的值,那结果是值= ”value2” 。这是遵循一般语言的局部变量在它的局部范围内override上级变量。
 
6.8.             流程变量的持久化
它依赖于流程实例的持久化,非 TransientVariable 流程实例的持久化一起被保存。
保存在数据表 jbpm_variableinstance
参考 org.jbpm.context.exe.VariableInstance









6.9.             Customizing variable persistence (可以进一步了解)
User java object <---> converter <--->  variable instance
也就是自定义类的持久化需要定义自己的 converter 和变量实例类
converter 和变量实例类需要继承 org.jbpm.context.exe.VariableInstance
converter 需要实现 org.jbpm.context.exe.Converter 接口

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值