7

vcl フォーム クライアントを備えた datasnap サーバーがあります。クライアントから、サーバーがシャットダウンされ、既存のクライアント接続で再起動された場合、どのように処理できますか? このシナリオでは、10053 EIdSocketError 例外が発生します。

複製するには、サーバーとクライアントの両方を起動し、サーバーを呼び出します (DataSnap プロキシ ジェネレーターを介して公開されたメソッドを使用します)。次に、サーバーをシャットダウンし (アプリケーションを閉じるなど)、再起動します。次に、サーバーへの呼び出しを再度試みます。

例: クライアント呼び出し

    sm := TsvrPolicySearchClient.Create(datClientDB.SQLConnection1.DBXConnection);
    try
      ds := sm.SearchPolicyByPolicy(40, WCRef, '', 3);
      dspPolicyGroup.DataSet := ds;

      if cdsPolicyGroup.Active then
        cdsPolicyGroup.Refresh
      else
        cdsPolicyGroup.Open;

    finally
      sm.Free;
    end;

dspPolicyGroup は TDataSetProvider であり、cdsPolicyGroup は TClientDataSet です (TDataSet の結果を「保存」するためにローカルで使用しているだけです)。

サーバ

function TsvrPolicySearch.SearchPolicyByPolicy(AClientId: Integer; WCRefNum, ClientRef: string; SearchMethod: Integer): TDataSet;
begin
  spPolicyByWCRef.Close;
  spPolicyByWCRef.ParamByName('p_client').AsInteger := AClientId;
  spPolicyByWCRef.ParamByName('p_search_method').AsInteger := SearchMethod;
  spPolicyByWCRef.ParamByName('p_wc_refno').AsString := WCRefNum;
  spPolicyByWCRef.Open;
  Result := spPolicyByWCRef;
end;

これは、複製が非常に簡単であることを知っている人々が定期的に遭遇していると思います。EIdSocketError (および同等のもの) をチェックして処理するために、各呼び出しの前に "Test Connection" 呼び出しまたは何か (メソッド TestConnection など) を最初に配置する必要がありますか? それとも、おそらく設計上の欠陥ですか?

ありがとう

4

2 に答える 2

2

私のシナリオ:

  • クライアント アプリケーションは DataSnap サーバーに接続します (TCP/IP、リモート サーバー)
  • クライアントが DataSet を要求します (DataSnap サーバー メソッドを使用)。TClientDataSet
  • クライアントがダウンロードしたデータセット
  • サーバーのシャットダウン (タスクキル、アプリケーションの終了は関係ありません)
  • クライアントが再度 DataSet を要求しました (ehhrrr ソケット エラー)

解決:

  • クライアントで例外をキャッチします (AppEvents.OnException)
  • DataSnap サーバーへの接続から Socket エラーであることを認識する
  • 接続が失われたという情報を含むダイアログ ウィンドウを表示します。ユーザーは「再試行」をクリックできます - その場合、
    • DataSnap クライアント モジュールを解放して再作成し、接続を初期化します
    • アプリケーションが例外をキャッチするプロセス全体が最初から機能する場合は、データセット (接続テスト用の特別なデータセット) を要求してみてください。

この操作の後、クライアントは DataSnap サーバーに再接続し、新しい TCP/IP 接続を使用してデータセットを要求できます。もちろん、ユーザーはダイアログを閉じることができますが、アプリケーションはオフになります。

これはあなたを助けることができると思います。他の多くのソリューションを試しましたが、これが最良であることがわかりました。さらに、アルゴリズムは、クライアントの障害による接続の切断もサポートします。

于 2014-04-28T21:16:24.320 に答える