Je travaille sur une preuve de concept de la carte transactionnelle Hazelcast. Pour ce faire, j'écris une application Spring Boot et j'utilise Atomikos comme implémentation JTA/XA.Utilisation correcte de la carte transactionnelle Hazelcast dans une application Spring Boot
Cette application doit mettre à jour une carte transactionnelle et également mettre à jour une table de base de données en insérant une nouvelle ligne tout au sein de la même transaction. J'utilise JPA/SpringData/Hibernate pour travailler avec la base de données. J'utilise JPA/SpringData/Hibernate. Donc l'application a un composant (une classe JAVA annotée avec @Component) qui a une méthode appelée agregar() (ajouter en espagnol). Cette méthode est annotée avec @Transactional (org.springframework.transaction.annotation.Transactional)
La méthode doit effectuer deux tâches en tant qu'unité: premièrement, mettre à jour une TransactionalMap extraite de l'instance Hazelcast et, deuxièmement, mettre à jour une table de base de données à l'aide d'un dépôt étendu de JpaRepository (org.springframework.data.jpa.repository.JpaRepository)
Voici le code que je l'ai écrit:
@Transactional
public void agregar() throws NotSupportedException, SystemException, IllegalStateException, RollbackException, SecurityException, HeuristicMixedException, HeuristicRollbackException, SQLException {
logger.info("AGRENADO AL MAPA ...");
HazelcastXAResource xaResource = hazelcastInstance.getXAResource();
UserTransactionManager tm = new UserTransactionManager();
tm.begin();
Transaction transaction = tm.getTransaction();
transaction.enlistResource(xaResource);
TransactionContext context = xaResource.getTransactionContext();
TransactionalMap<TaskKey, TaskQueue> mapTareasDiferidas = context.getMap("TAREAS-DIFERIDAS");
TaskKey taskKey = new TaskKey(1L);
TaskQueue taskQueue = mapTareasDiferidas.get(taskKey);
Integer numero = 4;
Task<Integer> taskFactorial = new TaskImplFactorial(numero);
taskQueue = new TaskQueue();
taskQueue.getQueue().add(taskFactorial);
mapTareasDiferidas.put(taskKey, taskQueue);
transaction.delistResource(xaResource, XAResource.TMSUCCESS);
tm.commit();
logger.info("AGRENADO A LA TABLA ...");
PaisEntity paisEntity = new PaisEntity(100, "ARGENTINA", 10);
paisRepository.save(paisEntity);
}
Ce code fonctionne: si l'une des tâches jeter un exception, les deux sont annulées.
Mes questions sont les suivantes:
- Est-ce code fait correct?
- Pourquoi @Transactional ne prend-il pas soin de valider les changements dans la carte et je dois le faire explicitement par moi-même?
Le code complet du projet est disponible en Github: https://github.com/diegocairone/hazelcast-maps-poc
Merci à l'avance
version de Hazelcast utilisez-vous? –
Hazelcast 3.6.7 intégré dans Spring Boot 1.4.5 –