基于Hot Rod Client API的Infinispan事务管理器获取为空问题求助
问题根因
你将事务管理器查找逻辑配置在了服务端缓存的ConfigurationBuilder中,但Hot Rod客户端的事务管理器属于客户端侧独立配置项,不会从服务端缓存配置同步,因此调用remoteCache.getTransactionManager()会返回null。
解决方案
1. 调整客户端初始化配置
在Hot Rod客户端的配置类中配置事务相关参数,不要将客户端事务参数配置在服务端缓存配置中:
import org.infinispan.client.hotrod.configuration.ConfigurationBuilder; import org.infinispan.client.hotrod.transaction.lookup.GenericTransactionManagerLookup; import org.infinispan.client.hotrod.transaction.TransactionMode; // 客户端侧配置,不是服务端缓存配置 ConfigurationBuilder clientBuilder = new ConfigurationBuilder(); clientBuilder.addServer().host("你的Infinispan服务地址").port(11222); // 客户端开启事务支持,配置事务管理器查找类 clientBuilder.transaction() .transactionMode(TransactionMode.NON_XA) .transactionManagerLookup(GenericTransactionManagerLookup.getInstance()); // 初始化RemoteCacheManager RemoteCacheManager rcm = new RemoteCacheManager(clientBuilder.build());
2. 修正服务端缓存配置
服务端缓存配置不需要配置transactionManagerLookup,该参数仅对服务端本地缓存生效,对Hot Rod客户端访问无效:
import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.transaction.LockingMode; import org.infinispan.transaction.TransactionMode; import org.infinispan.cache.container.CacheContainerAdmin; ConfigurationBuilder builder = new ConfigurationBuilder(); builder.clustering().cacheMode(CacheMode.DIST_SYNC); builder.locking().isolationLevel(IsolationLevel.REPEATABLE_READ); builder.transaction().lockingMode(LockingMode.PESSIMISTIC); builder.transaction().transactionMode(TransactionMode.TRANSACTIONAL); // 移除原有的transactionManagerLookup配置 rcm.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache(cacheName, builder.build());
3. 获取事务管理器
完成上述配置后,直接调用remoteCache.getTransactionManager()即可获取到正常的事务管理器实例。
注意事项
- Infinispan 12.0.x版本的Hot Rod客户端仅支持
NON_XA事务模式,配置为其他事务模式会导致初始化失败 - 如果你项目中使用了独立的事务管理器(如Narayana、Spring事务管理器),可替换
GenericTransactionManagerLookup为对应实现类即可适配
内容的提问来源于stack exchange,提问作者Raghav
相关产品推荐
相关产品推荐

