提交 05551682 编写于 作者: C cherrylzhao

add getRecoveryXAResource method for XATransactionManager.

上级 bdc74608
......@@ -40,7 +40,7 @@
<commons-codec.version>1.10</commons-codec.version>
<javax.transaction.version>1.1</javax.transaction.version>
<atomikos.version>4.0.4</atomikos.version>
<atomikos.version>4.0.6</atomikos.version>
<curator.version>2.10.0</curator.version>
<grpc.version>1.7.0</grpc.version>
......
......@@ -24,6 +24,7 @@ import io.shardingsphere.transaction.core.manager.ShardingTransactionManager;
import javax.sql.DataSource;
import javax.sql.XADataSource;
import javax.transaction.TransactionManager;
import javax.transaction.xa.XAResource;
/**
* XA transaction manager.
......@@ -74,4 +75,12 @@ public interface XATransactionManager extends ShardingTransactionManager {
* @param xaDataSource XA data source
*/
void removeRecoveryResource(String dataSourceName, XADataSource xaDataSource);
/**
* Get recovery resource.
* @param dataSourceName data source name
* @return XA recovery resource
*/
XAResource getRecoveryXAResource(String dataSourceName);
}
......@@ -17,8 +17,8 @@
package io.shardingsphere.transaction.xa.handler;
import com.google.common.base.Preconditions;
import io.shardingsphere.core.constant.DatabaseType;
import io.shardingsphere.core.exception.ShardingException;
import io.shardingsphere.core.rule.DataSourceParameter;
import io.shardingsphere.transaction.api.TransactionType;
import io.shardingsphere.transaction.core.handler.ShardingTransactionHandlerAdapter;
......@@ -31,10 +31,8 @@ import io.shardingsphere.transaction.xa.manager.XATransactionManagerSPILoader;
import lombok.extern.slf4j.Slf4j;
import javax.sql.DataSource;
import javax.sql.XAConnection;
import javax.transaction.Transaction;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
......@@ -89,15 +87,12 @@ public final class XAShardingTransactionHandler extends ShardingTransactionHandl
}
@Override
public synchronized void synchronizeTransactionResource(final String datasourceName, final Connection connection, final Object... properties) throws SQLException {
public synchronized void synchronizeTransactionResource(final String datasourceName, final Connection connection, final Object... properties) {
try {
ShardingXADataSource shardingXADataSource = SHARDING_XA_DATA_SOURCE_MAP.get(datasourceName);
Preconditions.checkNotNull(shardingXADataSource, "Could not find ShardingXADataSource of `%s`", datasourceName);
XAConnection xaConnection = shardingXADataSource.wrapPhysicalConnection(connection, databaseType);
Transaction transaction = xaTransactionManager.getUnderlyingTransactionManager().getTransaction();
transaction.enlistResource(xaConnection.getXAResource());
transaction.enlistResource(xaTransactionManager.getRecoveryXAResource(datasourceName));
} catch (final Exception ex) {
throw new SQLException(ex.getMessage());
throw new ShardingException(ex);
}
}
}
......@@ -18,6 +18,7 @@
package io.shardingsphere.transaction.xa.manager;
import com.atomikos.datasource.xa.jdbc.JdbcTransactionalResource;
import com.atomikos.icatch.config.Configuration;
import com.atomikos.icatch.config.UserTransactionService;
import com.atomikos.icatch.config.UserTransactionServiceImp;
import com.atomikos.icatch.jta.UserTransactionManager;
......@@ -35,6 +36,7 @@ import javax.transaction.RollbackException;
import javax.transaction.Status;
import javax.transaction.SystemException;
import javax.transaction.TransactionManager;
import javax.transaction.xa.XAResource;
/**
* Atomikos XA transaction manager.
......@@ -118,5 +120,11 @@ public final class AtomikosTransactionManager implements XATransactionManager {
public void removeRecoveryResource(final String dataSourceName, final XADataSource xaDataSource) {
userTransactionService.removeResource(new JdbcTransactionalResource(dataSourceName, xaDataSource));
}
@Override
public XAResource getRecoveryXAResource(final String dataSourceName) {
JdbcTransactionalResource jdbcTransactionalResource = (JdbcTransactionalResource) Configuration.getResource(dataSourceName);
return jdbcTransactionalResource.getXAResource();
}
}
......@@ -25,8 +25,13 @@ import javax.sql.DataSource;
import javax.sql.XADataSource;
import javax.transaction.Status;
import javax.transaction.TransactionManager;
import javax.transaction.xa.XAResource;
public final class FixtureXATransactionManager implements XATransactionManager {
@Override
public void startup() {
}
@Override
public void destroy() {
}
......@@ -67,4 +72,9 @@ public final class FixtureXATransactionManager implements XATransactionManager {
public void removeRecoveryResource(final String dataSourceName, final XADataSource xaDataSource) {
}
@Override
public XAResource getRecoveryXAResource(final String dataSourceName) {
return null;
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册