2013-01-22 135 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)用戶名/密碼? –