4

我正在用 Delphi 编写一个应用程序来连接到远程 MQ 服务器并获取消息。
我在我的计算机上安装了一个 MQ 服务器并编写了一个测试应用程序。
一切都很好连接,打开,放置,获取,..一切都很好。
然后我尝试通过更改地址连接到远程 MQ,它工作但不正确,它仍然与本地 MQ 一起工作并从本地获取信息。没有切换到其他远程服务器!!!!
我的来源如下,我该怎么办?谢谢

var
  QMgrName    : MQCHAR48;
  ConnectOpts : TMQCNO;
  ClientConn  : TMQCD;
  Compcode    : MQLONG;
  Reason      : MQLONG;
begin
  StrPCopy(QMgrName, AQueueManager+#0);
  ConnectOpts.StrucId := MQCNO_STRUC_ID;
  ConnectOpts.Version := MQCNO_VERSION_1;
  ConnectOpts.Options := MQCNO_STANDARD_BINDING;
  ConnectOpts.ClientConnOffset := 0;
  ConnectOpts.ClientConnPtr := @ClientConn;

  with ClientConn do begin
    StrPCopy(ClientConn.ConnectionName, format('%s(%s)'#0, [AIP,APort]));
    Version := MQCD_VERSION_6;
    ChannelType := MQCHT_CLNTCONN;
    TransportType := MQXPT_TCP;
    Desc := '';
    QMgrName := '';
    XmitQName := '';
    ShortConnectionName := '';
    MCAName := '';
    ModeName := '';
    TpName := '';
    BatchSize := 50;
    DiscInterval := 6000;
    ShortRetryCount := 10;
    ShortRetryInterval := 60;
    LongRetryCount := 999999999;
    LongRetryInterval := 1200;
    SecurityExit := '';
    MsgExit := '';
    SendExit := '';
    ReceiveExit := '';
    SeqNumberWrap := 999999999;
    MaxMsgLength := 4194304;
    PutAuthority := MQPA_DEFAULT;
    DataConversion := MQCDC_NO_SENDER_CONVERSION;
    SecurityUserData := '';
    MsgUserData := '';
    SendUserData := '';
    ReceiveUserData := '';
    UserIdentifier := '';
    Password := '';
    MCAUserIdentifier := '';
    MCAType := MQMCAT_PROCESS;
    ConnectionName := '';
    RemoteUserIdentifier := '';
    RemotePassword := '';
    MsgRetryExit := '';
    MsgRetryUserData := '';
    MsgRetryCount := 10;
    MsgRetryInterval := 1000;
    HeartbeatInterval := 1;
    BatchInterval := 0;
    NonPersistentMsgSpeed := MQNPMS_FAST;
    StrucLength := MQCD_LENGTH_6;
    ExitNameLength := MQ_EXIT_NAME_LENGTH;
    ExitDataLength := MQ_EXIT_DATA_LENGTH;
    MsgExitsDefined := 0;
    SendExitsDefined := 0;
    ReceiveExitsDefined := 0;
    MsgExitPtr := nil;
    MsgUserDataPtr := nil;
    SendExitPtr := nil;
    SendUserDataPtr := nil;
    ReceiveExitPtr := nil;
    ReceiveUserDataPtr := nil;
    ClusterPtr := nil;
    ClustersDefined := 0;
    NetworkPriority := 0;
    LongMCAUserIdLength := 0;
    LongRemoteUserIdLength := 0;
    LongMCAUserIdPtr := nil;
    LongRemoteUserIdPtr := nil;
//    MCASecurityId := MQSID_NONE_ARRAY;
//    RemoteSecurityId := MQSID_NONE_ARRAY;
  end;
  MQCONNX(@QMgrName, ConnectOpts, HConn,Compcode,Reason);
  if CompCode <> MQCC_OK then
    raise Exception.Create(format('MQCONNX Fail, Completion Code: %d, Reason: %d',[CompCode,Reason]));
4

2 回答 2

3

代码片段不显示该uses语句。根据MA​​7Q 文档

SupportPac 包含两个名为“MQI.PAS”和“MQIC.PAS”的文件。这些是 Pascal 源,应该放置在 Delphi 的搜索路径中的某个位置,以包含在您的 Pascal 程序中。包含它的方法就像使用 Pascal 中的任何单位:

使用 MQI;

使用 MQIC;

MQI是绑定模式(共享内存)连接,而是MQIC网络堆栈上的客户端连接。

有可能两者都可用,并让应用程序确定在运行时使用哪个。根据WMQ 信息中心

如果您要链接到 mqm 库,则首先尝试使用默认绑定类型的标准服务器连接。如果底层服务器库加载失败,则会尝试客户端连接。

这向我表明您在路径中有两个库,并且连接首先查找本地 QMgr 并忽略客户端连接参数,或者您可能正在使用您想要 MQIC 库的 MQI 库。确保 MQIC 库位于路径中并更改您的uses语句。

如果切换库不能单独解决问题,请考虑指定 MQCNO_CLIENT_BINDING而不是MQCNO_STANDARD_BINDING.

于 2013-01-22T14:31:25.663 回答
3

通过使用其他一些应用程序进行测试来验证连接。当我在做 MQ 时,我总是从他们的一个 C 示例开始,用于获取/放置。让它工作,然后担心我的程序是否工作。您的问题很可能与连接字符串、身份验证、防火墙等有关,因此在您验证连接之前,您的代码是无关紧要的。

更新:如果您从库存 MQ 示例应用程序中收到错误,请在谷歌上搜索示例应用程序的名称以及错误代码!

于 2013-01-22T14:33:23.500 回答