jBPM的学习心得

    技术2022-05-11  121

    1.      jBPM的简单介绍 jBPM 是JBOSS下的一个开源java工作流项目,该项目提供eclipse插件,基于Hibernate实现数据持久化存储。    参考 http://www.jboss.com/products/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 http://wiki.jboss.org/wiki/Wiki.jsp?page=JbpmOnOracle 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 接口  

    最新回复(0)