API d'activité métier
Utilisez l'API d'activité métier pour créer des activités métier et des gestionnaires de compensation pour un composant d'application et pour consigner les données requises pour compenser une activité en cas d'échec survenant dans l'activité métier globale.
Généralités
InitialContext ctx = new InitialContext();
UserBusinessActivity uba = (UserBusinessActivity) ctx.lookup("java:comp/websphere/UserBusinessActivity");
InitialContext initialContext = new InitialContext();
UserBusinessActivity uba = initialContext.lookup("java:comp/websphere/UserBusinessActivity");
…
String activityId = uba.getId();
if (activityId == null)
// No activity on the thread
else
// Output audit message including activity id
- com.ibm.websphere.wsba.serializable.CompensationHandler, qui prend le paramètre d'un objet sérialisable
- com.ibm.websphere.wsba.CompensationHandler qui prend un paramètres d'objet SDO.
Une application doit enregistrer une implémentation de gestionnaire de compensation qui fonctionne avec le type de données de compensation (objet sérialisable ou SDO) utilisé par l'application. En cas d'incohérence entre le type de données utilisé par le composant d'application et l'implémentation du gestionnaire de compensation, une erreur se produit.
Pendant un traitement normal des applications, l'application peut appeler une ou plusieurs fois les méthodes setCompensationDataImmediate ou setCompensationDataAtCommit transmettant un objet sérialisable ou un objet SDO représentant l'état actuel de la tâche réalisée.
Quand une unité de travail (UOW) sous-jacente associée à l'activité professionnelle racine est effectuée, tous les compensateurs enregistrés sont coordonnés pour s'exécuter. Pendant l'exécution, la méthode compensate ou la méthode close est appelée sur le gestionnaire de compensation, transmettant les données de compensation les plus récentes consignées comme paramètre par le composant d'application. Votre implémentation de gestionnaire de compensation doit pouvoir comprendre les données stockées dans l'objet sérialisable ou l'objet SDO DataObject. Avec ces données, le gestionnaire de compensation doit pouvoir déterminer la nature de la tâche réalisée par le bean enterprise et compenser ou fermer de façon appropriée, par exemple en annulant les modifications apportées aux lignes de base de données en cas d'échec dans l'activité métier. Vous associez le gestionnaire de compensation au composant d'application à l'aide d'un outil d'assemblage, tel que Rational Application Developer.
Gestionnaires de compensation actifs et inactifs
Vous implémentez l'interface serializable.CompensationHandler ou CompensationHandler pour n'importe quel composant d'application qui exécute le code qui peut nécessiter une compensation dans l'environnement d'activité métier. Les objets du gestionnaire de compensation sont enregistrés implicitement avec la portée de l'activité métier sous laquelle l'application s'exécute, chaque fois que l'application appelle l'API UserBusinessActivity pour définir les données de compensation. Les gestionnaires de compensation peuvent se trouver dans un ou deux états, actif ou inactif, selon l'unité de travail transactionnelle sous laquelle ils sont enregistrés. Un gestionnaire de compensation enregistré dans une unité de travail transactionnelle peut être initialement inactif jusqu'à ce que la transaction soit validée, à ce stade il devient actif (voir la section suivante). Un gestionnaire de compensation enregistré en dehors d'une unité de travail transactionnelle devient toujours actif immédiatement.
Lorsqu'une activité métier s'achève, elle dirige uniquement les gestionnaires actifs. Tout gestionnaire de compensation actif associé à l'activité professionnelle est éliminé et jamais déterminé.
Consignation des données de compensation
L'API de l'activité métier définit deux méthodes permettant à l'application de consigner les données de compensation. Ces données sont rendues disponibles pour les gestionnaires de compensation pendant leur traitement dès que l'activité métier s'achève. L'application appelle une de ces méthodes selon que la transaction doit faire partie de l'activité professionnelle ou non.
- setCompensationDataAtCommit()
- Appelez la méthode setCompensationDataAtCommit lorsque l'application s'attend à une transaction globale sur l'unité d'exécution.
- Si la transaction se trouve dans l'unité d'exécution, l'objet CompensationHandler est initialement inactif. Si la transaction globale échoue, elle annule tous les travaux transactionnels réalisés dans son contexte de transaction de façon atomique, et dirige l'activité professionnelle pour compenser les autres unités de travail terminées. Le gestionnaire de compensation n'a pas besoin d'être impliqué. Si la transaction globale est validée avec succès, le gestionnaire de compensation devient actif parce qu'il doit compenser le du travail durable achevé par la transaction globale, si l'ensemble de l'activité métier échoue. La méthode setCompensationDataAtCommit configure l'instance CompensationHandler pour exécuter cette fonction de compensation.
- S'il n'y a pas de transaction globale lorsque la méthode setCompensationDataAtCommit est appelée, le gestionnaire de compensation devient immédiatement actif.
DataObject compensationData = doWorkWhichWouldNeedCompensating(); uba.setCompensationDataAtCommit(compensationData);
- setCompensationDataImmediate()
Appelez la méthode setCompensationDataImmediate si l'application n'attend pas de transaction globale sur l'unité d'exécution.
La méthode setCompensationDataImmediate rend une instance CompensationHandler immédiatement valide, quelle que soit le contexte d'unité de travail en cours au moment où la méthode est appelée. Le gestionnaire de compensation peut toujours participer à la réalisation de l'activité métier.
Le rôle de la méthode setCompensationDataImmediate est de compenser tout travail non-transactionnel, en d'autres termes, un travail pouvant être réalisé à l'intérieur ou à l'extérieur d'une transaction globale mais qui n'est pas dirigé par la transaction. L'envoi d'un message électronique est un exemple de ce type de travail. Le gestionnaire de compensation doit être immédiatement actif de sorte que si un incident se produit dans une activé métier, ce travail non-transactionnel est toujours compensé.
Par exemple, pour un objet sérialisable, en utilisant la même instance d'activité métier que dans l'exemple précédent :Serializable compensationData = new MyCompensationData(); uba.setCompensationDataImmediate(compensationData);
Bien que ces deux méthodes de consignation des données de compensation utilisent la même classe de gestionnaire de compensation, si elles sont appelées dans le même bean enterprise, elles créent deux instances distinctes de la classe du gestionnaire de compensation lors de l'exécution. Ainsi, les actions des méthodes sont mutuellement exclusives ; en appeler une n'écrase pas le travail effectué par l'autre.
Si une instance de gestionnaire de compensation est déjà ajoutée à l'activité métier à l'aide de l'une de ces méthodes, puis que la même méthode est appelée en transmettant null comme paramètre, l'instance de gestionnaire de compensation est supprimée de l'activité métier et n'est pas conduite à fermer ou à compenser pendant l'exécution de l'activité métier.
Comme il est décrit précédemment, la prise en charge de l'activité métier ajoute une instance de gestionnaire de compensation à l'activité métier quand une méthode de consignation des données de compensation est appelée pour la première fois par le bean enterprise qui utilise cette activité métier. En même temps, une image instantanée du contexte d'application métier est effectuée et consignée avec les données de compensation. Lorsque l'activité métier s'achève, tous les gestionnaires de compensation qui ont été ajoutés à l'activité métier sont dirigés vers compensate ou close. Le code que vous créez dans la classe CompensationHandler ou serializable.CompensationHandler s'exécutera obligatoirement dans le même contexte d'application d'entreprise que celui enregistré dans la précédente image instantanée.