package org.dayatang.btm; import bitronix.tm.TransactionManagerServices; import javax.transaction.TransactionManager; import javax.transaction.UserTransaction; import java.net.URISyntaxException; import java.net.URL; /** * 通过开源JTA实现库BTM创建数据源并绑定到JNDI. * @author yyang (<a href="mailto:gdyangyu@gmail.com">gdyangyu@gmail.com</a>) * */ public class BtmUtils { private static final String DATASOURCE_CONF_FILE = "/datasources.properties"; /** * 从类路径读入数据源配置文件 * @param resourceFile * @return */ public static BtmUtils readConfigurationFromClasspath(String resourceFile) { return new BtmUtils(getAbsolutePathOfClasspathResource(resourceFile)); } private static String getAbsolutePathOfClasspathResource(String resourceFile) { URL url = BtmUtils.class.getResource(resourceFile); if (url == null) { throw new RuntimeException("File " + resourceFile + " does not exist!"); } try { return url.toURI().getPath(); } catch (URISyntaxException e) { e.printStackTrace(); throw new RuntimeException("File " + resourceFile + " does not exist!"); } } /** * 从文件系统读入数据源配置文件 * @param confFile * @return */ public static BtmUtils readConfigurationFromFile(String confFile) { return new BtmUtils(confFile); } private String confFile; public BtmUtils() { this(getAbsolutePathOfClasspathResource(DATASOURCE_CONF_FILE)); } private BtmUtils(String confFile) { this.confFile = confFile; System.out.println("----------------------------"); System.out.println("LogPart1Filename:" + TransactionManagerServices.getConfiguration().getLogPart1Filename()); } /** * 根据数据源配置设置JNDI和事务管理器 * @throws Exception */ public void setupDataSource() { TransactionManagerServices.getConfiguration().setResourceConfigurationFilename(confFile); TransactionManagerServices.getTransactionManager(); } /** * 关闭BTM服务并释放资源 * @throws Exception */ public void closeDataSource() { TransactionManagerServices.getTransactionManager().shutdown(); TransactionManagerServices.getConfiguration().shutdown(); } public UserTransaction getTransaction() { return TransactionManagerServices.getTransactionManager(); } public TransactionManager getTransactionManager() { return TransactionManagerServices.getTransactionManager(); } }