天天看點

bboss持久層事務管理元件托管第三方持久層架構(mybatis等)事務功能介紹

bboss持久層事務管理元件托管第三方持久層架構(mybatis等)事務功能介紹

bboss持久層架構中的TXDataSource資料源類,可以實作第三方資料庫事務代理功能

com.frameworkset.orm.transaction.TXDataSource

1.事務托管原理

TXDataSource可以托管hibernate,ibatis,mybatis等持久層架構的事務管理,原理如下:

我們隻需要通過TXDataSource的構造函數傳入需要托管事務的實際資料源DataSource即可,這個DataSource可以是bboss内置的資料源,也可以是第三方資料源(common dbcp,C3P0,Proxool ,Druid)等等

public TXDataSource(DataSource datasource)

這樣我們隻要通過TXDataSource執行個體的getConnection()方法既可以擷取到事務環境中的connection資源進而實作資料庫事務的托管功能。

2.TXDataSource資料源的具體使用方法

我們以托管開源工作流activiti的事務作為示例,采用bboss内置資料源

在繼續之前需要知道一下元件com.frameworkset.common.poolman.util.SQLManager中的兩個工具方法:

public static DataSource getTXDatasourceByDBName(String dbname) --直接擷取bboss的内置資料源,并将該資料源轉換為一個代理事務的資料源,bboss持久層的poolman.xml檔案中需要定義dbname代表的資料源

public static DataSource getTXDatasource(DataSource ds) --直接将ds資料源轉換為一個代理事務的資料源

如果在poolman.xml配置中已經制定了enablejta參數為true,則通過SQLManager的getDatasource方法直接就會傳回一個支援TX事務的資料源。

首先在poolman.xml檔案中配置一個名稱叫mysql的datasource

<datasource>

    <dbname>mysql</dbname>
	<loadmetadata>false</loadmetadata>
    <enablejta>true</enablejta>
    <jndiName>jdbc/mysql-ds</jndiName>
    <driver>com.mysql.jdbc.Driver</driver>

     <url>jdbc:mysql://localhost:3306/activiti</url> 

    <username>root</username>
    <password>123456</password>
    .........
 </datasource>      

如果然後在activiti的配置檔案activiti.cfg.xml中做如下配置:

<properties>
  <property name="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
     <property name="dataSource" factory-class="com.frameworkset.common.poolman.util.SQLManager" factory-method="getTXDatasourceByDBName">
    	<construction>
    		<property value="mysql" />
    	</construction>
    </property>
    <!-- Database configurations -->
    <property name="databaseSchemaUpdate" value="true" />    
    <!-- job executor configurations -->
    <property name="jobExecutorActivate" value="false" />    
    <!-- mail server configurations -->
    <property name="mailServerPort" value="5025" />    
    <property name="history" value="full" />
  </property>
</properties>      

從activiti.cfg.xml配置檔案中可以看出,我們已經可以使用bboss ioc架構來管理activiti流程引擎,bboss ioc容器中管理的元件都可以用于activiti的相關

活動環節和事件監聽器中(該功能參考文章

開源工作流引擎activiti與bboss整合使用方法淺析

)。這裡需要關注的是配置内容:

<property name="dataSource" factory-class="com.frameworkset.common.poolman.util.SQLManager" factory-method="getTXDatasourceByDBName">
    	<construction>
    		<property value="mysql" />
    	</construction>
    </property>      

我們采用bboss ioc的靜态工廠模式來定義一個TXDatasource并注入到activiti的org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration

元件中,這樣activiti流程引擎的db事務就可以被bboss資料庫事務所托管了。bboss資料庫事務管理可以參考

http://sourceforge.net/projects/bboss/files/bbossgroups-3.4/bbossgroups%20training.ppt/download

中的資料庫相關事務介紹章節。

配置好了後就可以,啟動流程引擎(相關方法請參考activiti的十分鐘指南),看看兩個事務管理的代碼示例。

3.代碼示例

3.1 建立activiti的使用者資訊--将兩個建立使用者操作包含在事務中,activiti采用mybatis作為持久層架構

TransactionManager tm = new TransactionManager();
    try
    {
	    tm.begin();//開啟事務
	    identityService.saveUser(identityService.newUser("kermit"));
	    identityService.saveUser(identityService.newUser("gonzo"));	    
	    tm.commit();//送出事務
    }
    catch(Throwable e)
    {
    	throw e
    }
    finally
{
    tm.release();
}
      

3.2 完成流程任務和業務邏輯處理相結合--将業務處理和流程操作包含在一個事務中,activiti采用mybatis作為持久層架構

// Start process instance
	ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("taskAssigneeExampleProcess");
	TransactionManager tm = new TransactionManager();
	try {
		tm.begin();
		//處理業務邏輯,省略處理代碼
		.....
	    // 擷取使用者任務清單
	    List<Task> tasks = taskService
	      .createTaskQuery()
	      .taskAssignee("kermit")
	      .list();
	    
	    Task myTask = tasks.get(0);
	    //完成任務
	    taskService.complete(myTask.getId());
	    
	    tm.commit();
	} catch (Throwable e) {
    	throw e
    }
    finally
{
    tm.release();
}      

3.3 在spring中引用bboss資料源

<bean id="dataSource" 
         class="com.frameworkset.common.poolman.util.SQLManager"
         factory-method="getTXDatasourceByDBName">
         <constructor-arg value="wood"></constructor-arg>
     </bean>      

相關資源:

activiti和bboss結合工程下載下傳:

https://github.com/yin-bp/activiti-engine-5.12