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