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

Le support d'activité métier fournit une API UserBusinessActivity et deux interfaces : une interface serializable.CompensationHandler et une interface CompensationHandler. Chaque interface a deux exceptions : RetryCompensationHandlerException et CompensationHandlerFailedException. Vous pouvez rechercher l'interface UserBusinessActivity dans le serveur d'applications JNDI (Java™ Naming and Directory Interface) sur java:comp/websphere/UserBusinessActivity. Exemple :
InitialContext ctx = new InitialContext();
UserBusinessActivity uba = (UserBusinessActivity) ctx.lookup("java:comp/websphere/UserBusinessActivity");
Vous pouvez utiliser la méthode getId pour accéder à l'identificateur unique de l'activité métier actuellement associée à l'unité d'exécution appelante. L'identificateur est identique à celui généré pour la portée de l'activité métier lors de l'exécution et qui est utilisé pour les messages informatifs, d'avertissement et d'erreur. Par exemple, l'application peut utiliser l'identificateur dans des messages d'audit ou de diagnostic et il est possible d'effectuer une corrélation entre les messages générés par l'application et lors de l'exécution.
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
Si un composant d'application exécute une tâche qui peut nécessiter une compensation en cas de défaillance dans l'activité métier, vous devez fournir une classe de gestionnaire de compensation faisant partie de l'application déployée. Cette classe Java doit mettre en oeuvre l'une des interfaces suivantes :
  • 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.
En général, les applications dont les données sont déjà disponibles au format DataObject utiliseront l'interface CompensationHandler, et les autres utiliseront l'interface serializable.CompensationHandler. Les deux interfaces prennent en charge les méthodes close et compensate.

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.
Par exemple, pour un SDO, et en utilisant la même instance d'activité métier que dans l'exemple précédent :
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.

Pour plus de détails sur les méthodes disponibles dans l'API d'activité métier, voir la rubrique relative aux API supplémentaires.

Icône indiquant le type de rubrique Rubrique de référence



Icône d'horodatage Dernière mise à jour: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=rjta_wsba_api
Nom du fichier : rjta_wsba_api.html