4

リモート MQ サーバーに接続してメッセージを取得するアプリケーションを Delphi で作成しています。
コンプに 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

他のアプリでテストして接続を確認します。MQを実行していたときは、常にget/putのCの例の1つから始めていました。それを機能させて、それから私のプログラムが機能するかどうかについて心配してください。問題は接続文字列、認証、ファイアウォールなどに関係している可能性が高いため、接続を確認するまで、コードは無関係です。

更新:ストックMQサンプルアプリからエラーが発生した場合は、サンプルアプリの名前とエラーコードをグーグルで検索してください。

于 2013-01-22T14:33:23.500 に答える
3

usesコード スニペットにはステートメントが表示されません。MA7Qのドキュメントによると、

SupportPac には、「MQI.PAS」と「MQIC.PAS」という 2 つのファイルが含まれています。これらは、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 に答える