2010-02-02 76 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

你知道为什么你的第一行与其余行不同吗?这是非常不吸引人的。 – 2010-02-22 03:00:11

回答

1

Squig靠近但没有雪茄。当您打开队列时,如果要同时读取和写入消息,则需要在打开选项上指定输入输出。示例代码只有指定的输入选项。

-2

也许在看看这篇文章CodeProject,有关MSMQ协议,文章实现了一个聊天系统。

希望这会有所帮助, 最好的问候, 汤姆。

+0

这是MSMQ,我正在谈论IBM MQSeries – WtFudgE 2010-02-02 11:44:02

+0

@wtfudge:哦,对不起......真是无话!也许它可能会更好地编辑你的问题,以强调IBM MQSeries,而不是MSMQ ...不要混淆两个... – t0mm13b 2010-02-02 11:48:13

+0

什么漂浮你的船 - 编辑 - – WtFudgE 2010-02-02 12:42:04

1

正如你得到你还需要设置把 选项,当你把一个消息

queuePutMessageOptions = MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING 

就是丢失邮件时,设置你的GET选项。

+0

放置消息选项是MQPMO_,打开选项是MQOO_和你正在混合这两个。 – 2010-08-04 03:19:32