使用 C#.Net WCF Rest 服务访问 IBM MQ 消息



无法从 IBM MQ 检索第一个响应消息。

我在一个 ASP.NET Web 应用程序中设计了 IBM MQ 连接、消息传递和消息检索,它运行良好。 当我尝试在 WCF REST 服务中实现相同的逻辑时,第一个请求将始终在 .net 中返回错误为"MQRC_NO_MSG_AVAIL"。 但是,当我通过第二个请求时,我将收到第一个请求的响应 IBM MQ 中第一个请求的错误是

消息 . . . .

: 从主机 10 接收时出错 (XXX.XXX.X.X
)。原因 . . . . : 接收来自 10 的数据时出错 (XXX.XXX.X.X.X) 通过 TCP/IP。这可能是由于通信 失败。 恢复 . . . : 返回代码来自 TCP/IP(读取)调用是 3426 (X'X'00000D62'')。记录 这些值并告知系统管理员。

请求打开选项:

MQC。MQOO_INPUT_AS_Q_DEF + MQC。MQOO_FAIL_IF_QUIESCING + MQC。MQOO_OUTPUT 响应打开选项:MQC。MQOO_INQUIRE + MQC。MQOO_BROWSE + MQC。MQOO_FAIL_IF_QUIESCING + MQC。MQOO_INPUT_SHARED

注意:当我尝试签入 IBM MQ 资源管理器时,第一个请求响应总是进入"当前队列深度"。当前队列深度在我第二次读取响应时不会变为空白。 我们有单独的输入和输出队列 我们尝试重新启动IBM MQ,清除消息,创建新队列和新通道,但没有任何效果。

读取消息方法:

queue = queueManager.AccessQueue(queueName, MQC.MQOO_INQUIRE + MQC.MQOO_BROWSE + MQC.MQOO_FAIL_IF_QUIESCING + MQC.MQOO_INPUT_SHARED );
queueMessage = new MQMessage();
queueMessage.Format = MQC.MQFMT_STRING;
queueGetMessageOptions = new MQGetMessageOptions();
queue.Get(queueMessage, queueGetMessageOptions);
strReturn = queueMessage.ReadString(queueMessage.MessageLength);

问题已解决。

原因:发送第一个请求时,该消息的连接已经存在,读取操作无法读取输出,因为响应已经由 previous(write) 对象持有。 当我发送第二个请求时,第一个连接已断开连接,因此我能够读取第一个请求的响应。

解决方案:完成我使用的写入操作后 'queueManager.Disconnect()'.但是,从队列中读取消息时,我必须重新建立连接。

The connection code:
System.Collections.Hashtable queueProperties = new System.Collections.Hashtable();
queueProperties[MQC.HOST_NAME_PROPERTY] = host;
queueProperties[MQC.PORT_PROPERTY] = port;
queueProperties[MQC.CHANNEL_PROPERTY] = channel;            
queueManager = new MQQueueManager(queueManagerName, queueProperties);                
The write code:
queue = queueManager.AccessQueue(queueName, MQC.MQOO_INPUT_SHARED + MQC.MQOO_FAIL_IF_QUIESCING + MQC.MQOO_OUTPUT + MQC.MQOO_BROWSE);                
queueMessage = new MQMessage();
queueMessage.WriteString(message);
queueMessage.Persistence = 0;
queueMessage.Format = MQC.MQFMT_STRING;
queuePutMessageOptions = new MQPutMessageOptions();
queue.Put(queueMessage, queuePutMessageOptions);
queueManager.Disconnect();
queue.Close(); 
The read code :
queue = queueManager.AccessQueue(queueName, MQC.MQOO_INQUIRE + MQC.MQOO_BROWSE + MQC.MQOO_FAIL_IF_QUIESCING + MQC.MQOO_INPUT_SHARED + MQC.MQCMD_CREATE_LISTENER);
queueMessage.Format = MQC.MQFMT_STRING;
queueGetMessageOptions = new MQGetMessageOptions();
queue.Get(queueMessage, queueGetMessageOptions);
strReturn = queueMessage.ReadString(queueMessage.MessageLength);
queueManager.Disconnect();
queue.Close();
Method calling:
Write:
connectResp = operation.ConnectMQ(CustomMQ.queueManager, CustomMQ.host, CustomMQ.port, CustomMQ.channel);
sendResp = operation.WriteQMsg(CustomMQ.inputQueueName, request);
Read:
connectResp = operation.ConnectMQ(CustomMQ.queueManager, CustomMQ.host, CustomMQ.port, CustomMQ.channel);
response = operation.ReadQMsg(CustomMQ.outputQueueName);

根据您的经验提供评级。 如果出现负面评价,请强调原因。

最新更新