| JWhy |
ouais pareil... j'en chie comme c'est pas permis et y'a pas un pet de doc... que ca soit chez IBM ou meme sur Google... a croire que personne n'utilise ca...
bon j'y vais:
avec Delphi 6 (etonnant, non ? ;)) j'utilise les objets COM+ fournis (depuis la v.5.2) par la DLL MQAX200.DLL: TMQSession, TMQQueueManager, TMQQueue, TMQMessage, TMQPutMessageOptions pour mettre un message (texte) dans une queue..
ce sont de simples wrapper autour des interfaces: IMQSession200, IMQQueueManager500, etc...
au final, ca donne qqchose comme ca:
Code :
- function MQPut(AQManager, AQName, ACorrelId, AMessage: string; var AMQSession : TMQSession): boolean;
- var
- mqQueueManager : TMQQueueManager;
- mqQueue : TMQQueue;
- mqMessage : TMQMessage;
- mqPutMessageOptions : TMQPutMessageOptions;
- begin
- result := false;
- mqQueueManager := TMQQueueManager.Create(nil);
- mqQueue := TMQQueue.Create(nil);
- mqMessage := TMQMessage.Create(nil);
- mqPutMessageOptions := TMQPutMessageOptions.Create(nil);
- try
- AMQSession.ClearErrorCodes;
- mqQueueManager.ConnectTo(AMQSession.DefaultInterface.AccessQueueManager(AQManager) as IMQQueueManager500);
- try
- mqQueue.ConnectTo(mqQueueManager.DefaultInterface.AccessQueue(AQName,
- MQOO_OUTPUT
- or MQOO_INPUT_AS_Q_DEF
- or MQOO_FAIL_IF_QUIESCING,
- emptyparam, emptyparam, emptyparam) as IMQQueue500);
- try
- mqMessage.ConnectTo(AMQSession.DefaultInterface.AccessMessage as IMQMessage500);
- try
- mqPutMessageOptions.ConnectTo(AMQSession.DefaultInterface.AccessPutMessageOptions as IMQPutMessageOptions500);
- try
- mqPutMessageOptions.Options := mqPutMessageOptions.Options
- or MQPMO_SYNCPOINT;
- mqMessage.CorrelationId := ACorrelId
- + StringOfChar(' ',24 - Length(ACorrelId));
- mqMessage.MessageData := AMessage;
- mqQueue.Put(mqMessage.DefaultInterface,
- mqPutMessageOptions.DefaultInterface);
- result := true;
- finally
- mqPutMessageOptions.Disconnect;
- end;
- finally
- mqMessage.Disconnect;
- end;
- finally
- mqQueue.Disconnect;
- end;
- finally
- mqQueueManager.Disconnect
- end;
- finally
- mqPutMessageOptions.free;
- mqMessage.free;
- mqQueue.free;
- mqQueueManager.free;
- end;
- end;
|
donc tout un tas de try..finally pour matcher les connect/disconnect et qq lignes de codes pour effectivement mettre un message... ;)
la fonction qui appelle MQPut a cette tete la:
Code :
- FMQSession.Connect;
- try
- result := MQPut('QM.TEST', 'Q.TEST', 'IDduMsg', 'ContenuDuMsg', FMQSession)
- finally
- FMQSession.Disconnect;
- end;
|
FMQSession etant declare comme un TMQSession
Donc mon pb:
en fait, ca marche bien quand j'appelle la fonction 1 fois... mais si jamais j'ai le malheur de l 'appeler une seconde fois, ca me lance une Exception MQ a la ligne:
Code :
- mqQueueManager.ConnectTo(AMQSession.DefaultInterface.AccessQueueManager(AQManager) as IMQQueueManager500)
|
l'exception en question etant:
MQAX200.MQSession::AccessQueueManager CompletionCode = 2, ReasonCode = 2195, ReasonName = MQRC_UNEXPECTED_ERROR
comme toujours les msgs de MQSeries sont super explicites :(
donc si jamais tu as une idée :jap: [jfdsdjhfuetppo]--Message édité par JWhy--[/jfdsdjhfuetppo] |