OVH Cloud OVH Cloud

MQRC_HANDLE_IN_USE_FOR_UOW

1 réponse
Avatar
Biztalk
Bonjour,

Je tente de mettre en place un service de duplication (multi-threads) de
file WMQ.

Pour se faire, j'utilise l'API amqmdnet.dll (WebSphere MQ Classes for .NET)

Je créais autant de thread que de file à dupliquer.
Je passe en "binding connexion", mon service tournant sur la même machine
que le WMQ.

Lors de la tentative de lecture du flux, j'ai l'erreur suivante :
MQRC_HANDLE_IN_USE_FOR_UOW

D'après la doc WMQ, l'action à effectuer pour corriger cette erreur serait :
Corrective action: Check that the “MTS Transaction Support” attribute
defined for the object’s
class is set correctly. If necessary, modify the application so that objects
executing within
different units of work do not try to use the same connection handle.

1 - Comment puis-je m'assurer que je suis bien en "MTS Transaction Support" ?
A noter que ma classe est définie ainsi :
[Transaction(TransactionOption.RequiresNew)]
public class WmqComponent : ServicedComponent
{...}

2 - Comment puis-je m'assurer que je n'utilise pas la même connexion ?
Actuellement, j'ai :
MQEnvironment.Channel = null;
MQEnvironment.Hostname = null;
mqQMgr = new MQQueueManager(qmName);


Merci de votre aide

1 réponse

Avatar
Biztalk
Je pense avoir fini par résoudre ce problème exstenciel.

Je partage donc ma solution :

1 - Définir la class en tant que transactionnelle :
[Transaction(TransactionOption.Supported)]
public class WmqComponent : ServicedComponent
{...}

2 - Ouvrir la connexion en mode HANDLE NO SHARE
MQQueueManager mqQMgr = new
MQQueueManager(qmName,MQC.MQCNO_HANDLE_SHARE_NONE );

3 - Option synchrone sur les objets MQQueue
MQGetMessageOptions gmo = new MQGetMessageOptions();
retrievedMessage = new MQMessage();
myInQueue.Get(retrievedMessage, gmo);