我正在尝试为 Ignite Cache 设置外部事务管理器,但是它显示 Factory 被忽略并且 create 未被调用...... 工厂实现是:
public class TransactionManagerFactory implements Factory<TransactionManager> {
private static final long serialVersionUID = 1L;
private transient IgniteCache igniteCache;
public TransactionManagerFactory(IgniteCache igniteCache) {
this.igniteCache=igniteCache;
}
@Override
public TransactionManager create() {
return this.igniteCache.getTransactionManager();
}
}
Ignite 事务客户端配置设置如下:
TransactionConfiguration txConfiguration=new TransactionConfiguration();
txConfiguration.setDeadlockTimeout(acquireTimeout);
txConfiguration.setDefaultTxIsolation(TransactionIsolation.READ_COMMITTED);
txConfiguration.setDefaultTxConcurrency(TransactionConcurrency.PESSIMISTIC);
TransactionManagerFactory txFactory=new TransactionManagerFactory(this);
txConfiguration.setTxManagerFactory(txFactory);
this.clientConfig.setTransactionConfiguration(txConfiguration);
缓存被创建为:
CacheConfiguration<Object, Object> cacheCfg = new CacheConfiguration<Object, Object>(this.name);
cacheCfg.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC);
cacheCfg.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
this.cache = this.instance.getOrCreateCache(cacheCfg);
然而,在测试中,缓存被创建并连接到远程节点,并且事务是通过调用 transactionManager.begin() 创建的; instance.transactions().tx() 返回 null ,而 transactionManager.getTransaction() 返回 TransactionImpl{xid=Xid{formatId=1, F54C460000000000000002},状态=活动}
每当事务回滚时,写入的项目都会保留在缓存中。 而且 TransactionManagerFactory.create 不会随时执行。
如何正确地将外部事务管理器与 ignite 缓存集成?
我认为您需要将
ignite-jta
模块添加到您的项目中,以便 Ignite 能够使用事务管理器执行任何操作。否则,使用 NoOp 实现。
我不确定你想用瞬态 IgniteCache 逻辑做什么。反序列化后为空,就会发生NPE。