【问题标题】:Accessing IBM MQ messages using C#.Net WCF Rest service使用 C#.Net WCF Rest 服务访问 IBM MQ 消息
【发布时间】:2018-09-16 11:01:29
【问题描述】:

无法从 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) 通过 TCP/IP。这可能是由于通讯 失败。恢复 。 . . :返回码来自 TCP/IP(读取)调用为 3426 (X'X'00000D62'')。记录 这些值并告诉系统管理员。

请求openOptions:

MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING + MQC.MQOO_OUTPUT 响应 openOptions : MQC.MQOO_INQUIRE + MQC.MQOO_BROWSE + MQC.MQOO_FAIL_IF_QUIESCING + MQC.MQOO_INPUT_SHARED

注意:当我尝试检查 IBM MQ Explorer 时,第一个请求响应总是进入 'Current QueueDepth' 。当我第二次读取响应时,当前 QueueDepth 不会变为空白。 我们有单独的输入和输出队列 我们尝试重新启动 IBM MQ、清除消息、创建新队列和新通道,但没有任何效果。

ReadMsg 方法:

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

【问题讨论】:

    标签: c# asp.net rest wcf ibm-mq


    【解决方案1】:

    问题已解决。

    原因:发送第一个请求时,该消息的连接已经存在,并且读取操作无法读取输出,因为响应已由先前(写入)对象保存。 当我发送第二个请求时,第一个连接被断开,所以我能够读取第一个请求的响应。

    解决方案:完成我使用的写操作后 '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);
    

    根据您的经验提供评分。 如果是负面评价,请注明原因。

    【讨论】:

      猜你喜欢
      • 2013-01-02
      • 1970-01-01
      • 2019-10-16
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多