2017-03-31 18 views
0

私は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)から延長リポジトリ

を使用してこれは私が書いたコードでの作業の一つがスローする場合例外が両方ともロールバックされます。

私の質問は以下のとおりです。

  1. は、このコードは実際には正しいですか?
  2. なぜ@Transactionalは、マップの変更をコミットの世話をしていないと私はexplicitylly自分でそれを行う必要がありますか?

プロジェクトの完全なコードはGitHubのアン入手可能です:事前

+0

Hazelcastのバージョン、使用するのですか? –

+0

Hazelcast 3.6.7がSpringブート1.4.5に組み込まれました –

答えて

0

https://github.com/diegocairone/hazelcast-maps-poc

おかげで最後に私が「UserTransactionManager」オブジェクトを注入し、それからトランザクションを取らなければならないことに気づきました。

また、JTA/XAの実装を使用する必要があります。 Atomikosを選択し、XAトランザクションをMS SQL Serverで有効にする必要があります。

実施例は、分岐atomikos-データソース-MSSQL Hazelcast 3.7以降で

0

上のGithub https://github.com/diegocairone/hazelcast-maps-pocで入手可能である、あなたはPlatformTransactionManagerあるHazelcastTransactionManagerを使用することにより、開始、コミットまたはロールバック取引する定型コードを取り除くことができます実装はSpring Transaction APIと共に使用されます。 例はhereです。

また、HazelcastはAtomikosでXAトランザクションに参加することができます。 Here's a doc

は、私がHazelcast 3.7.5にアップデートしてHazelcastConfigクラスに次のコードを追加しているあなたに

+0

私はHazelcast 3.7.5に更新しましたが、Atomicikの統合とHazelcast ManagedTransactionalTask​​Contextにはまだ問題があります。これで私に手を差し伸べることができますか?私は答えとして詳細を掲載します。 –

0

ありがとうございます。

@Configuration 
public class HazelcastConfig { 
... 


@Bean 
public HazelcastInstance getHazelcastInstance() { 
    .... 
} 


@Bean 
public HazelcastTransactionManager getTransactionManager() { 
    HazelcastTransactionManager transactionManager = new HazelcastTransactionManager(getHazelcastInstance()); 
    return transactionManager; 
} 

@Bean 
public ManagedTransactionalTaskContext getTransactionalContext() { 
    ManagedTransactionalTaskContext transactionalContext = new ManagedTransactionalTaskContext(getTransactionManager()); 
    return transactionalContext; 
} 

私はこの例外を取得するアプリを実行します。

org.springframework.beans.factory.NoSuchBeanDefinitionException: 'トランザクションマネージャー' 利用可能という名前の 豆:修飾子が見つかりませんマッチング PlatformTransactionManager Beanを 'transactionManager' - 修飾子の一致も、Bean名も一致しません!

コードは、新しい枝にGitHubのから入手できます。atomikos-データソース-MSSQL-hz37事前に

おかげ

+0

クラスパスにヘーゼルキャストスプリングジャーがありますか? –

+0

はい。これはpom.xmlで宣言されています –

関連する問題