`
white182517
  • 浏览: 162662 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring+Mysql+Jbpm整合

阅读更多

前言

最近因为工作需要做一个工作流相关的DEMO,研究了一下JBPM,记录一下个人的心得与体会。

软件环境:

  • spring2.0.2
  • hibernate3.2.2
  • spring modules 0.8 (Jbpm3.1)
  • jbpm3.1.4
  • struts2.0.6

配置

Spring Module Jbpm模块提供了几个工具类用来整合spring和jbpm,关于具体的配置可以参见spring module下载包中的参考手册,按照上面的指示来就OK了,这里粘贴示例配置。

xml 代码
  1. <!---->xml version="1.0" encoding="UTF-8"?>  
  2. <!---->>  
  3. <beans default-autowire="byName" default-lazy-init="true">  
  4.     <bean id="approveWorkflow"  
  5.         class="org.springmodules.workflow.jbpm31.definition.ProcessDefinitionFactoryBean">  
  6.         <property name="definitionLocation"  
  7.             value="classpath:jbpm/audit/processdefinition.xml" />  
  8.     bean>  
  9.     <bean id="jbpmConfiguration"  
  10.         class="org.springmodules.workflow.jbpm31.LocalJbpmConfigurationFactoryBean">  
  11.         <property name="sessionFactory" ref="sessionFactory" />  
  12.         <property name="configuration" value="classpath:jbpm/jbpm.cfg.xml" />  
  13.         <property name="processDefinitions">  
  14.             <list>  
  15.                 <ref local="approveWorkflow" />  
  16.             list>  
  17.         property>  
  18.   
  19.     bean>  
  20.     <bean id="jbpmTemplate"  
  21.         class="org.springmodules.workflow.jbpm31.JbpmTemplate">  
  22.         <constructor-arg index="0" ref="jbpmConfiguration" />  
  23.         <constructor-arg index="1" ref="approveWorkflow" />  
  24.     bean>  
  25. beans>  
  26.   

比较关键的是为了能够使JBPM实体和业务实体使用同一个会话工厂,这样可以在JBPM流程实例中持久化业务实体对象。必须将业务实体映射和JBPM的实体映射进行整合。我的作法是改写JBPM本身提供的hibernate.cfg.xml文件,将业务实体包括在里面。

xml 代码
  1. <!---->xml version='1.0' encoding='utf-8'?>  
  2.   
  3. <!---->
  4.           "-//Hibernate/Hibernate Configuration DTD 3.0//EN"   
  5.           "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  6.   
  7. <hibernate-configuration>  
  8.   <session-factory>     
  9.   
  10.         <property name="hibernate.cache.use_second_level_cache">  
  11.             false   
  12.         property>          
  13.         <property name="hibernate.cache.use_query_cache">  
  14.             false   
  15.         property>  
  16.         <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialectproperty>  
  17.         <property name="hibernate.show_sql">falseproperty>  
  18.         <property name="hibernate.query.factory_class">  
  19.             org.hibernate.hql.ast.ASTQueryTranslatorFactory   
  20.         property>  
  21.            
  22.            
  23.     <!---->    
  24.     <mapping resource="com/emap/jbpm/model/Apply.hbm.xml"/>  
  25.   
  26.     <!---->  
  27.     <mapping resource="org/jbpm/graph/action/Script.hbm.xml"/>  
  28.   
  29.     <mapping resource="org/jbpm/db/hibernate.queries.hbm.xml" />  
  30.        
  31.     <!---->  
  32.     <mapping resource="org/jbpm/graph/def/ProcessDefinition.hbm.xml"/>  
  33.     <mapping resource="org/jbpm/graph/def/Node.hbm.xml"/>  
  34.     <mapping resource="org/jbpm/graph/def/Transition.hbm.xml"/>  
  35.     <mapping resource="org/jbpm/graph/def/Event.hbm.xml"/>  
  36.     <mapping resource="org/jbpm/graph/def/Action.hbm.xml"/>  
  37.     <mapping resource="org/jbpm/graph/def/SuperState.hbm.xml"/>  
  38.     <mapping resource="org/jbpm/graph/def/ExceptionHandler.hbm.xml"/>  
  39.     <mapping resource="org/jbpm/instantiation/Delegation.hbm.xml"/>  
  40.        
  41.     ........   
  42.        
  43.   session-factory>  
  44. hibernate-configuration>  

下面我们看看sessionFactory工厂的配置。

xml 代码
  1. <!---->xml version="1.0" encoding="UTF-8"?>  
  2. <!---->>  
  3. <beans default-autowire="byName" default-lazy-init="true">  
  4.   
  5.     <!---->  
  6.     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  7.         <property name="driverClassName" value="${jdbc.driverClassName}"/>  
  8.         <property name="url" value="${jdbc.url}"/>  
  9.         <property name="username" value="${jdbc.username}"/>  
  10.         <property name="password" value="${jdbc.password}"/>  
  11.     bean>  
  12.        
  13.     <!---->  
  14.     <bean id="sessionFactory"  
  15.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  16.         <property name="dataSource" ref="dataSource" />  
  17.         <property name="configLocations">  
  18.             <list>  
  19.                 <value>classpath:jbpm/hibernate.cfg.xmlvalue>  
  20.             list>  
  21.         property>  
  22.     bean>  
  23.     <!---->  
  24.     <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  25.         <property name="sessionFactory" ref="sessionFactory"/>  
  26.     bean>  
  27. beans>  

遗留问题

如何使用JBPM Process Designer插件?

       一直没找到如何使用JBPM Process Designer插件的使用文档,比如如何配置JBPM安装路径,如何部署。目前唯一用到的功能就是编写流程文件。

如何发布流程文件?

        对于如何发布流程文件,我比较同意如下帖子中的观点,编程实现或许是最简洁的方式。

www.pcdog.com/edu/java/2006/11/v171946.html

如何关联业务实体和流程实例?

        JBPM主要用来管理业务流程,记录每个流程进入哪个环节,同时还要保存一些状态,这些状态信息可能来自于业务实体。JBPM的实现方式是将这些状态信息序列化到数据库的表列。

        假定有一个订单处理的流程,现在要获取某个角色当前的所有任务列表,同时将关联的订单信息展示给用户,我们应该如何处理?目前我想到有以下几种方式:

        方式一:在构建任务实例的时候,将业务实体持久化到contextInstance,在获取任务列表时从任务实例中直接解析出业务实体。如果需要保存的业务实体数据量很大,这会给JBPM数据库造成很大的数据冗余。

        方式二:在构建任务实例的时候,仅将业务实体的唯一标识符持久到contextInstance,在获取任务列表时从任务实例中解析出任务实体的唯一标识符,然后再根据此标识符查询业务实体数据库。这种情况会造成查询一个包含N个的任务列表时,需要N+1次数据库查询,显然性能是无法满足需求的。

        方式三:是否可以在构建业务实体时,和TaskInstance进行关联?这种方式会造成业务实体和JBPM紧耦合,而且必须对JBPM本身有比较深刻的理解。

        有什么更好的办法解决这种问题呢?个人以为方式一可能是目前性价比最好的解决方式吧。

一点体会

         JBPM看来在国内并没有得到很多的应用,资料都比较稀缺,唯一的参考手册也是非常的浅显和简单。而其源码的注释不是很好,这在国外的开源软件中是很罕见的。

         JBPM提供的某些API不是很全,举个例子,假定我要查询某个角色某个时间段的所有任务列表。因为TaskMgmtSession仅提供了findXXXTaskInstances(String actorId)方法,所以我只能先查询出该角色的所有任务列表,采用如下代码:

java 代码
  1. TaskMgmtSession taskMgmtSession = context.getTaskMgmtSession();   
  2.  List tasks = taskMgmtSession.findPooledTaskInstances(actorId);  

        然后再在内存中使用类似如下代码进行过滤。

java 代码
  1. if (task.getName().equals(taskName) && !task.hasEnded())  

这种方式太笨拙和低效了。

分享到:
评论
12 楼 czwlucky 2008-12-25  
czwlucky 写道

dengzi725 写道这里有个问题,假如你要删除的那个流程被使用的过的话,当你再去卸载这个流程的时候,这个流程未必能删除的了。&amp;nbsp; 我有的时候会碰到这样的情况。我现在遇到了这样的问题,发现删除一个流程定义(不一定是使用过的),限入了死循环中。

刚才搞错了,删除不了的确实是使用过的流程定义,发布流程时使用jbpmTemplat方式也不行。谁解决这个问题啊?
11 楼 czwlucky 2008-12-25  
dengzi725 写道

这里有个问题,假如你要删除的那个流程被使用的过的话,当你再去卸载这个流程的时候,这个流程未必能删除的了。&nbsp; 我有的时候会碰到这样的情况。

我现在遇到了这样的问题,发现删除一个流程定义(不一定是使用过的),限入了死循环中。
10 楼 nainiu999 2008-10-07  
我把jbpm与spring整合,使用jbpmTemplate来DeployProcessDefinition。发现数据库中没有记录。我是用JUNIT来测试的,直接用JbpmConfiguration来DeployProcessDefinition查数据库就有数据。困惑好久
9 楼 leyen 2007-09-25  
LZ,我想问一下你有没有遇见过HIBERNATE在处理BOOLEAN类型时转化的问题?在MYSQL5中,BOOLEAN类型被转成BIT(1),导致我的流程发布不上去,请问楼主是怎么解决的?
8 楼 chenyumao 2007-09-12  
楼上的你的这个功能,以前做过的项目中是自己写HQL获得的1. if (task.getName().equals(taskName) && !task.hasEnded())
7 楼 chenyumao 2007-09-12  
领先一步。楼上的你的
6 楼 dengzi725 2007-05-11  
谢谢 white182517    回答我我的问题。因为前次部门自己做了一个OA系统。工作流就是扩展jbpm。所以有点心得。 和呵。 
5 楼 pppppp 2007-05-09  
引用
       JBPM看来在国内并没有得到很多的应用,资料都比较稀缺,唯一的参考手册也是非常的浅显和简单。而其源码的注释不是很好,这在国外的开源软件中是很罕见的。

         JBPM提供的某些API不是很全,举个例子,假定我要查询某个角色某个时间段的所有任务列表。因为TaskMgmtSession仅提供了findXXXTaskInstances(String actorId)方法,所以我只能先查询出该角色的所有任务列表,采用如下代码:
java 代码

   1. TaskMgmtSession taskMgmtSession = context.getTaskMgmtSession();  
   2.  List tasks = taskMgmtSession.findPooledTaskInstances(actorId); 

        然后再在内存中使用类似如下代码进行过滤。
java 代码

   1. if (task.getName().equals(taskName) && !task.hasEnded()) 

这种方式太笨拙和低效了。

你可以看一下它是怎么查的,无非是使用hibernate的NamedQuery查询数据库,你可以在他的基础上添加一下过滤条件,而不用每次都查询所有的记录然后在过滤。在数据量大的时候全取出来性能是有问题的。
4 楼 white182517 2007-04-12  
引用
当你再去卸载这个流程的时候,这个流程未必能删除的了。 我有的时候会碰到这样的情况。


这个问题是因为你上述两段代码的作用只是删除了流程定义表中的记录,比如流程实例中的记录并没有得到删除,所以如果要使测试对数据没有破坏,最彻底的办法只能是每次启动前创建SCHEMA,停止时卸载SCHEMA。

引用
如果要关联业务实体和流程实例的话,你肯定要扩展jbpm的业务。将流程的相关信息保存到你定制的业务表中。

你说的是扩展JBPM的业务实体呢,还是在业务表中保留一些流程相关的信息?业务表中应该保留哪些相关信息,这个尺度的把握可能比较重要。

引用
那个插件已经很好理解的。 你直接把plugin考到你的eclipse的相关目录中即可。!!!!

安装插件很EASY,我不知道在Eclipse的Preference里JBOSS JBPM选项是如何设置,以及这个设置是用来做什么的?我目前只用他来画流程图。




3 楼 dengzi725 2007-04-11  
那个插件已经很好理解的。 你直接把plugin考到你的eclipse的相关目录中即可。!!!!
2 楼 dengzi725 2007-04-11  
如果要关联业务实体和流程实例的话,你肯定要扩展jbpm的业务。将流程的相关信息保存到你定制的业务表中。
1 楼 dengzi725 2007-04-11  
如果是发布流程到数据库的话:

JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
//由 processdefinition.xml 生成相对应的流程定义类 ProcessDefinition
InputStream is = new FileInputStream(
                "D:/oa/workflow/processes/PresaleHandlerForBusinessReport.xml");

ProcessDefinition processDefinition = ProcessDefinition.parseXmlInputStream(is);
        try {
            jbpmContext.deployProcessDefinition(processDefinition);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            jbpmContext.close();
        }

如果是卸载流程定义文件的话:

JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();

        JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();

        try {
            jbpmContext.getGraphSession().deleteProcessDefinition(Long.parseLong("5"));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            jbpmContext.close();
        }


记得jbpmContext一定要关闭。这里有个问题,假如你要删除的那个流程被使用的过的话,当你再去卸载这个流程的时候,这个流程未必能删除的了。  我有的时候会碰到这样的情况。

相关推荐

    struts+hibernate+spring+jbpm例

    Struts、Hibernate、Spring 和 jBPM 是四个在 Java 开发领域中广泛应用的框架和工具。这个例子结合了它们的功能,构建了一个完整的后端应用程序架构。 **Struts** 是一个 MVC(Model-View-Controller)框架,用于...

    jbpm4整合struts2+spring2.5+hibernate3.3

    【jbpm4整合struts2+spring2.5+hibernate3.3】的集成是企业级应用开发中常见的技术栈组合,旨在利用各框架的优势实现高效、灵活的业务流程管理。jbpm4是一个开源的工作流管理系统,用于定义、执行和管理业务流程。...

    JBPM5+Spring+Hibernate+MySQL 请假例子

    将JBPM5、Spring、Hibernate和MySQL整合在一起,可以实现一个完整的业务流程管理系统。JBPM5负责流程的定义和执行,Spring作为应用的框架,提供依赖注入和事务管理,使得各组件间协作顺畅;Hibernate作为ORM层,负责...

    Spring+hibernate4+SpringMVC+Jbpm4.4

    在本项目中,Jbpm 4.4 被整合到Spring框架中,用于实现流程驱动的应用,如审批流程、订单处理等。 **MySQL 数据库** MySQL 是一种流行的关系型数据库管理系统,广泛应用于Web应用。在本项目中,MySQL被选为后端...

    activiti+spring+srping Mvc+mybatis+maven整合

    本项目是关于"activiti+spring+spring Mvc+mybatis+maven"的整合,旨在创建一个基于Activiti工作流引擎、Spring、Spring MVC、MyBatis以及Maven的开发环境。下面将详细介绍这些技术及其整合过程。 首先,`activiti`...

    jbpm 整合到现有的spring+hibernate系统

    ### 整合JBPM到现有的Spring+Hibernate系统 在企业级应用开发中,流程管理和业务逻辑的自动化变得越来越重要。JBPM(JBoss Business Process Management)作为一款灵活且功能强大的工作流引擎,常被用于此类场景。...

    jbpm4.3与spring整合

    ### jbpm4.3与Spring框架的整合指南 在企业级应用开发中,流程管理引擎JBPM(JBoss Business Process Management)与Spring框架的结合使用是常见的一种技术方案。JBPM是一个灵活、强大的业务流程管理工具,而Spring...

    jbpm + spring + struts 项目

    这个项目是一个整合了jbpm(Java Business Process Management)、Spring框架和Struts框架的典型企业级应用。jbpm是用于业务流程管理的开源工具,Spring则提供了全面的后端服务管理,而Struts则是前端MVC(Model-...

    Jbpm4.4+hibernate3.5.4+spring3.0.4+struts2.1.8整合

    【JBPM4.4+Hibernate3.5.4+Spring3.0.4+Struts2.1.8整合】的整个过程涉及到多个关键组件的集成,这些组件都是Java企业级开发中的重要部分。首先,JBPM(Business Process Management)是一个开源的工作流引擎,它...

    jbpm+spring的web简单借款工作流实例项目5

    因为有点大所以分了8份 一个自己学习到现在的结果吧,自己做的一个完整的借款流程应用,主要是用到了SPRING,在整合的过程中遇到过不少问题。我的博客有一些说明http://yuyanshan.javaeye.com/&lt;br&gt;

    springmvc+hibernate+jbpm开发OA自动化办公后台管理系统源码.zip

    springmvc整合hibernate,jbpm实现快速开发办公系统 运行环境 jdk6+tomcat6+mysql+eclipse 项目技术(必填) spring mvc+hibernate+jbpm+jsp 数据库文件 压缩包sql/jroo.sql jar包文件 链接: ...

    ssh2+extjs+mysql

    Spring提供了事务管理、数据访问、远程访问等服务,并且可以与Struts2很好地整合,实现模型层的管理。 3. **Hibernate**:Hibernate是一个对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互。通过...

    jbpm5 spring3 整合实例

    在spring3中整合jbpm5的例子,前台用spring mvc3做了简单的页面。 其中用到了jbpm5的persistence,local human service等,简单、完整。 用的mysql数据库,修改下spring datasource的配置,然后用mvn jetty:run编译...

    国家电力系统ssh+mySql

    【国家电力系统ssh+mySql】是一个典型的Java企业级应用项目,主要采用了Spring、Struts2和Hibernate(SSH)这三大开源框架,并结合MySQL数据库来构建。该项目由传智播客进行开发,展示了在实际业务场景中如何有效地...

    ssh整合jbpm5.4

    SSH整合JBPM5.4是将Struts2、Spring3.1、Hibernate4.1这三大主流Java EE框架与业务流程管理(Business Process Management,简称BPM)工具JBPM5.4集成的过程。这个整合旨在提供一个高效、灵活且可扩展的企业级应用...

    jbpm整合ssh的例子

    【jbpm整合ssh的例子】是关于如何将Java业务流程管理(jbpm)系统与Spring(ssh中的S)、Struts(ssh中的s)和Hibernate(ssh中的h)这三大流行开源框架进行集成的一个示例项目。这个例子展示了在Tomcat应用服务器上...

    jbpm工作流整合

    1. **环境设置**:安装并配置jbpm所需的JDK、Maven以及相关的数据库(如MySQL或H2)。这些是运行jbpm的基础。 2. **jbpm服务的启动**:设置并启动jbpm的服务,如流程引擎、任务服务、历史服务等。这些服务构成了...

    jbpm与ssh框架整合

    jBPM整合步骤 - 引入jBPM相关库到项目中。 - 配置jBPM的工作流引擎,如数据库连接、工作流目录等。 - 在Spring中配置jBPM的SessionFactory和Service,以便在业务逻辑中调用jBPM的服务。 - 设计和导入流程定义文件...

    jbpm4.4与ssh框架的整合

    ### jBPM 4.4与SSH框架的整合:深入解析与实践 #### jBPM:Java业务流程管理引擎 jBPM,全称为java Business Process Management,是JBoss旗下的一款开源工作流引擎,专为Java EE环境设计,提供了一种轻量级的解决...

Global site tag (gtag.js) - Google Analytics