沉睡森林@漂在北京

          本處文章除注明“轉(zhuǎn)載”外均為原創(chuàng),轉(zhuǎn)載請注明出處。

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            152 隨筆 :: 4 文章 :: 114 評論 :: 0 Trackbacks

          1. 將osworkflow與spring和hibernate結(jié)合的原因

              1)簡化對osworkflow的配置

              2)利用hibernate框架的一些特性,如持久化,緩存等

              3)事務(wù)管理,osworkflow本身是不支持事務(wù)的,而事務(wù)是作為一個產(chǎn)品的基本功能

              4)可以利用spring加入其它的擴展功能,如用戶認(rèn)證和鑒權(quán)。這點本文沒有介紹。

          2、準(zhǔn)備

              下載osworkflow-2.8.0版本 ,下載hibernate-3.2版本,下載spring-framework-2.5.5版本

          3、搭建eclipse環(huán)境

            測試的工程目錄如下:

          src  源代碼目錄

             oswf  包路徑

                 Test.java 測試類,后面會給出源代碼

          bin  編譯目的目錄

              oswf 包路徑

                   Test.class  編譯生成的class文件

             //下面的幾個配置文件位于bin目錄下

              log4j.properties 這是log4j的配置文件,這可以不需要

              //下面三個hbm.xml文件是osworkflow持久化的o/r映射文件,這是從osworkflow的源代碼目錄com"opensymphony"workflow"spi"hibernate3下拷出來的。

              HibernateCurrentStep.hbm.xml

              HibernateHistoryStep.hbm.xml

              HibernateWorkflowEntry.hbm.xml

              //下面三個文件直接從osworkflow自帶的例子中獲取的,其中example.xml是流程定義文件。osuser.xml是osuser的配置文件。workflows.xml是osworkflow配置有哪些流程定義的配置文件。

              example.xml

              osuser.xml

              workflows.xml

          osworkflow-spring.xml  //這是spring 的配置文件,位于根目錄下,后面會給出源代碼

          //下面兩個是eclipse的工程文件

          .project

          .classpath

          4、編寫spring 的beans.xml配置文件

            文件名如osworkflow-spring.xml,內(nèi)容如下:

          <?xml version="1.0" encoding="UTF-8"?>
          <beans xmlns="http://www.springframework.org/schema/beans"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

          <!-- 下面配置數(shù)據(jù)源datasource,這里用的是spring 自帶的一個測試用的連接池。也可以用開源的連接池Jakarta Commons DBCP。
          如果程序是運行在servlet容器中,如tomcat中,可直接使用在tomcat中配置的數(shù)據(jù)庫連接池jdni。
          這里給出的是oracle數(shù)據(jù)庫驅(qū)動,可以換成任意的數(shù)據(jù)庫,如mysql等。 -->

          <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close">
              <property name="driverClassName">
                  <value>oracle.jdbc.driver.OracleDriver</value>
              </property>
              <property name="url">
                  <value>jdbc:oracle:thin:@127.0.0.1:1521:orcl</value>
              </property>
              <property name="username">
                  <value>test</value>
              </property>
              <property name="password">
                  <value>test</value>
              </property>
          </bean>
              
          <!-- 配置hibernate的sessionFactory以及相關(guān)的配置,這是使用hibernate的入口-->
           <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            <property name="dataSource"><ref local="dataSource"/></property>
            <property name="mappingResources">
             <list>
              <value>HibernateCurrentStep.hbm.xml</value>
              <value>HibernateHistoryStep.hbm.xml</value>
              <value>HibernateWorkflowEntry.hbm.xml</value>    
             </list>
            </property>
            <property name="hibernateProperties">
             <props>
              <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9iDialect</prop>
              <prop key="hibernate.current_session_context_class">thread</prop>
              <prop key="hibernate.hbm2ddl.auto">create-drop</prop>
             </props>
            </property>
           </bean>

          <!-- 配置osworkflow中所用的propertyset,這里配置的是默認(rèn)的內(nèi)存方式的propertyset。-->
           <bean id="propertySetDelegate" class="com.opensymphony.workflow.util.PropertySetDelegateImpl"> 
           </bean>

          <!-- 配置osworkflow的存儲工廠WorkflowStore -->
           <bean id="workflowStore" class="com.opensymphony.workflow.spi.hibernate3.SpringHibernateWorkflowStore">
            <property name="sessionFactory"><ref local="sessionFactory"/></property>
            <property name="propertySetDelegate"> <ref bean="propertySetDelegate"/> </property>
           </bean>

              <!-- 配置osworkflow的工廠類 -->
           <bean id="workflowFactory" class="com.opensymphony.workflow.spi.hibernate.SpringWorkflowFactory" init-method="init">
                  <property name="resource"><value>workflows.xml</value></property>
                  <property name="reload"><value>false</value></property>
           </bean>

           <bean id="osworkflowConfiguration" class="com.opensymphony.workflow.config.SpringConfiguration">
            <property name="store"><ref local="workflowStore"/></property>
            <property name="factory"><ref local="workflowFactory"/></property>  
           </bean>

             <!-- 配置osworkflow的工作流接口。注意下面的構(gòu)造函數(shù)參數(shù)值test是用戶名 -->
           <bean id="workflowTarget" class="com.opensymphony.workflow.basic.BasicWorkflow">
            <constructor-arg><value>test</value></constructor-arg>
            <property name="configuration"><ref local="osworkflowConfiguration"/></property> 
           </bean>

              <!-- 下面的配置是配置讓oswrorkflow使用spring的事務(wù)框架 -->
          <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
             <property name="sessionFactory" ref="sessionFactory"/>
          </bean>

          <!-- 應(yīng)用程序在代碼中唯一要關(guān)注的就只有這一個Bean,其它不用關(guān)注 -->
          <bean id="workflow" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
           <property name="transactionManager" ref="transactionManager"/>
           <property name="target" ref="workflowTarget"/>

           <property name="transactionAttributes">
            <props>
             <prop key="*">PROPAGATION_REQUIRED</prop>
            </props>
           </property>
          </bean>

          </beans>

          5、編寫測試代碼,只有一個類,代碼如下:

          package oswf;

          import org.springframework.beans.factory.xml.XmlBeanFactory;
          import org.springframework.core.io.FileSystemResource;
          import org.springframework.core.io.Resource;

          import com.opensymphony.user.Group;
          import com.opensymphony.user.User;
          import com.opensymphony.user.UserManager;
          import com.opensymphony.workflow.Workflow;

          public class Test {


           public static void main(String[] args) {
            
            try{
            UserManager um = UserManager.getInstance();
               User test = um.createUser("test");
               test.setPassword("test");

               Group foos = um.createGroup("foos");
               Group bars = um.createGroup("bars");
               Group bazs = um.createGroup("bazs");

               test.addToGroup(foos);
               test.addToGroup(bars);
               test.addToGroup(bazs);
            }
            catch(Exception e){
             System.out.println("create user error,app exit");
             return;
            }
            System.out.println("create user success");

            Resource res = new FileSystemResource("osworkflow-spring.xml");
            XmlBeanFactory beanFactory =new XmlBeanFactory(res);
            Workflow workflow = (Workflow) beanFactory.getBean("workflow"); 
            
            try { 
             workflow.initialize("example", 100, null); 
            } catch (Exception e) 
            { 
             e.printStackTrace(); 
            }
           }
          }
          代碼是,首先要創(chuàng)建一個用戶(這里使用的是osworkflow默認(rèn)綁定的osuser框架)。然后獲取workflow  bean,再調(diào)用initialize方法創(chuàng)建一個新的流程。

          6、問題

              1)osworkflow使用了propertyset框架,但propertyset框架和osworkflow都是opensymphony下的一個開源項目。osworkflow中提供的propertyset jar包不支持hibernate3,因此本例子中是使用內(nèi)存化的propertyset,沒有持久化propertyset。

          2)osworkflow中的BasicWorkflow類的構(gòu)造函數(shù)必須提供一個參數(shù),參數(shù)是osuser中的用戶。而且沒有提供設(shè)置用戶的set方法,這樣就只能在配置文件中把用戶名寫死。這只能用在測試環(huán)境中。在實際中需要修改這個代碼,支持動態(tài)設(shè)置用戶。

          3)osuser框架不支持通過hibernate持久化,如果要支持,需要自己下載源代碼改寫。但osuser支持通過jdbc持久化。

          posted on 2010-05-06 15:47 王總兵 閱讀(1872) 評論(0)  編輯  收藏 所屬分類: Workflow
          主站蜘蛛池模板: 望城县| 清新县| 吴江市| 类乌齐县| 武陟县| 平远县| 芷江| 清镇市| 巴中市| 亳州市| 海安县| 康乐县| 东莞市| 岢岚县| 同德县| 萍乡市| 军事| 进贤县| 马尔康县| 江源县| 琼海市| 彩票| 乐平市| 宁夏| 江达县| 蒙城县| 资兴市| 曲水县| 海兴县| 杨浦区| 渑池县| 威信县| 子长县| 敦煌市| 哈巴河县| 温宿县| 江达县| 囊谦县| 江津市| 河南省| 湾仔区|