【问题标题】:vb.net connecting to MQ servervb.net 连接到 MQ 服务器
【发布时间】:2016-06-17 07:27:44
【问题描述】:

我将应用程序从 vb6 迁移到 vb.net,一切正常,除了从 MQ 服务器获取消息,当调用 MQGet 时,我收到 2033 错误(无消息)
还附上了从工作 vb6 和不工作 vb.net 发送到 MQ 的捕获消息,请帮助?enter image description here

    '***********************************
    'Send(MQPUT) to MQSeries and CICS
    '***********************************
    PutMsgOpts = MQPMO_DEFAULT

    MsgDesc = MQMD_DEFAULT
    MsgDesc.Persistence = MQPER_PERSISTENT
    MsgDesc.MsgId = MQMI_NONE.Value
    MsgDesc.CorrelId = "AMQ!NEW_SESSION_CORRELID" 'if using MQBridge
    MsgDesc.ReplyToQ = gReplyToQ
    MsgDesc.ReplyToQMgr = gMQRplyMgrName
    MsgDesc.Format_Renamed = MQFMT_STRING

    'sPutMsg is composed of 8 byte program name(host/cics)
    ' plus data desired to pass as string only (dfcommarea)
    '************  MAX LENGTH IS 32776  *******************
    sPutMsg = gCICSPrgName & gsHost_Msg
    If Len(sPutMsg) <> 32768 Then
        sPutMsg = sPutMsg & Space(32768 - Len(sPutMsg))
    End If

    sMsgIdGet.Value = MsgDesc.MsgId

    '*******************************************
    'MQClose the queue for request sent to host
    '*******************************************
    'HOST-BYPASS
    MQCLOSE(Hconn, Hobj, MQCO_NONE, cC, Reason)
    'HOST-BYPASS

    '**********************************************************
    'MQOpen the queue for receiving the request from the host
    '**********************************************************

    'set up the queue name
    ObjDesc = MQOD_DEFAULT
    ObjDesc.ObjectName = gReplyToQ

    'Open
    'HOST-BYPASS
    MQOPEN(Hconn, ObjDesc, MQOO_INPUT_AS_Q_DEF Or MQOO_FAIL_IF_QUIESCING, Hobj, cC, Reason)
    'HOST-BYPASS
    'Hconn is set by MQseries in the Connect

    '**************************************
    'Receive (MQGET) from MQSeries and CICS
    '**************************************
    GetMsgOpts = MQGMO_DEFAULT
    GetMsgOpts.Options = MQGMO_WAIT Or MQGMO_CONVERT
    GetMsgOpts.WaitInterval = 10000 '20 seconds

    MsgDesc = MQMD_DEFAULT
    MsgDesc.Format_Renamed = MQFMT_STRING
    MsgDesc.Persistence = MQPER_PERSISTENT
    MsgDesc.CorrelId = sMsgIdGet.Value 'set correlId with MQGET msgid returned
    MsgDesc.MsgId = MQMI_NONE.Value
    MsgDesc.ReplyToQ = gReplyToQ
    MsgDesc.ReplyToQMgr = gMQRplyMgrName

    '** sGetMsg is composed of 8 byte program name(host/cics)
    '** plus data desired to pass as string only (dfcommarea)

    '************  MAX LENGTH IS 32776  *******************
    sGetMsg = New String(" ", 32768)

    'Command to receive from to MQSeries and CICS
    retryCount = 0
    cC = MQCC_OK + 1
    Reason = 2033
    Do While cC <> MQCC_OK And Reason = 2033
        MQGET(Hconn, Hobj, MsgDesc, GetMsgOpts, Len(sGetMsg), sGetMsg, readlen, cC, Reason)
        retryCount = retryCount + 1
        If retryCount > 1 Then Exit Do
    Loop 
    '************************
    'MQClose queue for input
    '************************
    MQCLOSE(Hconn, Hobj, MQCO_NONE, cC, Reason)

【问题讨论】:

  • 它的工作原理是: Dim MyNewCorrelID As String = "AMQ!NEW_SESSION_CORRELID" mqMsg.CorrelationId = Encoding.ASCII.GetBytes(MyNewCorrelID) 当我放置消息并使用 mqMsg.CorrelationId = mqMsg.MessageId当我收到消息时。但我有另一个问题,我无法将消息作为字符串读取。 1-System.Console.WriteLine(mqMsg.ReadString(mqMsg.MessageLength)) 2-message_string = mqMsg.ReadString(mqMsg.MessageLength) 第一行在控制台行写我想要的消息,第二行给我“无法阅读超出流的末尾”,有什么帮助吗?

标签: vb.net ibm-mq mq


【解决方案1】:

如果你得到 2033,那么你知道队列在那里,但你试图检索的消息不在那里。使用 MQ Explorer 或普通 MQ 示例以及 runmqsc 来检查该队列上是否有任何消息,如果有,它们的关联 ID 是否与您的程序提供的匹配。

如果那里没有消息,请检查您的消息是否确实已被您发送到的 CICS 程序接收,以及该程序是否响应。

2033 问题可能是您的编码问题,但更可能是配置和设置中的某些问题随着您的转换而改变。您可能有不同配置的队列管理器、不同配置的通道等。检查整个链。

【讨论】:

  • 谢谢 ValerieLampkin,请我是 MQ 新手,对它甚至对 vb.net 了解不多,请您查看来自工作 VB6 和 VB.net 的消息之间的附件,你可能知道我在 vb.net 中传递了错误的属性。
  • 我看不出消息之间有任何区别,当然我没有按照屏幕截图上的每一点进行操作 - 您可以更好地保存消息并比较文件以确保。但我要说的是,重要的不仅是您创建和发送消息的方式 - 您的整个设置都很重要。您没有对系统的其余部分发表任何意见 - 您使用的是相同的设置还是新的设置?它是同一个队列管理器吗?远程队列和通道是如何配置的?总之,按照消息流,找到出错的地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 2017-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多