Il y en a qui travaille avec IBM MQSeries ici ?

Il y en a qui travaille avec IBM MQSeries ici ? - Programmation

Marsh Posté le 11-02-2002 à 23:01:16    

pasque j'ai plein de problemes lors des Put/Get de messages donc plutot qu'exposer mes soucis pendant 3h et ce, peut-etre, dans le vent, je prefererai etre sur qu'il y ai qq'un pour me repondre !
 
 :jap:


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 11-02-2002 à 23:01:16   

Reply

Marsh Posté le 11-02-2002 à 23:42:11    

j'ai joué avec ça pendant mon stage de l'année passée...
haaa combien d'heures j'ai passé avec la doc d'IBM et leurs exemples avec des bugs bien cachés  :gun:
mais bon je sais pas si je me souviens de tout et surtout si je saurais répondre à tes questions...

 

[jfdsdjhfuetppo]--Message édité par antp--[/jfdsdjhfuetppo]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 12-02-2002 à 00:07:34    

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 :
  1. function MQPut(AQManager, AQName, ACorrelId, AMessage: string; var AMQSession : TMQSession): boolean;
  2. var
  3.   mqQueueManager : TMQQueueManager;
  4.   mqQueue        : TMQQueue;
  5.   mqMessage      : TMQMessage;
  6.   mqPutMessageOptions : TMQPutMessageOptions;
  7. begin
  8.   result := false;
  9.   mqQueueManager      := TMQQueueManager.Create(nil);
  10.   mqQueue            := TMQQueue.Create(nil);
  11.   mqMessage          := TMQMessage.Create(nil);
  12.   mqPutMessageOptions := TMQPutMessageOptions.Create(nil);
  13.   try
  14.     AMQSession.ClearErrorCodes;
  15.     mqQueueManager.ConnectTo(AMQSession.DefaultInterface.AccessQueueManager(AQManager) as IMQQueueManager500);
  16.     try
  17.       mqQueue.ConnectTo(mqQueueManager.DefaultInterface.AccessQueue(AQName,
  18.                                              MQOO_OUTPUT
  19.                                             or MQOO_INPUT_AS_Q_DEF
  20.                                             or MQOO_FAIL_IF_QUIESCING,
  21.                                             emptyparam, emptyparam, emptyparam) as IMQQueue500);
  22.       try
  23.         mqMessage.ConnectTo(AMQSession.DefaultInterface.AccessMessage as IMQMessage500);
  24.         try
  25.           mqPutMessageOptions.ConnectTo(AMQSession.DefaultInterface.AccessPutMessageOptions as IMQPutMessageOptions500);
  26.           try
  27.             mqPutMessageOptions.Options := mqPutMessageOptions.Options
  28.                                                 or MQPMO_SYNCPOINT;
  29.             mqMessage.CorrelationId     := ACorrelId
  30.                                           + StringOfChar(' ',24 - Length(ACorrelId));
  31.             mqMessage.MessageData := AMessage;
  32.             mqQueue.Put(mqMessage.DefaultInterface,
  33.                         mqPutMessageOptions.DefaultInterface);
  34.             result := true;
  35.           finally
  36.             mqPutMessageOptions.Disconnect;
  37.           end;
  38.         finally
  39.           mqMessage.Disconnect;
  40.         end;
  41.       finally
  42.         mqQueue.Disconnect;
  43.       end;
  44.     finally
  45.       mqQueueManager.Disconnect
  46.     end;
  47.   finally
  48.     mqPutMessageOptions.free;
  49.     mqMessage.free;
  50.     mqQueue.free;
  51.     mqQueueManager.free;
  52.   end;
  53. 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 :
  1. FMQSession.Connect;
  2. try
  3.   result := MQPut('QM.TEST', 'Q.TEST', 'IDduMsg', 'ContenuDuMsg', FMQSession)
  4. finally
  5.   FMQSession.Disconnect;
  6. 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 :
  1. 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]


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 12-02-2002 à 10:14:59    

unexpected error :sweat:
toujours le message génial qui ne dit absolument pas pourquoi ça foire :(
Moi j'avais fait ça en C++, mais le look était pas trop différent je pense...
À première vue je ne vois pas ce qui foire, mais je vais regarder ce soir chez moi si je retrouve du code de mon stage...


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 12-02-2002 à 16:20:08    

vivement ce soir  :bounce:  
 :jap:


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 12-02-2002 à 22:57:55    

Bon... je crois que j'ai reussi a faire un truc qui marche...
 
en fait il semblerait qu'il faille avoir les "memes" objets MQ pour les 2 Put...  
donc j'ai cree les mq* en dehors de la procedure Put, et j'ai cree un autre objet qui a comme propriete une Session, un QManager, une Q, etc... et une methode Put(QManagerName, QName)
 
Je l'instancie, j'assigne les proprietes (les mq* crées "en dehors" ) et j'appelle la fonction Put... je rappelle Put une deuxieme fois ... et ca a l'air de marcher...
 
j'ai du aussi virer les disconnect... il doit gerer ca en interne je pense...
 
m'enfin c'est pas super clair comme truc, quand meme !
 
(si tu as d'autres infos/conseils/remarques, n'hesite pas a les poster :jap: )

 

[jfdsdjhfuetppo]--Message édité par JWhy--[/jfdsdjhfuetppo]


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 12-02-2002 à 23:23:14    

f*ck ... ca marche pas  :(  :cry: :(


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 12-02-2002 à 23:30:24    

hum je trouve plus les sources de mon travail de stage... vais devoir chercher plus.
je me souviens qu'un des trucs pour lesquels j'ai cherché longtemps, c'est qu'à un moment on devait créer un objet (ou une structure) à passer à un objet, mais même après l'appel on ne pouvait pas détruire cet objet.
moi j'avais un truc du genre:
 
if .... un truc
{
   creation/declaration de la structure
   appel d'une fonction en passant en param la structure
   des trucs
}
// ici la structure existe plus, puisque hors du if
appel d'une autre fonction
// et la tout plantait, pcq la structure qu'on lui avait donné plus haut existait plus, et il l'utilisait telle quelle au lieu de copier les données. C'était tiré directement d'un exemple d'IBM, qui fonctionnait car c'etait un tout petit prog. Dans le prog queje faisais, c'etait plus gros, et la memoire etait probablement reutilisee, donc la structure plus valide, donc ca plantait
 
(il est tard, ce post est peut etre incompréhensible :D)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 12-02-2002 à 23:35:37    

si si c'est clair :d
 
c'est ce que je pensais aussi et c'est pour ca que j'avais créér des objets MQ "globaux" et les avais passé a la fonction mais il veut pas non plus :(


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 13-02-2002 à 01:06:25    

bon laisse tomber...
 
j'ai recréé un petit programme (que j'allais envoyé a IBM pour qu'ils me disent ce qui deconnait) qui appelle la meme fonction... la seule difference et que j'ai recréé des nouveaux Queue Managers / queues de test (QM_TEST1/Q_TEST1 et QM_TEST2/Q_TEST2)....
 
et ca marche  :sweat:  
 
j'ai reessayé mon "gros" programme avec les QM_TEST*/Q_TEST* nouvellement créés  
 
et ca marche  :sweat:  
 
c'est vraiment n'importe quoi...  :sweat:  :gun:

 

[jfdsdjhfuetppo]--Message édité par JWhy--[/jfdsdjhfuetppo]


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 13-02-2002 à 01:06:25   

Reply

Marsh Posté le 13-02-2002 à 16:22:09    

bon en fait c'etait pas ca le pb... mais j'ai trouvé maintenant [:veryfree]
 
en fait si je fais un GET d'un QM 'qm_1' puis un PUT dans un 'qm_2' et encore un PUT dans le 'qm_1' ca me crashe a la figure...
 
 
par contre, si je fais un GET d'un QM 'qm_1' puis un PUT dans le meme 'qm_1' et qu'apres je fais le PUT dans le 'qm_2' ca marche...
 
on dirait qu'il n'aime pas trop que je change de Queue Manager pour y revenir apres :??:
 
m'enfin, j'ai modifié  le code pour faire tout ce que j'ai a faire dans le meme QM avant de passer au suivant et maintenant ca marche !  :crazy:

 

[jfdsdjhfuetppo]--Message édité par JWhy--[/jfdsdjhfuetppo]


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed