2013-01-22 116 views
4

我正在Delphi中编写一个应用程序来连接远程MQ服务器并获取消息。
我在我的计算机上安装了一个MQ服务器,并编写了一个测试应用程序。
全部连接,打开,放置,获取,..一切正常。
然后我尝试通过更改地址连接到远程MQ,它的工作原理但不正确,它仍然与本地MQ一起工作,并从本地获取信息。没有切换到其他远程服务器!!!!
我的来源如下,我该怎么办?谢谢德尔福WebSphere 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])); 

回答

3

代码片段不显示uses语句。根据the MA7Q docs,

SupportPac包含两个名为'MQI.PAS'和'MQIC.PAS'的文件。 这些是Pascal源文件,应该放在Delphi的Path中的某个位置,以包含在您的Pascal程序中。到 的方式包括它就像使用Pascal中的任何单元:

使用MQI;

使用MQIC;

MQI是绑定模式(共享内存)连接和MQIC是在网络堆栈的客户机连接。

可以使两者都可用并让应用程序确定在运行时使用哪一个。按照WMQ Infocenter

如果您链接到MQM库中,然后使用默认绑定类型标准服务器 连接首先尝试。如果 底层服务器库加载失败,则客户端连接尝试改为 。

这向我建议你在路径中有两个库,并且连接首先找到本地QMgr并忽略客户端连接参数,或者也许您在需要MQIC库的位置使用MQI库。确保MQIC库位于路径中并更改您的uses语句。

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

3

通过测试与其他应用程序验证连接。当我在做MQ的时候,我总是从他们的一个C例子开始get/put。得到这个工作,然后担心我的程序是否工作。您的问题可能与连接字符串,身份验证,防火墙等有关,因此,除非验证连通性,否则您的代码无关紧要。

更新:如果您从股票MQ示例应用程序中收到错误,请提供示例应用程序的名称以及错误代码!

+0

好点。查看编译测试的'C:\ Program Files文件(x86)\ IBM \ WebSphere MQ 7.5 \ tools \ c \ Samples'(Windows上WMQ v7.5的默认位置,但在任何特定安装或不同版本上可能会有所不同)像'amqsputc','amqsgetc'和'amqsbcgc'这样的程序。 –

+0

谢谢。我通过测试应用程序“amqscnxc”开始连接到远程服务器。我运行了amqscnxc -x 192.168.1.3“,但得到错误2035.它与安全有关!我如何设置远程(Windows)用户名/密码? –