2010-02-02 4 views
3

Я не очень знаком с IBM MQSeries, но я пишу скрипты C#, которые пишут и читают файлы с моего сервера очереди. Проблема заключается в том, что мои работы читаются, но моя запись не работает. Обратите внимание, что я использую одну и ту же очередь, поэтому не беспокойтесь о том, чтобы идти в этом направлении.IBM MQSeries Доступ к проблеме из .NET

Мой код в первую очередь обращается к MQserver со следующим кодом:

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); 
} 

Я могу читать файлы из моей очереди с этим кодом:

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; 
} 

Если я однако стараюсь писать с следующий код дает мне ошибки:

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

    queue.Put(queueMessage, queuePutMessageOptions); 
} 

Ошибка в моей ошибке вызывает у меня ошибку:

Error in the application

Которые не показывают, конечно, конечно. Таким образом, я проверил журнал событий на сервере, и это показало мне ошибку:

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.

я посмотрел 10054 и средства:

An existing connection was forcibly closed by the remote host.

Кто-нибудь есть какие-либо идеи, что я могу сделать, чтобы сделать эту работу ? Возможно, есть опция MQC, которую я должен установить для записи? Поскольку я понятия не имею, что делать с вариантами, я даже не уверен, что это проблема.

Пожалуйста, имейте в виду, что я также закрыть мою связь каждый раз с:

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

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

У вас есть идеи, почему ваша первая строка отличается от остальных? Это очень непривлекательно. –

ответ

1

Squig был рядом, но не сигары. Когда вы открываете очередь, вам нужно указать как входные данные , так и на открытых опциях, если вы хотите как читать, так и писать сообщения. Код примера содержит только указанные параметры ввода.

-2

Может быть, взглянув на эту статью на CodeProject, в отношении протокола MSMQ, статья использует систему чата.

Надеюсь, это поможет, С уважением, Tom.

+0

Это MSMQ, я говорю о IBM MQSeries – WtFudgE

+0

@wtfudge: О, простите ... bummer! возможно, было бы лучше отредактировать ваш вопрос, чтобы подчеркнуть IBM MQSeries, а не MSMQ ..., чтобы не путать с двумя ... – t0mm13b

+0

независимо от того, что плавает ваша лодка -edited- – WtFudgE

1

Подобно тому, как вы установили параметры ПОЛУЧИТЬ при получении сообщения, которые вы также должны установить ставить вариант, когда вы кладете сообщение

queuePutMessageOptions = MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING 

является то, что вашим отсутствует.

+0

Возможные варианты сообщения: MQPMO_, открытые параметры MQOO_, и вы смешиваете два. –