私はHazelcast Transactional Mapの概念証明に取り組んでいます。これを達成するために、Spring Bootアプリケーションを作成し、JTA/XA実装としてAtomikosを使用しています。SpringブートアプリケーションでのHazelcast Transactional Mapの正しい使用
このアプリはトランザクションマップを更新し、同じトランザクション内に新しい行を挿入することによってデータベーステーブルを更新する必要があります。
JPA/SpringData/Hibernateを使用してデータベースを操作しています。
したがって、アプリケーションには、agregar()(スペイン語で追加)というメソッドを持つコンポーネント(@Componentで注釈が付けられたJAVAクラス)があります。このメソッドは@Transactional(org.springframework.transaction.annotation.Transactional)の注釈付きです
このメソッドは、2つのタスクを1つの単位として実行する必要があります。まず、Hazelcastインスタンスから取得したTransactionalMapを更新し、次にデータベーステーブルを更新する必要があります。このコードが機能している
@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);
}
:JpaRepository(org.springframework.data.jpa.repository.JpaRepository)から延長リポジトリ
を使用してこれは私が書いたコードでの作業の一つがスローする場合例外が両方ともロールバックされます。
私の質問は以下のとおりです。
- は、このコードは実際には正しいですか?
- なぜ@Transactionalは、マップの変更をコミットの世話をしていないと私はexplicitylly自分でそれを行う必要がありますか?
プロジェクトの完全なコードはGitHubのアン入手可能です:事前
Hazelcastのバージョン、使用するのですか? –
Hazelcast 3.6.7がSpringブート1.4.5に組み込まれました –