2014-05-23 1 views
2

Mon cas d'utilisation est:Comment inscrire XAResource à une transaction existante?

J'ai un JTA TransactionManager existant et une Transaction en vol. Je voudrais inscrire Neo4j comme XAResource dans cette Transaction de sorte qu'il puisse préparer/commettre dans 2PC approprié. Je ne vois pas d'implémentation XAResource publique dans Neo4j; tout semble être routé à travers la NioNeoDbPersistenceSource> NeoStoreXaDataSource> NeoStoreXaConnection.NeoStoreXaResource.

Existe-t-il une manière préférée d'inscrire Neo4j dans les transactions JTA en dehors de celles fournies par son propre TransactionManager? Tous les cas de test que je trouve enlist mock "FakeXAResource" [1]

Apprécié!

S, ALR

[1] par exemple, UseJOTMAsTxManagerIT

+0

Je soupçonne qu'il peut avoir quelque chose à voir avec TransactionManagerProvider, de même fait ici: https://github.com/digitalstain/Neo4j-Spring-Integration/blob/master/txModule/ src/main/java/org/neo4j/jta/printemps/SpringProvider.java – ALRubinger

+0

Oui, je le pense aussi. –

Répondre

0

OK, j'ai une solution qui, je pense, est la meilleure que Neo4j puisse gérer, même si je n'en suis pas ravi. :)

https://gist.github.com/ALRubinger/b584065d0e7da251469a

L'idée est la suivante:

1) Mettre en œuvre AbstractTransactionManager

de Neo4j Cette classe est un composite maladroits de JTA TransactionManager, Neo4j du cycle de vie, et d'autres méthodes; il n'est pas tout à fait clair pour moi ce que certains d'entre eux (par exemple "getEventIdentifier()" ou "doRecovery()") sont supposés faire, et le contrat semble sur-spécifié. Je ne suis pas certain pourquoi nous voudrions des méthodes de cycle de vie ici pour le cas où Neo4j n'est pas le propriétaire faisant autorité du TransactionManager.

2) Mettre en œuvre TransactionManagerProvider de Neo4j

Cela vous permettra de créer une nouvelle instance de votre mise en œuvre de AbstractTransactionManager, mais il est lié par le JDK service SPI, vous devez fournir un constructeur sans arg et trouver une autre intelligente/manière hacky de transmettre des informations contextuelles dans.

3) Créer un fichier META-INF/services/org.neo4j.kernel.impl.transaction.TransactionManagerProvider, avec le contenu de la FQN de vos impl TransactionManagerProvider de l'étape 2)

4) Lorsque vous créez une nouvelle base de données GraphDatabaseS ervice, passe dans la configuration comme:

final GraphDatabaseService graphDatabaseService = new GraphDatabaseFactory(). 
      newEmbeddedDatabaseBuilder(FILE_NAME_STORAGE).setConfig(
      GraphDatabaseSettings.tx_manager_impl.name(), 
      "NAME_OF_YOUR_TXM_PROVIDER") 
      .newGraphDatabase(); 

Ensuite, vous accédez au TransactionManager en utilisant une API ABANDONNÉ (GraphDatabaseAPI):

// Get at Neo4j's view of the TransactionManager 
final TransactionManager tm = ((GraphDatabaseAPI) graphDatabaseService).getDependencyResolver().resolveDependency(TransactionManager.class); 
tm.begin(); 
final Transaction tx = tm.getTransaction(); 

Le vrai problème que j'ai avec cette approche est que nous devons utiliser TransactionManager implémentation de Neo4j, qui enveloppe notre véritable MT. Ce que je veux faire est d'utiliser ma TM et d'enrôler Neo4j comme source XAResource.

Je n'ai toujours pas trouvé de moyen de le faire, et à en juger par les suites de test Neo4j, je ne pense pas que ce soit possible pour le moment avec leur support XAResource fourni. Absolument prêt et j'espère être corrigé!:)

Mais à défaut des points que je mentionne ci-dessus, l'essentiel ci-joint fonctionne et montre Neo4j en utilisant un TransactionManager externe (Narayana, chez nous chez JBoss) comme implémentation backing.

S, ALR

Questions connexes