jbpm4整合struts2 spring2.5 hibernate3.3 -凯发k8网页登录

jbpm4整合struts2 spring2.5 hibernate3.3

如果不结合其他的框架进行整个开发(如:spring、hibernate),jbpm4也有自己的一套ioc容器,能后将自己的服务配置到ioc容器中,能够很容易的运行容器所配置的服务,
这样它也能够在代码中减少一陀一陀的工厂类等代码的调用,降低了偶核性,但是如果结合spring框架来进行整个开发的话,那么就有两个容器,两个sessionfactory,但是系统中只考虑一个容器来
对服务进行管理, 那么我们就要将jbpm4的服务移植到spring的ioc容器中,让spring来进行统一管理,这样通过spring的容器来管理服务、事务。
在网上,不管是百度、还是谷歌 搜索了一下,截至到目前(2009-08-29),没有搜索出一个jbpm4结合其他框架的完成例子,都是一些简单的介绍,而且所有文章大同小异,虽然文章上千章,但是好像出自
一个之手,但是此人也只是大概讲解了一下,可能有些人会认为用jbpm4结合其他框架进行整合是非常简单,那么你的想法是错误的,jbpm4整合其他框架对jbpm4的ioc理解要非常清楚,同时,要对部分源代码进行了解,才可能一步一步的搭建起来框架,下面介绍下我以struts2 spring2.5 hibernate3.4 jbpm4来搭建的一个框架,并且成功部署的过程

ssh2的框架搭建我这里就不啰嗦了,我主要就这个框架的基础上来整合jbpm4

第一步:加入jbpm4的jpdl插件,这个步骤非常简单,但是可能会出现下面的错误
    把jbpm4加入到项目中遇到的问题:
     无法导入插件jpdl(导入插件后没有出现可视化流程操作器的入口,无法进行可视化流程建立)
    解决方法:
    先前本人使用myeclipse6.0.1,在此版本上本人做过jbpm3的项目,在做jbpm4时,很自然的想到在该ide上进行jbpm4的开发,但是一直都无法成功江jbpm4的jpdl插件安装成功,因此
    不断的换各种安装插件的方式,浪费了很多时间,后无意在myclipse7.1.1中尝试安装jpdl插件,竟然成功,后才发现myeclipse6不支持jbpm4,最终本人选择ide myclipse7.1.1来进行
    开发.

 


第二步:创建jbpm4的数据库文件、jbpm4相关jar包、jbpm4的相关配置文件
    数据库文件:解压下载的jbpm4.0, jbpm4.0根目录下的db\schema.scripts目录下,这里存放的是jbpm4数据库文件的脚本,根据自己的需要选择相应数据库脚本文件进行导入

   jbpm4的jar包:jbpm4.0根目录下jbpm.jar

                       jbpm4-spring.jar,这两个jar文件内容大致相同,但是某些类也是对方所不具有的

                       lib目下的相关jar包(不要全部导入,因为这里包含hibernate,还有一些公共的jar包,可能你的工程中已经含有这些jar包,根据需要导入相关的jar包即可)

jbpm4的相关配置文件:

鉴于大家jbpm对配置文件位置的存放不清楚,以及因为版本的不同,造成文件内容和文件名不一样,所以对需要在项目中导入的文件及内容(基本配置)做了一个总结:

jbpm.cfg.xml,内容如下:

xml version="1.0" encoding="utf-8"?>  
  
<jbpm-configuration>  
  
  
<import resource="jbpm.spring.default.cfg.xml" />  
  
<import resource="jbpm.spring.hibernate.cfg.xml" />  
  
<import resource="jbpm.jpdl.cfg.xml" />  
  
<import resource="jbpm.identity.cfg.xml" />  
  
  
  
  
  
  
  
  
  
<import resource="jbpm.mail.templates.examples.xml" />  
  
  
jbpm-configuration>  


jbpm.mail.properties,文件内容:

mail.smtp.host  localhost   
mail.smtp.port  2525   
mail.from       noreply@jbpm.org  


jbpm.mail.templates.examples.xml,文件内容:

xml version="1.0" encoding="utf-8"?>  
  
<jbpm-configuration>  
  
  
<process-engine-context>  
  
    
<mail-template name="rectify-template">  
      
<to addresses="${addressee}" />  
      
<cc users="bb" groups="innerparty" />  
      
<bcc groups="thinkpol" />  
      
<subject>rectify ${newspaper}subject>  
      
<text>${newspaper} ${date} ${details}text>  
    
mail-template>  
  
  
process-engine-context>  
  
jbpm-configuration>  


jbpm.spring.default.cfg.xml,文件内容:



xml version="1.0" encoding="utf-8"?>  
  
<jbpm-configuration>  
  
  
<process-engine-context>  
  
    
<repository-service />  
    
<repository-cache />  
    
<execution-service />  
    
<history-service />  
    
<management-service />  
    
<identity-service />  
    
<task-service />  
  
    
<script-manager default-expression-language="juel"  
                    default-script-language
="juel"  
                    read-contexts
="execution, environment, process-engine"  
                    write-context
="">  
      
<script-language name="juel" factory="org.jbpm.pvm.internal.script.juelscriptenginefactory" />  
    
script-manager>  
  
    
<authentication />  
  
    
<id-generator />  
    
<types resource="jbpm.variable.types.xml" />  
  
    
<address-resolver />  
  
    
<business-calendar>  
      
<monday    hours="9:00-12:00 and 12:30-17:00"/>  
      
<tuesday   hours="9:00-12:00 and 12:30-17:00"/>  
      
<wednesday hours="9:00-12:00 and 12:30-17:00"/>  
      
<thursday  hours="9:00-12:00 and 12:30-17:00"/>  
      
<friday    hours="9:00-12:00 and 12:30-17:00"/>  
      
<holiday period="01/07/2008 - 31/08/2008"/>  
    
business-calendar>  
  
    
<mail-template name='task-notification'>  
      
="${task.assignee}"/>  
      
<subject>${task.name}subject>  
      
<text>hi ${task.assignee},  
task "${task.name}" has been assigned to you.  
${task.description}  
 
sent by jboss jbpm  
]]>text>  
    
mail-template>  
  
    
<mail-template name='task-reminder'>  
      
="${task.assignee}"/>  
      
<subject>${task.name}subject>  
      
<text>hey ${task.assignee},  
do not forget about task "${task.name}".  
${task.description}  
 
sent by jboss jbpm  
]]>text>  
    
mail-template>  
  
  
process-engine-context>  
  
  
<transaction-context>  
    
<repository-session />  
    
<db-session />  
  
    
<message-session />  
    
<timer-session />  
    
<history-session />  
    
<mail-session>  
      
<mail-server>  
        
<session-properties resource="jbpm.mail.properties" />  
      
mail-server>  
    
mail-session>  
  
transaction-context>  
  
jbpm-configuration>  


jbpm.spring.hibernate.cfg.xml,文件内容:

xml version="1.0" encoding="utf-8"?>  
  
<jbpm-configuration>  
  
  
<process-engine-context>  
    
<command-service>  
      
<retry-interceptor />  
      
<environment-interceptor />  
      
<spring-transaction-interceptor />  
    
command-service>  
  
process-engine-context>  
  
  
<transaction-context>  
    
<transaction />  
    
<hibernate-session />  
  
transaction-context>  
  
jbpm-configuration>  


logback.xml,文件内容:

<configuration>  
    
<appender name="stdout" class="ch.qos.logback.core.consoleappender">  
        
<layout class="ch.qos.logback.classic.patternlayout">  
            
<pattern>%d{hh:mm:ss.sss} %-5level %logger{36} - %msg%npattern>  
  
        
layout>  
    
appender>  
  
    
<root level="info">  
        
<appender-ref ref="stdout" />  
    
root>  
configuration>  


sql-error-codes.xml,文件内容:

该文件内容较多,搜索一下jbpm4.0包下的文件,应该都有

 

上述文件存放在src目录下

 

 

第三步:添加jbpm4的服务到spring ioc容器中
   1.jbpm.spring.default.cfg.xml(jbpm.spring.default.cfg.xml)配置文件进行修改,将下面的部分配置注释掉
   
     
   

   
   注释的部分是在jbpm4中创建了sessionfactory,因为已经有了spring管理sessionfactory,因此我们只需要一个sessionfactory。既然要将jbpm4与spring的整合,那就希望由spring来统一管理   sessionfactory和事务,在spring的配置文件中构造一个sessionfactory。一切由它与外部交互.

   2.上面已经屏蔽了jbpm4的sessionfactory,那么此处要新建立一个processenginefactorybean类,该类用来初始化jbpm4的相关配置文件、工作流引擎,并且把sessionfactory的创建交给spring的容器       进行管理,在processfactorybean中创建一个springconfiguration,然后将sessionfactory放入 springconfiguration中,再从springconfiguration得到processengine,代码如下:


public class processenginefactorybean implements factorybean,   
    initializingbean, disposablebean, applicationcontextaware 
{   
    
private string jbpmconfigurationlocation = "jbpm.cfg.xml";   
    
private sessionfactory sessionfactory;   
    
private applicationcontext applicationcontext;   
    
private processengine processengine;//jbpm4的流程引擎接口,所有的功能服务都是从这里获取的,包括respoistoryservice、executionservice   
  
    
public object getobject() throws exception {   
        
return processengine;   
    }
   
  
    @suppresswarnings(
"unchecked")   
    
public class getobjecttype() {   
        
return processengine.class;   
    }
   
  
    
public boolean issingleton() {   
        
return true;   
    }
   
  
    
public void afterpropertiesset() {   
        springconfiguration cfg 
= new springconfiguration(jbpmconfigurationlocation);   
        cfg.setapplicationcontext(applicationcontext);   
        cfg.setsessionfactory(sessionfactory);   
        
this.processengine = cfg.buildprocessengine();   
    }
   
  
    
public void destroy() {   
        
this.processengine = null;   
        
this.sessionfactory = null;   
    }
   
  
    
public void setjbpmconfigurationlocation(   
        string jbpmconfigurationlocation) 
{   
        
this.jbpmconfigurationlocation = jbpmconfigurationlocation;   
    }
   
  
    
public void setsessionfactory(sessionfactory sessionfactory) {   
        
this.sessionfactory = sessionfactory;   
    }
   
  
    
public void setapplicationcontext(   
        applicationcontext applicationcontext) 
throws beansexception {   
        
this.applicationcontext = applicationcontext;   
    }
   
}
  

并且在spring配置文件中加入如下配置:   

<bean id="processengine" class="com.bestsoft.ssh.service.impl.flow.processenginefactorybean">
       
<property name="sessionfactory" ref="sessionfactory"/> 
     
bean>


通过上述我们创建了工作流引擎,那么这个时候我们可以通过配置来管理jbpm4中的服务(processengine接口中的服务,如:创建流程的服务、执行流程的服务等),这样做的目的是不想一陀一陀的工厂     类在代码中出现,由spring的注入功能来实现,如下配置(在spring配置文件中):


<bean id="repositoryservice" factory-bean="processengine" factory-method="getrepositoryservice" />
    
<bean id="executionservice" factory-bean="processengine" factory-method="getexecutionservice" />
    
<bean id="historyservice" factory-bean="processengine" factory-method="gethistoryservice" />
    
<bean id="managementservice" factory-bean="processengine" factory-method="getmanagementservice" />
    
<bean id="taskservice" factory-bean="processengine" factory-method="gettaskservice" />
    
<bean id="identityservice" factory-bean="processengine" factory-method="getidentityservice" /> 


添加jbpm4的服务到spring ioc容器中错误:
   注意:所有的jbpm4的配置文件必须在src目录下,并且不能有独立的目录,因为在初始化发布流程的代码中
processengine processengine = new configuration().buildprocessengine();
因为jbpmconfiguration extends configuration implements context, processengine, environmentfactory  因此会
调用jbpmconfiguration类中buildprocessengine()方法来创建processengine来得到jbpm4的服务,在这个方法中,有这样一段代码


if (!isconfigured) {
      setresource("jbpm.cfg.xml");
    }


它会去src下找jbpm.cfg.xml文件,如果配置文件不在src目录下,那么就会找不到配置文件(jbpm.cfg.xml)

 

 

第四步:加入jbpm4的实体关系映射文件:



        <property name="mappinglocations">
            
<list>
                
<value>classpath*:jbpm.repository.hbm.xmlvalue>
                
<value>classpath*:jbpm.execution.hbm.xmlvalue>
                
<value>classpath*:jbpm.history.hbm.xmlvalue>
                
<value>classpath*:jbpm.task.hbm.xmlvalue>
                
<value>classpath*:jbpm.jpdl.hbm.xmlvalue>
                
<value>classpath*:jbpm.identity.hbm.xmlvalue>
            
list>
        
property>


可能会出现的问题: 启动中如果提示:找不到org.jbpm.jpdl.internal.model.jpdlexecution,那么这个时候,应该添加一个jbpm4-spring.jar文件,因为该jar中有此实体


第五步:
    请务必配置事务,jbpm4已经将事务改成从当前的threadlocal中获得,所以jbpm4是必须当前有事务,如果我没有创建事务的话,在使用 processengine时就会说事务没有启动。  

  

因为该文章是在成功运行后书写的,可能某些步骤漏写,或者描述不清楚,而无法成功整合,导致报错,请大家把报错信息贴出来,让我对文章作相应的修改,让参照着能够成功整合运行。

posted on 2009-09-07 00:46 paulwong 阅读(6821) 评论(7)     所属分类: jbpm

feedback

# re: jbpm4整合struts2 spring2.5 hibernate3.3 2009-09-15 15:41

哟西,不错哈。lz还不错哦  回复     

# re: jbpm4整合struts2 spring2.5 hibernate3.3 2009-09-15 15:53

请问楼主 jbpm.spring.default.cfg.xml文件 是你自己加的吗?我怎么找不到这个xml  回复     

# re: jbpm4整合struts2 spring2.5 hibernate3.3 2009-11-05 16:54

请问,如果用entitymanagerfactory而不是sessionfactoy管理的spring文件怎么整合啊,谢谢。  回复     

# re: jbpm4整合struts2 spring2.5 hibernate3.3 2009-11-08 12:36

jbpm4.1中springconfiguration没有这个方法

cfg.setsessionfactory(sessionfactory);

怎么办?  回复     

# re: jbpm4整合struts2 spring2.5 hibernate3.3 2009-12-13 22:15

我想请教一下,我在注入processengine这个bean的时候,错误提示我有2个bean,而我在applicationcontext.xml里面只有配置一个。像我注入responseservice等却不会有这种错误,这是什么原因呢?  回复     

# re: jbpm4整合struts2 spring2.5 hibernate3.3 2009-12-13 22:38

我的配置和你的配置差不多,但是我却在注入processengine的时候提示错误:no unique bean of type [org.jbpm.api.processengine] is defined: expected single matching bean but found 2: [jbpmconfiguration, processengine],而注入responseservice...却不会有这错误,想请你帮忙看下。  回复     

# re: jbpm4整合struts2 spring2.5 hibernate3.3 2010-08-01 00:10

关于jbpm4.4与ssh2之整合
请参见
里面有每一步的详细讲解,并附上完整的可运行源码和所有jar包列表  回复     



只有注册用户后才能发表评论。


网站导航:
              
相关文章:
 
网站地图