12
votes

Comment appeler une méthode de restauration personnalisée dans la gestion des transactions de printemps?

Environnement: Spring 3, Gestion des transactions personnalisées, transactions JDBC

Je viens de lire les documents de printemps sur l'utilisation du modèle de transaction pour gérer la gestion des transactions. il semblait trop complexe donc je veux demander:

La plupart de mes transactions sont liées à JDBC, ce qui signifie que je déclare juste un @Transactional sur mon service. Mais maintenant je fais un service de service de repos à un autre site qui doit être annulé si l'une des opérations JDBC suivantes échoue , je vais fournir le code de restauration dans ce cas.

Comme je progresse dans ma méthode, dans ma transaction - je veux enregistrer une référence à l'appel de service de repos (nécessaire pour faire rouler cette action), et sur une exception, je viens veux une méthode myCustOMrollback () appelé qui peut accéder à l'objet précédemment stocké.

Pourquoi ne pas simplement fournir une carte dans la transactiontemplate pour stocker des trucs et définir une méthode de restauration personnalisée sur la @Transactional Annotation?

C'est comme ça que j'y pense, je ne suis pas en train de suivre le chemin du printemps à ce sujet. Quelqu'un peut-il m'aider à combler le fossé entre ce que je veux et comment je l'accomplie le plus efficacement au printemps? Je n'ai besoin que de cela pour quelques opérations de cas spéciales.


0 commentaires

5 Réponses :


-1
votes

Vous pouvez utiliser les conseils de l'autre (lorsqu'une exception est lancée) et appelez votre méthode ( myCustMrollback () ) là-bas, vous pouvez utiliser transactionsYnchronizationManager Classe pour obtenir la transaction de TheCurrent & Roulez-le ...

Alternativement .. Vous pouvez utiliser le tourbet pour commencer et commenter votre transaction (de cette façon, vous pouvez utiliser le gestionnaire de transactions à l'aide de la transaction de printemps à l'aide de la liste TransactionsNchronizationManager Classe)


0 commentaires

2
votes

Gestion des transactions à ressort Le comportement par défaut pour la restauration automatique est destiné aux exceptions non cochées

Ainsi, pour une exception personnalisée, xxx

la transaction être roulé si il y a un exception qui correspond à la spécification. Si une exception ne correspond pas non à une exception, elle est propagée à l'appelant du service ou de transactionRolledbackexception Wrapper

Si vous utilisez Utilisez l'org.springframework.transaction.platformtransactionManager, il s'agit d'exceptions de manutention plus gérées que le modèle

Vérifiez la documentation http: // statique .springsource.org / Spring / Docs / 3.0.x / Spring-Framework-Référence / HTML / transaction.html


0 commentaires

5
votes

J'ai relu votre question plusieurs fois et je ne suis pas sûr de comprendre votre question complètement. Je suppose que votre exécution somécode et si cela échoue, vous souhaitez exécuter myCustomrollback qui a des informations sur le somécode. Donc, je vais essayer de fournir une réponse générique.

Si vous voulez le printemps pour la restauration du code. Il ne fera qu'une annulation qui est annulée, comme les transactions JDBC. Supposons que vous ayez une méthode qui effectue 2 appels. xxx

de sorte que le code ci-dessus sera toujours rentaré. Il annulera la persistance de votre entité, mais pas la création de votre fichier, car cela n'est pas géré par des transactions de printemps, à moins que vous ne fournissez une implémentation personnalisée pour ce être.

Deuxièmement, le printemps fournit 2 façons de Travailler avec transactions:

  • Spring AOP: Un proxy est créé au runtime qui décorera votre code avec des trucs transactionnels. Si votre classe serait nommée MyClass, le ressort créera un nom de classe MyClassProxy, qui enveloppera votre code dans le code transactionnel.
  • AspectJ: Au moment de la compilation, votre fichier .Class sera ajusté et le code transactionnel sera intégré à l'intérieur de votre méthode.

    L'approche AspectJ semble plus difficile à configurer, mais n'est pas tellement plus facile à utiliser. Puisque tout ce qui est annoté avec @TransAderal sera intégré (tissé) avec code. Pour le ressort AOP, ce n'est pas le cas. La méthode interne transactionnelle Les appels d'appels par exemple au printemps seront ignorés! Donc, Aspectj fournit une approche plus intuitive.

    Retour à ce que votre question est (le code est tout en 1 classe): xxx

    Le code ci-dessus ne fonctionnera que avec AspectJ! depuis votre fabrication d'appels de méthode intérieure qui semble également être privé! AOP au runtime ne peut pas gérer cela.

    Alors, que se passe-t-il est tout (qui est renommé) dans l'exécution sera annulé. Et dans Dostuff, vous avez des informations sur les objets utilisés dans l'exécution, vous pouvez désormais utiliser dans MyCustomRollback pour annuler vos produits de repos manuellement.

    Je ne sais pas si j'ai répondu à cette question, mais j'espère que cela aide quelqu'un avec un problème similaire.


1 commentaires

L'utilisation de l'annotation transactionnelle est principalement destinée à réduire la taille du code de la chaudras. Si nous visons à utiliser un mécanisme de traitance d'essais pour des préoccupations transversales. Cela ne semble pas une solution appropriée.



3
votes

1 solution consiste à implémenter votre propre gestionnaire de transaction en prolongeant un

2 solution consiste à utiliser transcordynchronizationManager Class

3 solution consiste à utiliser @TransAderalEventListener au cas où vous auriez le printemps 4


0 commentaires

17
votes

à quiconque lisez toujours ceci:

J'ai résolu un problème similaire avec les événements de printemps - comme suggéré par den romain En option 3. Voici l'idée de base (scénario est fictive):

Chaque fois que j'effectue des opérations externes qui doivent être renvoyées avec la transaction, je publie un événement à l'intérieur de My @Transactional méthode en utilisant Prise en charge du ressort ( org.springframework.context.aplicationExtepublisher ): xxx

L'événement lui-même peut être n'importe quel objet - j'ai créé un pojo avec des détails sur L'entité distante à supprimer.

Puis j'ai enregistré un écouteur d'événement spécial qui est lié à une phase de transaction - dans mon cas au retour: xxx

Bien entendu, il est recommandé d'attraper et de loger l'exception à partir de l'opération de restauration, de ne pas perdre l'exception originale à partir de la méthode .

Par défaut, ces événements sont synchrones, Mais ils peuvent être fabriqués par une configuration supplémentaire.

Voici un très bon article sur ce mécanisme, y compris la configuration détaillée et les pièges: Synchronisation des transactions et événements d'application de ressort (dzone)

tandis que je n'aime pas la solution à 100% car elle cloque la logique commerciale avec l'événement Publier des trucs et se lie au printemps, il fait certainement ce que je m'attends à ce que cela puisse passer le contexte de la méthode transactionnelle à la méthode de restauration - qui n'est pas disponible via un bloc traditionnel Essayer / Catch à l'extérieur de la méthode transactionnelle (à moins que Vous mettez votre contexte dans l'exception elle-même, ce qui n'est pas très agréable).


0 commentaires