Dans un environnement sandbox, je teste IBM MQ. J'ai déjà de l'expérience avec RabbitMq.

Avec IBM MQ, je n'ai pas la possibilité de consommer directement un message dans la file d'attente. C'est le cas avec RabbitMQ (méthodes Consume ()). Mais avec IBM MQ, je dois chercher explicitement dans la file d'attente avec le code suivant:

var queue = _queueManager.AccessQueue("queueName", MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING);

C'est ce que je sais sur la lecture d'un message de la file d'attente en ce moment. Mais y a-t-il quelqu'un qui peut m'aider s'il existe un moyen de consommer directement un message (évènementiel, ou en d'autres termes: consommation en temps réel. L'élément dans la file d'attente serait le déclencheur pour commencer à le lire.) Sans appeler le code ci-dessus ?

1
Ozkan 21 avril 2017 à 14:26

3 réponses

Meilleure réponse

Vous pouvez envisager d'utiliser un écouteur de messages du client XMS .NET pour consommer les messages au fur et à mesure qu'ils arrivent dans une file d'attente. Vous devez faire référence à l'assemblage IBM.XMS dans votre projet. Vous pouvez consulter l'exemple de consommateur asynchrone Tools\dotnet\samples\cs\xms\simple\wmq\SimpleAsyncConsumer\SimpleAsyncConsumer.cs.

2
Shashi 21 avril 2017 à 14:59

Si vous souhaitez être déclenché par une arrivée de message dans une file d'attente, vous pouvez configurer un PROCESSUS et configurer ce processus pour qu'il s'exécute en fonction d'un message de déclenchement dans la file d'attente.

Vous pouvez également consulter le MQGMO_WAIT et vous pouvez garder un thread bloquant tout en écoutant un message dans la file d'attente en utilisant presque le code exact que vous avez ci-dessus.

EDIT: vous pouvez donc configurer votre code pour qu'il soit appelé chaque fois qu'un message arrive sur une file d'attente de déclenchement (tous les), ou la première fois qu'un message arrive sur une file d'attente de déclenchement (en premier), et votre processus MQ serait quelque chose comme "/ path /to/myprog.exe ". Les paramètres transmis seraient au format d'un MQTriggerMessage et incluraient le nom de la file d'attente et quelques autres détails. Cela permettrait un nombre illimité de tâches de traitement en supposant que vous définissiez le déclencheur sur chaque message.

Vous pouvez également ouvrir la file d'attente comme étant partagée et plusieurs tâches peuvent attendre qu'un message arrive dans la file d'attente. Utilisation de l'indicateur MQOpenOption.INPUT_SHARED.

1
Joe Zitzelberger 21 avril 2017 à 19:25

Mais avec IBM MQ, je dois chercher explicitement dans la file d'attente avec le code suivant:

var queue = _queueManager.AccessQueue ("queueName", ...

Vous devez faire un peu plus de lecture car AccessQueue ouvre uniquement la file d'attente. Vous devez utiliser la méthode Get de la file d'attente pour récupérer le message.

Si vous voulez le faire pour toujours (jusqu'à ce que le gestionnaire de files d'attente s'arrête), vous pouvez le faire:

private void loopForever(MQQueue inQ)
{
   bool flag = true;
   MQMessage msg = new MQMessage();
   MQGetMessageOptions gmo = new MQGetMessageOptions();
   gmo.Options |= MQC.MQGMO_WAIT | MQC.MQGMO_FAIL_IF_QUIESCING;
   gmo.WaitInterval = MQC.MQEI_UNLIMITED;

   while (flag)
   {
      try
      {
         msg = new MQMessage();
         inQ.Get(msg, gmo);
         System.Console.Out.WriteLine("Message Data: " + msg.ReadString(msg.MessageLength));
      }
      catch (MQException mqex)
      {
         System.Console.Out.WriteLine("MQTest61B CC=" + mqex.CompletionCode + " : RC=" + mqex.ReasonCode);
         flag = false;  // severe error - time to exit
      }
      catch (System.IO.IOException ioex)
      {
          System.Console.Out.WriteLine("MQTest61B ioex=" + ioex);
      }
   }
}
1
Roger 21 avril 2017 à 20:01