2016-03-24 10 views
1

Ich erhalte eine MQException mit Fehlercode 2195 beim Trennen der Verbindung vom QueueManager. Ich kann den Grund dafür nicht finden. Wie kann ich den Grund für diese Ausnahme herausfinden?MQ Fehler 2195 beim Trennen von QueueManager

Mein Code sieht so aus. Die letzte Zeile wirft die Ausnahme.

 MQQueueManager qMgr = null; 
     MQQueue fromQueue = null; 

     try 
     { 
      // mq properties 
      Hashtable properties = new Hashtable(); 
      properties.Add(MQC.HOST_NAME_PROPERTY, _config.HostName); 
      properties.Add(MQC.PORT_PROPERTY, _config.Port); 
      properties.Add(MQC.CHANNEL_PROPERTY, _config.ChannelName); 
      // managed mode 
      properties.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED); 

      // create connection 
      qMgr = new MQQueueManager(_config.QueueManagerName, properties); 
      fromQueue = qMgr.AccessQueue(_config.QueueName, MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING); 

      MQGetMessageOptions gmo = new MQGetMessageOptions(); 
      gmo.Options = MQC.MQGMO_SYNCPOINT | MQC.MQGMO_FAIL_IF_QUIESCING | MQC.MQGMO_WAIT; 
      gmo.WaitInterval = Convert.ToInt32(timeout.TotalMilliseconds % Int32.MaxValue); 

      try 
      { 
       MQMessage message = new MQMessage(); 
       fromQueue.Get(message, gmo);  //wait for message 

       if (message != null && message.MessageLength > 0) 
       { 
        string strMsg = message.ReadString(message.MessageLength); 
        ret = true; 
       } 
      } 
      catch (MQException ex) 
      { 
       if (ex.ReasonCode != MQC.MQRC_NO_MSG_AVAILABLE)      
       { 
        throw; 
       } 
      } 
     } 
     finally 
     { 
      try 
      { 
       if (fromQueue != null) 
        fromQueue.Close(); 
       if (qMgr != null) 
        if(qMgr.IsConnected) 
         qMgr.Disconnect(); 
+0

Haben Sie FDC-Dateien? Welche Version von MQ verwenden Sie? – ValerieLampkin

+0

Ich kenne keine FDC-Dateien. Wofür werden diese verwendet? Die Serverversion ist 7.5 und die Clientversion ist 8.0.0.4. –

+0

* .FDC-Dateien, die von MQ geschrieben wurden, um Fehler aufzuzeichnen und Informationen darüber abzulegen, was zu dem Zeitpunkt geschah, als MQ den Fehler feststellte. Sie können bei der Fehlersuche nützlich sein. – ValerieLampkin

Antwort

0

MQC.MQGMO_SYNCPOINT

Sie sind eine lokale UOW (Unit of Work) zu schaffen, aber sie nie begehen oder die Transaktion backout. Nun, für eine normale Trennung (gegen abnormal oder Absturz), wird angenommen, dass MQ die Nachricht (en) automatisch festschreibt. Aber Sie sollten NIEMALS antworten, dass MQ Ihre Arbeit für Sie erledigt.

Ich würde vorschlagen, dass Sie MQC.MQGMO_NO_SYNCPOINT verwenden, es sei denn, Sie möchten wirklich Nachrichten in einer UOW abrufen, aber dann müssen Sie Commit- oder Backout-Aufrufe hinzufügen.

if (qMgr.IsConnected)

Dieser Methodenaufruf ist sinnlos. Alles, was es tut, ist die RC & RC-Werte des letzten Aufrufs zu betrachten, um zu bestimmen, ob wahr oder falsch zurückgegeben werden soll. Es testet die Verbindung nicht wirklich. Wie gesagt, sinnlos.

+0

Vielen Dank. Mein Code wird in einem TransactionScope aufgerufen. Ich möchte, dass das Abrufen einer Nachricht und das Schreiben in eine Datenbank in derselben Transaktion erfolgt. Muss ich Commit oder Rollback explizit aufrufen, obwohl ich mich in einem TransactionScope befinde? –

Verwandte Themen