packagecom.csnt.source.plugin.atomikos;
importcom.atomikos.icatch.jta.UserTransactionImp;
importcom.atomikos.jdbc.AtomikosDataSourceBean;
importcom.jfinal.kit.LogKit;
importcom.jfinal.kit.StrKit;
importcom.jfinal.plugin.IPlugin;
importcom.jfinal.plugin.activerecord.ActiveRecordException;
importcom.jfinal.plugin.activerecord.IAtom;
importcom.jfinal.plugin.activerecord.IDataSourceProvider;
importjavax.sql.DataSource;
importjava.util.Properties;/**
* @authorsource
*/public classAtomikosPluginimplementsIPlugin,IDataSourceProvider {privateStringname=null;
privateStringurl;
privateStringusername;
privateStringpassword;
privateStringxaDataSourceStr;
private intminPoolSize=10;
private intmaxPoolSize=32;
privateAtomikosDataSourceBeands;
private booleanlocalTransactionMode=true;
private volatile booleanisStarted=false;
publicAtomikosPlugin(String url,String username,String password,String xaDataSourceStr) {this.url= url;
this.username= username;
this.password= password;
this.xaDataSourceStr= xaDataSourceStr;}publicAtomikosPluginset(intminPoolSize, intmaxPoolSize) {this.minPoolSize= minPoolSize;
this.maxPoolSize= maxPoolSize;
return this;}public finalAtomikosPluginsetLocalTransactionMode(booleanlocalTransactionMode) {this.localTransactionMode= localTransactionMode;
return this;}public finalStringgetName() {return this.name;}public final voidsetName(String name) {this.name= name;}public static booleantx(IAtom atom) {
UserTransactionImp utx =newUserTransactionImp();
try{
utx.begin();
booleanresult = atom.run();
if(result) {//提交事务utx.commit();}else{//回滚事务utx.rollback();}returnresult;}catch(Throwable t) {try{
utx.rollback();}catch(Exception e) {
LogKit.error(e.getMessage(),e);}throwtinstanceofRuntimeException ? (RuntimeException) t :newActiveRecordException(t);}
}@Overridepublic booleanstart() {if(isStarted) {return true;}else{ds=newAtomikosDataSourceBean();
if(StrKit.notBlank(name)) {ds.setUniqueResourceName(name);}ds.setMinPoolSize(minPoolSize);ds.setMaxPoolSize(maxPoolSize);//是否开启本地事务与jta事务混合ds.setLocalTransactionMode(localTransactionMode);ds.setXaDataSourceClassName(xaDataSourceStr);Properties properties =newProperties();properties.put("URL",url);properties.put("user",username);properties.put("password",password);ds.setXaProperties(properties);
this.isStarted=true;
return true;}
}@Overridepublic booleanstop() {if(ds!=null) {ds.close();}ds=null;isStarted=false;
return true;}@OverridepublicDataSourcegetDataSource() {returnds;}
}