Я сделал простой тест, чтобы понять, работает ли реализация нормально. Без аннотации @Transactional
он работает в следующей конфигурации:
импортированные зависимости:
implementation group: 'org.ehcache', name: 'ehcache', version: '3.0.0'
// https://mvnrepository.com/artifact/org.codehaus.btm/btm
testImplementation group: 'org.codehaus.btm', name: 'btm', version: '2.1.4'
Класс конфигурации:
import org.ehcache.CacheManager;
import org.ehcache.config.builders.CacheConfigurationBuilder;
import org.ehcache.config.builders.CacheManagerBuilder;
import org.ehcache.config.builders.ResourcePoolsBuilder;
import org.ehcache.transactions.xa.configuration.XAStoreConfiguration;
import org.ehcache.transactions.xa.txmgr.btm.BitronixTransactionManagerLookup;
import org.ehcache.transactions.xa.txmgr.provider.LookupTransactionManagerProviderConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import bitronix.tm.BitronixTransactionManager;
import bitronix.tm.TransactionManagerServices;
@Configuration
public class CacheConfig {
@Bean(value = "bitronixTransactionManager")
public BitronixTransactionManager bitronixTransactionManager() {
BitronixTransactionManager transactionManager = TransactionManagerServices.getTransactionManager();
return transactionManager;
}
@Bean(value = "cacheSreManager")
public CacheManager buildCacheManager() {
BitronixTransactionManager transactionManager = TransactionManagerServices.getTransactionManager();
CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
.using(new LookupTransactionManagerProviderConfiguration(BitronixTransactionManagerLookup.class))
.withCache("xaCache", CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, String.class,
ResourcePoolsBuilder.heap(10))
.add(new XAStoreConfiguration("xaCache"))
.build()
)
.build(true);
return cacheManager;
}
}
Тестовый класс
@Service("sreEvolutionService")
public class SreEvolutionServiceImpl implements SreEvolutionService {
@Autowired
@Qualifier("sreDao")
private SreDao sreDao;
@Autowired
@Qualifier("cacheSreManager")
private CacheManager cacheManager;
@Autowired
@Qualifier("bitronixTransactionManager")
private BitronixTransactionManager btx;
@Override
public void testTxCache() throws Exception {
Cache<String, String> xaCache = cacheManager.getCache("xaCache", String.class, String.class);
try {
addCache();
System.out.println(xaCache.get("test2"));
} catch (Exception e) {
e.printStackTrace();
xaCache.get("test2");
}
}
public void addCache() throws Exception{
btx.begin();
Cache<String, String> xaCache = cacheManager.getCache("xaCache", String.class, String.class);
xaCache.put("test2", "test2");
if (1==1) {
btx.rollback();
throw new Exception("error test for cache tx");
}
btx.commit();
}
}
Кэш работает, но я бы хотел @Transactional
реализацию аннотации для метода, так как я уже создал два компонента Transactional bean для двух разных баз данных.
Знаете ли вы, где я могу найти пример реализации ?