paulwong

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

          如果不結(jié)合其他的框架進(jìn)行整個(gè)開(kāi)發(fā)(如:spring、hibernate),JBPM4也有自己的一套IOC容器,能后將自己的服務(wù)配置到IOC容器中,能夠很容易的運(yùn)行容器所配置的服務(wù),
          這樣它也能夠在代碼中減少一陀一陀的工廠類等代碼的調(diào)用,降低了偶核性,但是如果結(jié)合spring框架來(lái)進(jìn)行整個(gè)開(kāi)發(fā)的話,那么就有兩個(gè)容器,兩個(gè)SessionFactory,但是系統(tǒng)中只考慮一個(gè)容器來(lái)
          對(duì)服務(wù)進(jìn)行管理, 那么我們就要將jbpm4的服務(wù)移植到spring的IOC容器中,讓spring來(lái)進(jìn)行統(tǒng)一管理,這樣通過(guò)spring的容器來(lái)管理服務(wù)、事務(wù)。
          在網(wǎng)上,不管是百度、還是谷歌 搜索了一下,截至到目前(2009-08-29),沒(méi)有搜索出一個(gè)JBPM4結(jié)合其他框架的完成例子,都是一些簡(jiǎn)單的介紹,而且所有文章大同小異,雖然文章上千章,但是好像出自
          一個(gè)之手,但是此人也只是大概講解了一下,可能有些人會(huì)認(rèn)為用JBPM4結(jié)合其他框架進(jìn)行整合是非常簡(jiǎn)單,那么你的想法是錯(cuò)誤的,JBPM4整合其他框架對(duì)JBPM4的IOC理解要非常清楚,同時(shí),要對(duì)部分源代碼進(jìn)行了解,才可能一步一步的搭建起來(lái)框架,下面介紹下我以struts2+spring2.5+hibernate3.4+jbpm4來(lái)搭建的一個(gè)框架,并且成功部署的過(guò)程

          ssh2的框架搭建我這里就不啰嗦了,我主要就這個(gè)框架的基礎(chǔ)上來(lái)整合jbpm4

          第一步:加入jbpm4的jpdl插件,這個(gè)步驟非常簡(jiǎn)單,但是可能會(huì)出現(xiàn)下面的錯(cuò)誤
              把jbpm4加入到項(xiàng)目中遇到的問(wèn)題:
               無(wú)法導(dǎo)入插件jpdl(導(dǎo)入插件后沒(méi)有出現(xiàn)可視化流程操作器的入口,無(wú)法進(jìn)行可視化流程建立)
              解決方法:
              先前本人使用myeclipse6.0.1,在此版本上本人做過(guò)JBPM3的項(xiàng)目,在做JBPM4時(shí),很自然的想到在該IDE上進(jìn)行JBPM4的開(kāi)發(fā),但是一直都無(wú)法成功江JBPM4的jpdl插件安裝成功,因此
              不斷的換各種安裝插件的方式,浪費(fèi)了很多時(shí)間,后無(wú)意在myclipse7.1.1中嘗試安裝jpdl插件,竟然成功,后才發(fā)現(xiàn)myeclipse6不支持jbpm4,最終本人選擇IDE myclipse7.1.1來(lái)進(jìn)行
              開(kāi)發(fā).

           


          第二步:創(chuàng)建JBPM4的數(shù)據(jù)庫(kù)文件、JBPM4相關(guān)jar包、JBPM4的相關(guān)配置文件
              數(shù)據(jù)庫(kù)文件:解壓下載的jbpm4.0, jbpm4.0根目錄下的db\schema.scripts目錄下,這里存放的是jbpm4數(shù)據(jù)庫(kù)文件的腳本,根據(jù)自己的需要選擇相應(yīng)數(shù)據(jù)庫(kù)腳本文件進(jìn)行導(dǎo)入

             JBPM4的jar包:jbpm4.0根目錄下jbpm.jar

                                 jbpm4-spring.jar,這兩個(gè)jar文件內(nèi)容大致相同,但是某些類也是對(duì)方所不具有的

                                 lib目下的相關(guān)jar包(不要全部導(dǎo)入,因?yàn)檫@里包含hibernate,還有一些公共的jar包,可能你的工程中已經(jīng)含有這些jar包,根據(jù)需要導(dǎo)入相關(guān)的jar包即可)

          JBPM4的相關(guān)配置文件:

          鑒于大家jbpm對(duì)配置文件位置的存放不清楚,以及因?yàn)榘姹镜牟煌?造成文件內(nèi)容和文件名不一樣,所以對(duì)需要在項(xiàng)目中導(dǎo)入的文件及內(nèi)容(基本配置)做了一個(gè)總結(jié):

          jbpm.cfg.xml,內(nèi)容如下:

          <?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" />  
            
            
          <!-- Job executor is excluded for running the example test cases. -->  
            
          <!-- To enable timers and messages in production use, this should be included. -->  
            
          <!--  
            <import resource="jbpm.jobexecutor.cfg.xml" />  
            
          -->  
            
            
          <import resource="jbpm.mail.templates.examples.xml" />  
            
            
          </jbpm-configuration>  


          jbpm.mail.properties,文件內(nèi)容:

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


          jbpm.mail.templates.examples.xml,文件內(nèi)容:

          <?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,文件內(nèi)容:



          <?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 />  
          <!--   
              <hibernate-configuration>  
                <cfg resource="jbpm.hibernate.cfg.xml" />  
              </hibernate-configuration>  
            
              <hibernate-session-factory />  
          -->  
              
          <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'>  
                
          <to users="${task.assignee}"/>  
                
          <subject>${task.name}</subject>  
                
          <text><![CDATA[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'>  
                
          <to users="${task.assignee}"/>  
                
          <subject>${task.name}</subject>  
                
          <text><![CDATA[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,文件內(nèi)容:

          <?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,文件內(nèi)容:

          <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%n</Pattern>  
          <!--  
                      <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>  
          -->  
                  
          </layout>  
              
          </appender>  
            
              
          <root level="info">  
                  
          <appender-ref ref="STDOUT" />  
              
          </root>  
          </configuration>  


          sql-error-codes.xml,文件內(nèi)容:

          該文件內(nèi)容較多,搜索一下jbpm4.0包下的文件,應(yīng)該都有

           

          上述文件存放在src目錄下

           

           

          第三步:添加JBPM4的服務(wù)到spring IOC容器中
             1.jbpm.spring.default.cfg.xml(jbpm.spring.default.cfg.xml)配置文件進(jìn)行修改,將下面的部分配置注釋掉
              <hibernate-configuration>
                <cfg resource="jbpm.hibernate.cfg.xml" />
              </hibernate-configuration>
              <hibernate-session-factory />
             注釋的部分是在jBPM4中創(chuàng)建了sessionFactory,因?yàn)橐呀?jīng)有了spring管理sessionFactory,因此我們只需要一個(gè)sessionFactory。既然要將jBPM4與Spring的整合,那就希望由Spring來(lái)統(tǒng)一管理   sessionFactory和事務(wù),在Spring的配置文件中構(gòu)造一個(gè)sessionFactory。一切由它與外部交互.

             2.上面已經(jīng)屏蔽了jbpm4的sessionFactory,那么此處要新建立一個(gè)ProcessEngineFactoryBean類,該類用來(lái)初始化JBPM4的相關(guān)配置文件、工作流引擎,并且把sessionFactory的創(chuàng)建交給spring的容器       進(jìn)行管理,在ProcessFactoryBean中創(chuàng)建一個(gè)SpringConfiguration,然后將sessionFactory放入 SpringConfiguration中,再?gòu)腟pringConfiguration得到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的流程引擎接口,所有的功能服務(wù)都是從這里獲取的,包括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>


          通過(guò)上述我們創(chuàng)建了工作流引擎,那么這個(gè)時(shí)候我們可以通過(guò)配置來(lái)管理JBPM4中的服務(wù)(ProcessEngine接口中的服務(wù),如:創(chuàng)建流程的服務(wù)、執(zhí)行流程的服務(wù)等),這樣做的目的是不想一陀一陀的工廠     類在代碼中出現(xiàn),由spring的注入功能來(lái)實(shí)現(xiàn),如下配置(在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的服務(wù)到spring IOC容器中錯(cuò)誤:
             注意:所有的jbpm4的配置文件必須在src目錄下,并且不能有獨(dú)立的目錄,因?yàn)樵诔跏蓟l(fā)布流程的代碼中
          ProcessEngine processEngine = new Configuration().buildProcessEngine();
          因?yàn)镴bpmConfiguration extends Configuration implements Context, ProcessEngine, EnvironmentFactory  因此會(huì)
          調(diào)用JbpmConfiguration類中buildProcessEngine()方法來(lái)創(chuàng)建ProcessEngine來(lái)得到JBPM4的服務(wù),在這個(gè)方法中,有這樣一段代碼


          if (!isConfigured) {
                setResource("jbpm.cfg.xml");
              }


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

           

           

          第四步:加入JBPM4的實(shí)體關(guān)系映射文件:



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


          可能會(huì)出現(xiàn)的問(wèn)題: 啟動(dòng)中如果提示:找不到org.jbpm.jpdl.internal.model.JpdlExecution,那么這個(gè)時(shí)候,應(yīng)該添加一個(gè)jbpm4-spring.jar文件,因?yàn)樵搄ar中有此實(shí)體


          第五步:
              請(qǐng)務(wù)必配置事務(wù),JBPM4已經(jīng)將事務(wù)改成從當(dāng)前的Threadlocal中獲得,所以jBPM4是必須當(dāng)前有事務(wù),如果我沒(méi)有創(chuàng)建事務(wù)的話,在使用 processEngine時(shí)就會(huì)說(shuō)事務(wù)沒(méi)有啟動(dòng)。  

            

          因?yàn)樵撐恼率窃诔晒\(yùn)行后書(shū)寫(xiě)的,可能某些步驟漏寫(xiě),或者描述不清楚,而無(wú)法成功整合,導(dǎo)致報(bào)錯(cuò),請(qǐng)大家把報(bào)錯(cuò)信息貼出來(lái),讓我對(duì)文章作相應(yīng)的修改,讓參照著能夠成功整合運(yùn)行。

          posted on 2009-09-07 00:46 paulwong 閱讀(6889) 評(píng)論(7)  編輯  收藏 所屬分類: JBPM

          Feedback

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

          喲西,不錯(cuò)哈。lz還不錯(cuò)哦  回復(fù)  更多評(píng)論   

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

          請(qǐng)問(wèn)樓主 jbpm.spring.default.cfg.xml文件 是你自己加的嗎?我怎么找不到這個(gè)xml  回復(fù)  更多評(píng)論   

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

          請(qǐng)問(wèn),如果用entityManagerFactory而不是sessionFactoy管理的Spring文件怎么整合啊,謝謝。  回復(fù)  更多評(píng)論   

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

          jbpm4.1中SpringConfiguration沒(méi)有這個(gè)方法

          cfg.setSessionFactory(sessionFactory);

          怎么辦?  回復(fù)  更多評(píng)論   

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

          我想請(qǐng)教一下,我在注入processEngine這個(gè)bean的時(shí)候,錯(cuò)誤提示我有2個(gè)bean,而我在applicationContext.xml里面只有配置一個(gè)。像我注入responseService等卻不會(huì)有這種錯(cuò)誤,這是什么原因呢?  回復(fù)  更多評(píng)論   

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

          我的配置和你的配置差不多,但是我卻在注入processEngine的時(shí)候提示錯(cuò)誤:No unique bean of type [org.jbpm.api.ProcessEngine] is defined: expected single matching bean but found 2: [jbpmConfiguration, processEngine],而注入responseService...卻不會(huì)有這錯(cuò)誤,想請(qǐng)你幫忙看下。  回復(fù)  更多評(píng)論   

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

          關(guān)于JBPM4.4與SSH2之整合
          請(qǐng)參見(jiàn) http://zwllxs.javaeye.com/blog/726303
          里面有每一步的詳細(xì)講解,并附上完整的可運(yùn)行源碼和所有jar包列表  回復(fù)  更多評(píng)論   


          主站蜘蛛池模板: 广东省| 宿州市| 洪雅县| 于田县| 新余市| 黄石市| 衡水市| 台北县| 武冈市| 斗六市| 运城市| 旌德县| 石首市| 永春县| 南阳市| 咸宁市| 樟树市| 贵定县| 泸定县| 崇阳县| 安图县| 广平县| 财经| 连州市| 吉水县| 遵化市| 夏河县| 湘乡市| 仙游县| 汉寿县| 乌鲁木齐市| 久治县| 辉南县| 郧西县| 凭祥市| 昆明市| 仪陇县| 青海省| 祁门县| 中牟县| 伊川县|