Affichage des articles dont le libellé est JMS. Afficher tous les articles
Affichage des articles dont le libellé est JMS. Afficher tous les articles
mercredi 7 décembre 2011
PRINCIPE
(Les versions étudiées sont Weblogic et Oracle DataBase 11G)
Lors de l’utilisation d’une file JMS, les messages sont persistés dans une zone de sauvegarde appelée Store qui permet de conserver et reprendre les données lors de panne d’instance. Le message est sauvegardé lors de la mise en file, puis supprimé lors de sa consommation.
Nous avons deux types possibles :
ü FileStore Persistance en fichier.
ü JDBCStore Persistance en base.
JDBC STORE
Le JDBC Store nécessite la création d’un DataSource associé à la base qui va héberger les messages. Le DataSource à créer doit être non XA car c’est l’implémentation JMS Weblogic qui supporte l’aspect transactionnel (de toutes les façons, l’IHM de création d’un JDBCStore ne fait apparaître que les DataSource non XA).
Il faudra donc créer un DataSource spécifique pour le JDBCStore non partagé par les applications déployées. Prendre un driver non XA et décocher l’option Supports Global Transactions.
Le JDBCStore n’utilise qu’au maximum 3 connexions et en conserver 2 (connexion qu’il ne relâche jamais et ne remet donc pas dans le pool). Il faudra donc prévoir une taille de pool avec la considération de 3 connexions par JDBCStore.
(Détail de la consommation du Pool avec les 2 connexions constamment en cours d’utilisation)
Comme la connexion est maintenue par la ressource du Store, on pourra mettre un timeout sur la connexion avec le paramètre Statement Timeout afin de libérer celle-ci en cas de non-réponse de la base. Cela s’avère nécessaire lors de l’utilisation du MultiDataSource avec la perte d’un nœud RAC associé à la tombée d’une machine. Dans ce cas de figure, les threads associés à la gestion JMS sont bloqués sur l’accès base en non-réponse.
consoleà${domaine}àServicesàData Sourcesà${DataSource Name}àConfigurationàConnection PoolàAdvanced
àStatement Timeout : 5
Dans le cas d’un MutliDataSource, ne pas mettre de load balancing, mais plutôt le failover. Dans le cas de forte volumétrie, dissocier les DataBase et multiplier les serveurs JMS et JDBC Store.
Un problème intervient sur les JDBC Store lorsque la base tombe u. Dans ce cas de figure, le DataSource passe en status Failed v et si un message passe sur la file, le Store se met en échec w. Lors de la remontée de la base x, le DataSource se remet automatiquement y, mais pas le Store z. Il faut dans ce cas remonter l’instance Weblogic.
Dans le cas d’indisponibilité totale de la base ou du RAC (tous les nœuds tombés). Une solution proposée par le support Oracle est d’activer la migration de ressource (Whole Server Migration) qui en cas de panne de ce type cherche à faire un rejeux sur le Store et le réactive sans basculer (à confirmer avec le support). Il n’est donc plus nécessaire de redémarrer l’instance. Il faudra valider cette partie avec un test de robustesse.
Pour les indisponibilités passagères (problème réseau, etc ), lorsque la connexion du DataSource devient inaccessible, un mécanisme de retry de connexion du JDBCStore est mis en jeux. Par défaut, l’attente avant le retry est de 1s. On pourra modifier cette valeur avec un maximum de 15s avec le properties JAVA suivant. On pourra donc positionner cette valeur à 10.
-Dweblogic.store.jdbc.IORetryDelaySeconds=[1-15]
Concernant les DataSource, il est préférable de les paramétrer avec un test systématique et un Trust de connexion à 0 (temps de durée de validation d’une connexion testé) afin d’être sur que la connexion utilisée est valide (sans échec possible de requêtage).
consoleà${domaine}àServicesàData Sourcesà${DataSource Name}àConfigurationàConnection PoolàAdvanced
àSeconds to Trust an Idle Pool Connection : 0
àTest Connections On Reserve : true
Si la base n’est pas en RAC, vous pouvez mettre un Connection Creation Retry Frequency à 600 afin de se reconnecter ultérieurement (attention recommandation de la documentation Oracle mais impliquant une accumulation de transaction avec un dépassement de capacité mémoire ou autre dysfonctionnement possible)
consoleà${domaine}àServicesàData Sourcesà${DataSource Name}àConfigurationàConnection PoolàAdvanced
à Connection Creation Retry Frequency: 600
Le JDBCStore utilise une table qu’il crée au démarrage de l’instance via des scriptes DDL contenu dans MW_HOME
\modules\com.bea.core.store.jdbc_1.0.0.0.jar. On peut les créer manuellement comme le présente l’exemple suivant (en remplaçant le $TABLE par le nom de la table) :oracle.ddl
# WebLogic JDBC Store DDL for Oracle
# Copyright (c) 2003 by BEA, Inc., All Rights Reserved
CREATE TABLE $TABLE (
id int not null primary key,
type int not null,
handle int not null,
record long raw not null
);
Concernant le nom de la table la convention est la suivante :
${PREFIXE_NAME}WLSTORE
Le Prefixe Name permet de n’avoir qu’une seule table distincte par Store.
JDBCSTORE1WLSTORE
Lorsque la base n’est plus disponible et que le Store passe en Failed, Les messages passent d’un status visible en send transaction. Il faut dans ce cas de figure, exporter les messages en mémoire dans un fichier puis les re importer après redémarrage de la base et de l’instance WLS.
FILE STORE
Par défaut, Weblogic déclare un File Store même si l’on n’a pas déclaré de Store pour le serveur JMS (Store utilisé pour les transactions log JTA ainsi que les messages JMS). Ce Store par défaut se trouve dans le répertoire :
${DOMAIN_NAME}\servers\${INSTANCE_NAME}\data\store\default\_WLS_${INSTANCE_NAME}000000.DAT
Lorsque l’on déclare un FileStore, on peut le spécifier dans un répertoire global à toutes les instances de préférence partagée par toutes les machines de façon à effectuer des reprises en cas de panne machine. Chaque instance devant utiliser un FileStore différent sous peine d’avoir des incohérences dans la diffusion des messages (il vaut mieux créer le répertoire au par avance avant de créer la ressource).
Le nom fichier du FileStore aura la convention suivante ou #### représente un nombre unique de différentiations (dans le cas de nom identique).
${FILESTORE_HOME}\${FILESTORE_NAME}######.DAT
Le File Store définit 3 types de politiques d’écriture qui peut être conservée avec le mode par défaut qui est le Direct-Write (utilisant une librairie native I/O wlfileio2 ).
Pour le répertoire partagé, préférer un disque SAN plutôt que NFS qui n’a pas forcement de support pour les écritures directes et qui peuvent entraîner des lock d’écritures. Si vous avez la possibilité, essayer de placer les fichiers sur des disques dédiés (voir plateaux) pour de la forte volumétrie afin de dissocier les accès disque.
La taille des fichiers issue du FileStore est gérée par le Store lui-même qui peut s’agrandir selon les besoins, mais jamais diminuer. Prévoir donc un FileSystem conséquent par rapport à votre charge.
STORE
L’action de persistance (File ou Base) est un paramétrage qui peut se définir à plusieurs niveaux.
ü Dans le code client.
ü Dans l’objet Factory de connection (${factory}àConfigurationàDefault DeliveryàDefault Delivery Mode : Persistent)
ü Dans les Queues/Topic (${factory}àConfigurationàOverrideàDefault Delivery Mode : Persistent)
La durée de rétention est différente selon les cas. Dans le cas des Topic, le message est persisté jusqu’a ce que tous les souscripteurs ont consommé le message. Dans le cas des Queues, le message est retiré du Store une fois consommé. Dans tous les cas, le message est retiré en cas d’expiration ou suppression administrative.
Chose importante pour la volumétrie mémoire, les Header JMS sons conservés en mémoire, ainsi qu’un certain nombre de messages même s’ils sont persisté dans le Store (pour des considérations de performance).
FILE VS JDBC
Le choix entre les deux types de Store peut se résumer à un besoin de performance ou de fiabilité et de souplesse de reprise sur erreur.
Le mode File est plus performant et plus tolérant par rapport à une indisponibilité de base (à condition d’avoir un File System performant sans perte au niveau des caches en écriture). Il a le désavantage de devoir mettre en place un File System partagée pour les reprises en cas de panne machine. On le choisira pour de fortes volumétries et des contraintes de temps de réponse.
Le mode JDBC à l’avantage d’avoir un mode centralisé natif (via la database) et facilite les reprises en cas de panne machine, mais avec des temps moins performants par rapport au mode File. Il supporte difficilement les pertes momentanées des bases avec comme contrainte de devoir redémarrer les instances. On le choisira pour des besoins de sécurisation sans avoir de contrainte de temps de réponse (de préférence à utiliser avec une base clustérisée pour éviter les indisponibilités et redémarrage intempestif).
| | FILE | JDBC |
| Sécurisation | | X |
| Performant | X | |
| Tolérance aux pannes | X | |
| Reprise Sur Erreur | | X |
mardi 6 septembre 2011
L’ordonnancement des messages ou UnitOfOrder dans JMS sous Weblogic permet de respecter l’ordre des messages en arrivées par rapport à leur ordre de production.
Il se peut que lors du passage des messages dans une architecture multitiers, la propagation de certains messages soit ralentie par rapport à d’autres, ce qui peut aboutir à une arrivée désordonnée par rapport à l’ordre de leurs créations.
Une question peut se poser si lors de la propagation des messages des événements imprévus surviennent. Quand est-il de l’ordonnancement si des mécanismes d’erreur réémettent les messages, que se passe-t-il si des messages sont perdus, l’ordonnancement est-il arrêté, etc …
Ce post restitue un test que j’ai réalisé avec un prototype mettant en œuvre le JMS UnitOfOrder avec un certain nombre de simulations d’erreur et de perturbation afin d’évaluer le fonctionnement de cette fonctionnalité.
ARCHITECTURE
Le prototype simule l’envoi de message par un client JAVA multi thread qui va simuler l’envoi de message vers la plateforme JEE.
Message texte envoyé par le producteur de message.
Threads[No Thread]-No[No message]
Deux couches sont implémentées avec une file de messages (Queue) dans lequel est déposé le message puis lues par un MDB. Celui-ci fait appel à un EJB pour remettre le message dans une autre file JMS.
En final le message est déposé dans une file de messages de sortie lue par un client JAVA qui affiche la totalité des messages produits (avec l’ordre d’arrivée).
Les traitements effectués sur les flux sont :
ü Une temporisation aléatoire (Wait) est introduite dans chaque composant afin de désynchroniser l’ordre d’arrivée final.
ü Une exception et levé aléatoirement sur les MDB afin de simuler les erreurs techniques. Un mécanisme de rejeux JMS est mise en place sur les files de messages pour réinjecter les messages 1 fois. Au bout du 2eme échec, le message est mis dans une file d’erreurs.
ü Un mécanisme de switch aléatoire est placé dans l’EJB de sortie afin de simuler les exceptions applicatives.
A chaque passage dans les composants JEE, le message est enrichi en y ajoutant le nom du composant, de l’instance de passage et du temps d’attente. L’affichage final du consommateur affichant en 1er l’ordre d’arrivée
PARAMETRAGE
L’architecture mise en place est un domaine Weblogic avec deux instances en cluster et un domaine mono-instance. Les files de messages de type Queue ont été paramétrées en mode Uniform Distributed Queue sur la plate-forme cluster avec les paramétrages suivants :
- Déclaration d’un Path Service obligatoire pour l’utilisation du UnitOfOrder en cluster ciblé sur l’instance managed1 (service singleton à migrer en cas de problème) (un seul Path Service par cluster).
${DOMAIN_NAME}àServicesàPath Services
- Paramétrage de la Connexion Factory pour déclarer le UnitOfOrder côté client.
${DOMAIN_NAME}àServicesàMessagingàJMS Modulesà${JMS_MODULE_NAME}à${CONNECTION_FACTORY}àConfigurationàDefault DeliveryàDefault Unit-Of-Order for Producer:System-generated.
- Désactivation du Server Affinity pour le LoadBalancing afin qu’un même client répartisse la charge sur le cluster.
${DOMAIN_NAME}àServicesàMessagingàJMS Modulesà${JMS_MODULE_NAME}à${CONNECTION_FACTORY}àConfigurationàLoad BalancingàServer Affinity Enabled:OFF.
- Déclaration du Path Service dans les Queues.
${DOMAIN_NAME}àServicesàMessagingàJMS Modulesà${JMS_MODULE_NAME}à${QUEUE}àConfigurationàGeneralàAdvancedàUnit-Of-Order Messge Routing:Path Service.
- Définir la politique de retry en cas d’erreur avec un rejeux d’1 fois (pour l’exemple).
${DOMAIN_NAME}àServicesàMessagingàJMS Modulesà${JMS_MODULE_NAME}à${QUEUE}àConfigurationàGeneralàDelivery Failure
àRedelivery Delay Override=1
àRedelivery Limit=1
àExpiration Policy=Redirect
àError Destination=${QUEUE_ERROR}
- Mise en place setRollBackOnly dans le code MDB pour mettre la transaction en échec sur une erreur applicative et déclencher le traitement d’erreur du MDB (rejeux ou mise en dead letter)
} catch (Exception e) {
if( alreadyRedelivered ) System.out.println("MDB1 MESSAGE On ERROR -> REPUBLISH ONCE AGAIN : " + msgText);
else System.out.println("MDB1 MESSAGE On ERROR -> REPUBLISH : " + msgText);
getMessageDrivenContext().setRollbackOnly();
}
- Sur QueueOut, positionner le Forward Delay à 1 afin que le consommateur puisse récupérer les messages de la seconde instance (consommation non load-balancé)
${DOMAIN_NAME}àServicesàMessagingàJMS Modulesà${JMS_MODULE_NAME}à${QUEUE}àConfigurationàGeneralàForward Delay:1.
TESTS
Dans le domaine mono-instance, le Path Service n’est pas obligatoire pour respecter l’ordre. Par contre sans le paramétrage UnitOfOrder ou du Path Service en cluster, les messages arrivent dans le désordre.
${DOMAIN_NAME}àServicesàMessagingàJMS Modulesà${JMS_MODULE_NAME}à${CONNECTION_FACTORY}àConfigurationàDefault DeliveryàDefault Unit-Of-Order for Producer:None.
Affichage du consommateur avec l’ordre d’arriver sur un consommateur mono thread de 20 messages. Nous pouvons voir que l’ordonnancement des messages n’est pas assuré. Les messages manquants ont été mis dans les dead letter queue suite à la génération d’exception aléatoire.
1 : Threads[0]-No[4] : ->MDB1[AdminServer][50]->EJB1[AdminServer][30]->MDB2[AdminServer][30]->EJB2[AdminServer][30]
2 : Threads[0]-No[9] : ->MDB1[AdminServer][50]->EJB1[AdminServer][50]->MDB2[AdminServer][50]->EJB2[AdminServer][50]
3 : Threads[0]-No[14] : ->MDB1[AdminServer][50]->EJB1[AdminServer][30]->MDB2[AdminServer][40]->EJB2[AdminServer][50]
4 : Threads[0]-No[8] : ->MDB1[AdminServer][40]->EJB1[AdminServer][50]->MDB2[AdminServer][40]->EJB2[AdminServer][30]
5 : Threads[0]-No[13] : ->MDB1[AdminServer][30]->EJB1[AdminServer][50]->MDB2[AdminServer][30]->EJB2[AdminServer][40]
6 : Threads[0]-No[7] : ->MDB1[AdminServer][30]->EJB1[AdminServer][30]->MDB2[AdminServer][50]->EJB2[AdminServer][40]
7 : Threads[0]-No[3] : ->MDB1[AdminServer][30]->EJB1[AdminServer][30]->MDB2[AdminServer][50]->EJB2[AdminServer][40]
8 : Threads[0]-No[5] : ->MDB1[AdminServer][50]->EJB1[AdminServer][40]->MDB2[AdminServer][40]->EJB2[AdminServer][30]
9 : Threads[0]-No[15] : ->MDB1[AdminServer][50]->EJB1[AdminServer][30]->MDB2[AdminServer][50]->EJB2[AdminServer][50]
10 : Threads[0]-No[2] : ->MDB1[AdminServer][30]->EJB1[AdminServer][50]->MDB2[AdminServer][30]->EJB2[AdminServer][30]
11 : Threads[0]-No[10] : ->MDB1[AdminServer][30]->EJB1[AdminServer][30]->MDB2[AdminServer][50]->EJB2[AdminServer][30]
12 : Threads[0]-No[0] : ->MDB1[AdminServer][40]->EJB1[AdminServer][40]->MDB2[AdminServer][30]->EJB2[AdminServer][40]
13 : Threads[0]-No[1] : ->MDB1[AdminServer][30]->EJB1[AdminServer][40]->MDB2[AdminServer][50]->EJB2[AdminServer][40]
14 : Threads[0]-No[19] : ->MDB1[AdminServer][40]->EJB1[AdminServer][30]->MDB2[AdminServer][40]->EJB2[AdminServer][40]
Si l’on remet le UnitOfOrder actif, nous constatons sur le résultat l’ordonnancement des messages malgré les messages écartés par des exceptions système ou applicative.
1 : Threads[0]-No[1] : ->MDB1[AdminServer][50]->EJB1[AdminServer][30]->MDB2[AdminServer][30]->EJB2[AdminServer][30]
2 : Threads[0]-No[4] : ->MDB1[AdminServer][40]->EJB1[AdminServer][50]->MDB2[AdminServer][40]->EJB2[AdminServer][30]
3 : Threads[0]-No[12] : ->MDB1[AdminServer][50]->EJB1[AdminServer][30]->MDB2[AdminServer][50]->EJB2[AdminServer][40]
4 : Threads[0]-No[16] : ->MDB1[AdminServer][30]->EJB1[AdminServer][30]->MDB2[AdminServer][30]->EJB2[AdminServer][40]
5 : Threads[0]-No[18] : ->MDB1[AdminServer][30]->EJB1[AdminServer][50]->MDB2[AdminServer][40]->EJB2[AdminServer][30]
<!--[if !supportLists]-->1 <!--[endif]-->: Threads[0]-No[19] : ->MDB1[AdminServer][50]->EJB1[AdminServer][30]->MDB2[AdminServer][30]->EJB2[AdminServer][40]
Par contre quand on rejoue les messages des dead letter queue (via une procédure manuelle d’administration de mouvement de Queue), l’ordonnancement est perdu.
1 : Threads[0]-No[1] : ->MDB1[AdminServer][50]->EJB1[AdminServer][30]->MDB2[AdminServer][30]->EJB2[AdminServer][30]
2 : Threads[0]-No[4] : ->MDB1[AdminServer][40]->EJB1[AdminServer][50]->MDB2[AdminServer][40]->EJB2[AdminServer][30]
3 : Threads[0]-No[12] : ->MDB1[AdminServer][50]->EJB1[AdminServer][30]->MDB2[AdminServer][50]->EJB2[AdminServer][40]
4 : Threads[0]-No[16] : ->MDB1[AdminServer][30]->EJB1[AdminServer][30]->MDB2[AdminServer][30]->EJB2[AdminServer][40]
5 : Threads[0]-No[18] : ->MDB1[AdminServer][30]->EJB1[AdminServer][50]->MDB2[AdminServer][40]->EJB2[AdminServer][30]
6 : Threads[0]-No[19] : ->MDB1[AdminServer][50]->EJB1[AdminServer][30]->MDB2[AdminServer][30]->EJB2[AdminServer][40]
7 : Threads[0]-No[0] : ->MDB1[AdminServer][40]->EJB1[AdminServer][50]->MDB2[AdminServer][50]->EJB2[AdminServer][40]
8 : Threads[0]-No[6] : ->MDB1[AdminServer][50]->EJB1[AdminServer][50]->MDB2[AdminServer][50]->EJB2[AdminServer][50]
9 : Threads[0]-No[8] : ->MDB1[AdminServer][40]->EJB1[AdminServer][30]->MDB2[AdminServer][40]->EJB2[AdminServer][30]
10 : Threads[0]-No[2] : ->MDB1[AdminServer][30]->EJB1[AdminServer][40]->MDB2[AdminServer][50]->EJB2[AdminServer][40]
11 : Threads[0]-No[3] : ->MDB1[AdminServer][40]->EJB1[AdminServer][40]->MDB2[AdminServer][50]->EJB2[AdminServer][50]
12 : Threads[0]-No[7] : ->MDB1[AdminServer][40]->EJB1[AdminServer][50]->MDB2[AdminServer][50]->EJB2[AdminServer][30]
13 : Threads[0]-No[9] : ->MDB1[AdminServer][30]->EJB1[AdminServer][40]->MDB2[AdminServer][40]->EJB2[AdminServer][30]
14 : Threads[0]-No[10] : ->MDB1[AdminServer][50]->EJB1[AdminServer][30]->MDB2[AdminServer][40]->EJB2[AdminServer][50]
15 : Threads[0]-No[15] : ->MDB1[AdminServer][40]->EJB1[AdminServer][40]->MDB2[AdminServer][40]->EJB2[AdminServer][50]
16 : Threads[0]-No[17] : ->MDB1[AdminServer][40]->EJB1[AdminServer][50]->MDB2[AdminServer][50]->EJB2[AdminServer][50]
17 : Threads[0]-No[13] : ->MDB1[AdminServer][30]->EJB1[AdminServer][50]->MDB2[AdminServer][30]->EJB2[AdminServer][30]
18 : Threads[0]-No[11] : ->MDB1[AdminServer][30]->EJB1[AdminServer][50]->MDB2[AdminServer][40]->EJB2[AdminServer][40]
19 : Threads[0]-No[5] : ->MDB1[AdminServer][30]->EJB1[AdminServer][50]->MDB2[AdminServer][50]->EJB2[AdminServer][50]
20 : Threads[0]-No[14] : ->MDB1[AdminServer][50]->EJB1[AdminServer][40]->MDB2[AdminServer][40]->EJB2[AdminServer][50]
L’ordonnancement est donc conservé tant qu’il n’y a pas rupture de transaction ou mise à l’écart du flux. Le rejeux administratif n’utilise pas le UnitOfOrder, ce qui explique le non-respect de l’ordonnancement (rejeux successif, car génération d’erreur lors de la réinjection des messages)
Même constat en cluster.
1 : Threads[0]-No[0] : ->MDB1[managed1][30]->EJB1[managed1][30]->MDB2[managed2][30]->EJB2[managed2][40]
2 : Threads[0]-No[1] : ->MDB1[managed1][50]->EJB1[managed1][50]->MDB2[managed1][50]->EJB2[managed1][30]
3 : Threads[0]-No[2] : ->MDB1[managed1][50]->EJB1[managed1][30]->MDB2[managed2][50]->EJB2[managed2][40]
4 : Threads[0]-No[3] : ->MDB1[managed1][50]->EJB1[managed1][30]->MDB2[managed1][30]->EJB2[managed1][30]
5 : Threads[0]-No[4] : ->MDB1[managed1][50]->EJB1[managed1][30]->MDB2[managed2][50]->EJB2[managed2][30]
6 : Threads[0]-No[6] : ->MDB1[managed1][30]->EJB1[managed1][40]->MDB2[managed2][30]->EJB2[managed2][30]
7 : Threads[0]-No[7] : ->MDB1[managed1][30]->EJB1[managed1][30]->MDB2[managed1][40]->EJB2[managed1][30]
8 : Threads[0]-No[9] : ->MDB1[managed1][40]->EJB1[managed1][50]->MDB2[managed1][30]->EJB2[managed1][40]
9 : Threads[0]-No[11] : ->MDB1[managed1][30]->EJB1[managed1][30]->MDB2[managed2][50]->EJB2[managed2][30]
10 : Threads[0]-No[13] : ->MDB1[managed1][40]->EJB1[managed1][30]->MDB2[managed2][40]->EJB2[managed2][40]
11 : Threads[0]-No[15] : ->MDB1[managed1][30]->EJB1[managed1][40]->MDB2[managed2][30]->EJB2[managed2][30]
12 : Threads[0]-No[17] : ->MDB1[managed1][40]->EJB1[managed1][50]->MDB2[managed2][40]->EJB2[managed2][40]
13 : Threads[0]-No[18] : ->MDB1[managed1][40]->EJB1[managed1][30]->MDB2[managed1][50]->EJB2[managed1][30]
14 : Threads[0]-No[19] : ->MDB1[managed1][40]->EJB1[managed1][40]->MDB2[managed2][50]->EJB2[managed2][30]
15 : Threads[0]-No[10] : ->MDB1[managed1][30]->EJB1[managed1][30]->MDB2[managed1][50]->EJB2[managed1][50]
16 : Threads[0]-No[8] : ->MDB1[managed1][30]->EJB1[managed1][30]->MDB2[managed2][30]->EJB2[managed2][40]
17 : Threads[0]-No[14] : ->MDB1[managed1][40]->EJB1[managed1][40]->MDB2[managed1][50]->EJB2[managed1][40]
18 : Threads[0]-No[16] : ->MDB1[managed1][40]->EJB1[managed1][50]->MDB2[managed1][50]->EJB2[managed1][40]
19 : Threads[0]-No[5] : ->MDB1[managed1][40]->EJB1[managed1][50]->MDB2[managed1][30]->EJB2[managed1][30]
20 : Threads[0]-No[12] : ->MDB1[managed1][50]->EJB1[managed1][50]->MDB2[managed1][50]->EJB2[managed1][30]
CONCLUSION
La fonctionnalité UnitOfOrder permet d’ordonnancer les messages JMS par producteur avec la contrainte d’avoir une ressource Singleton en cluster (prévoir migration).
Lors d’erreur technique et applicative, les messages mis à l’écart ne sont plus garantis pour l’ordonnancement (retiré de la liste ordonnée reçue par le consommateur). Lors de leurs réinjections, ils sont reçus désynchronisés (après les messages ordonnés), ce qui peut poser un problème si l’ordre initial doit être respecté.
Aucun mécanisme ne peut garantir l’ordonnancement des messages en erreurs, car nécessitant le blocage complet des flux le temps de la réinjection. Il faudra donc prévoir un scénario de rejeux applicatif afin de rollbacker l’ensemble des messages associés au flux et les rejouer.
La fonctionnalité UnitOfOrder permet par contre de garantir les flux hors événement d’erreur et de s’assurer du bon traitement ordonné sur un ensemble de messages d’un client.
Inscription à :
Articles (Atom)
AUTEUR
- Jean FRANCOIS
- Carrières Sur Sein, Yvelines, France
- Consultant Oracle (Ancien consultant BEA depuis 2001), je m’occupe des expertises sur les produits Oracle : SOCLE (Weblogic, Coherence, JRockit) SOA (Service Bus, SOA Suite, BPM)
MON CV
LABEL 3D
Blogumulus by Roy Tanck and Amanda Fazani
LABEL CLOUD
ARCHIVES
AUTRES BLOG
-
Alexandre Vasseur ex (BEA | Oracle FR / Esper)
James Bayer (BEA | Oracle US)
Maxence Button ex (BEA | Oracle FR)
Marc Kelderman
Edwin Biemond (Oracle ACE)
Mark Smith (Oracle)
Chris Tomkins (Oracle)

















































