我期待着实现一个有点智能的 MQ 通信模块,它应该能够容忍网络连接中的中断。基本上,如果连接丢失,它应该每 5 秒尝试重新连接一次。
问题如下。我使用以下代码进行阅读:
queueMessage = new MQMessage();
queueMessage.Format = MQC.MQFMT_STRING;
queueGetMessageOptions = new MQGetMessageOptions();
queueGetMessageOptions.Options = MQC.MQGMO_SYNCPOINT + MQC.MQGMO_WAIT + MQC.MQGMO_FAIL_IF_QUIESCING;
queueGetMessageOptions.WaitInterval = 50;
producerQueue.Get(queueMessage, queueGetMessageOptions);
msg = queueMessage.ReadBytes(queueMessage.MessageLength);
(当然我之前成功连接到队列管理器等。)
我遇到了以下问题:当这个例程运行时,但在.Get
没有连接时,代码只是挂起并停留在.Get
. 我使用计时器来查看是否有超时(理论上即使没有必要,对吗?)并且在超时时我尝试重新连接。但是当这个超时到期时,我仍然看到队列管理器报告它已连接,而它显然没有(不再存在物理连接)。自从我使用 SYNCPOINT 以来,这个问题就出现了,当我在写入过程中切断连接时,我遇到了同样的情况,或者在这种情况下,我尝试在 queuemanager 上强制断开连接。所以请帮忙,我应该使用什么设置来避免陷入困境Get
,Put
而是有一个MQException
抛出或可控的东西?谢谢!
更新:我使用以下代码连接到 QueueManager。
Hashtable props = new Hashtable();
props.Add(MQC.HOST_NAME_PROPERTY, Host);
props.Add(MQC.PORT_PROPERTY, Port);
props.Add(MQC.CHANNEL_PROPERTY, ChannelInfo);
if(User!="") props.Add(MQC.USER_ID_PROPERTY, User);
if(Password!="") props.Add(MQC.PASSWORD_PROPERTY, Password);
props.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED);
queueManager = new MQQueueManager(QueueManagerName, props);
producerQueue = queueManager.AccessQueue(
ProducerQueueName,
MQC.MQOO_INPUT_AS_Q_DEF // open queue for input
+ MQC.MQOO_FAIL_IF_QUIESCING); // but not if MQM stopping
consumerQueue = queueManager.AccessQueue(
ConsumerQueueName,
MQC.MQOO_OUTPUT + MQC.MQOO_BROWSE + MQC.MQOO_INPUT_AS_Q_DEF // open queue for output
+ MQC.MQOO_FAIL_IF_QUIESCING); // but not if MQM stopping
不用说,通常代码运行良好。读/写,连接/断开连接正常工作,我只需要弄清楚当前的问题。谢谢!