2010-02-02 3 views
3

Je ne suis pas très familier avec IBM MQSeries, mais j'écris des scripts C# qui écrivent et lisent des fichiers depuis mon serveur de file d'attente. Le problème est que ma lecture fonctionne mais pas mon écriture. S'il vous plaît noter que j'utilise la même file d'attente, alors ne vous embêtez pas aller dans cette direction.IBM MQSeries Accéder au problème à partir de .NET

Mon code accède tout d'abord le MQServer avec le code suivant:

MQQueueManager qManager; 
MQQueue queue; 
MQMessage queueMessage; 
MQGetMessageOptions queueGetMessageOptions; 
MQPutMessageOptions queuePutMessageOptions; 

string QueueName; 

public MQAccess(string queueName, string queueManager, string connection, string channel) 
{ 
    QueueName = queueName; 

    qManager = new MQQueueManager(queueManager, channel, connection); 

    queue = qManager.AccessQueue(QueueName, MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING); 
} 

Je suis capable de lire les fichiers de ma file d'attente avec ce code:

public bool NextMessage(ref string message, ref DateTime putDateTime) 
{ 
    queueMessage = new MQMessage(); 
    queueMessage.Format = MQC.MQFMT_STRING; 
    queueGetMessageOptions = new MQGetMessageOptions(); 

    queueGetMessageOptions.Options = MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING; 

    try 
    { 
     queue.Get(queueMessage, queueGetMessageOptions); 
    } 
    catch (MQException mqex) 
    { 
     if (mqex.ReasonCode == MQC.MQRC_NO_MSG_AVAILABLE) 
     { 
      message = ""; 
      return false; 
     } 
     else 
      throw mqex; 
    } 
    message = queueMessage.ReadString(queueMessage.MessageLength); 
    putDateTime = queueMessage.PutDateTime; 

    if (message.StartsWith("´╗┐")) 
    { 
     message = message.Substring(3, message.Length - 3); 
    } 

    return true; 
} 

Si j'essaie cependant d'écrire avec le code suivant me donne des erreurs:

public void WriteMessage(string message) 
{ 
    queueMessage = new MQMessage(); 
    queueMessage.WriteString(message); 
    queueMessage.Format = MQC.MQFMT_STRING; 
    queuePutMessageOptions = new MQPutMessageOptions(); 

    queue.Put(queueMessage, queuePutMessageOptions); 
} 

Mon erreur catch me donne l'erreur:

Error in the application

Qui ne montre pas beaucoup bien sûr. Alors j'ai vérifié le journal des événements sur le serveur et cela m'a montré l'erreur:

An error occurred receiving data from stx041774 (192.168.225.51) over TCP/IP. This may be due to a communications failure.

The return code from the TCP/IP (recv) call was 10054 (X'2746'). Record these values and tell the systems administrator.

Je levai les yeux 10054 et signifie:

An existing connection was forcibly closed by the remote host.

Est-ce que quelqu'un a une idée de ce que je peux faire pour ce travail ? Y at-il peut-être une option MQC que je dois définir pour l'écriture? Parce que je ne sais pas quoi faire avec les options, je ne suis même pas sûr si c'est le problème.

S'il vous plaît garder à l'esprit que je ferme ma connexion aussi à chaque fois avec:

public void Close() 
{ 
    queueMessage = null; 
    queue.Close(); 
    qManager.Close(); 
} 

~MQAccess() 
{ 
    queueMessage = null; 
    queue.Close(); 
    qManager.Close(); 
} 
+0

Savez-vous pourquoi votre première ligne est indentée différemment des autres? C'est très peu attrayant. –

Répondre

1

Squig était proche mais pas de cigare. Lorsque vous ouvrez la file d'attente, vous devez spécifier à la fois la sortie et la sortie sur les options d'ouverture si vous souhaitez à la fois lire et écrire des messages. L'exemple de code n'a que des options de saisie spécifiées.

-2

ayant peut-être un coup d'oeil à cet article sur CodeProject, par rapport au protocole MSMQ, l'article met en œuvre un système de chat.

Espérons que cela aide, Cordialement, Tom.

+0

Ceci est MSMQ, je parle d'IBM MQSeries – WtFudgE

+0

@ wtfudge: Oh désolé ... Dommage! peut-être qu'il aurait été préférable de modifier votre question pour mettre l'accent sur IBM MQSeries, pas MSMQ ... pour ne pas confondre avec les deux ... – t0mm13b

+0

tout ce qui flotte votre bateau -edited- – WtFudgE

1

Tout comme vous définissez vos options get lors de l'obtention des messages que vous devez également définir les options mettre lorsque vous mettez un message

queuePutMessageOptions = MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING 

est ce que votre manque.

+0

Les options de message put sont MQPMO_, les options ouvertes sont MQOO_ et vous mélangez les deux. –

Questions connexes