2012-08-13 14 views
7

Ho un server datasnap con un client vcl forms. Dal client, come posso gestire se il server è stato chiamato shutdown e riavviato con le connessioni client esistenti? Questo scenario solleva un'eccezione EIdSocketError 10053.Datasnap and SocketError

Per replicare, eseguo sia il server che il client, effettuo una chiamata al server (utilizzo i metodi esposti tramite il generatore di proxy DataSnap) che funziona correttamente. Quindi chiudo il server (ad esempio Chiudi l'applicazione) e lo riavvio. Quindi tento di effettuare nuovamente una chiamata al server.

esempio: CLIENT chiamata

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 è un TDataSetProvider e cdsPolicyGroup è un TClientDataSet (ho appena lo uso a livello locale per "immagazzinare" il mio risultato TDataSet).

SERVER

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; 

penserei questo è regolarmente incontrato da persone vedendo che è abbastanza facile da replicare. Devo mettere una chiamata "Test Connection" o qualcosa prima (come un metodo TestConnection) prima di ogni chiamata per verificare EIdSocketError (e equivalente) e gestire? O è forse più un difetto di progettazione?

Grazie

risposta

1

La soluzione più semplice per questo problema è quello di modificare l'attributo TDSServerClass LifeCycle di Invocazione. Ciò consentirà di disporre di un server stateless e il server creerà una nuova sessione per richiesta. Ma sarai in grado di chiudere e ricollegare il server senza interrompere la connessione dei client.

2

mio scenario:

  • applicazione client connettersi a DataSnap Server (TCP/IP, server remoto)
  • richiesta del cliente un DataSet (usando i metodi del server DataSnap). TClientDataSet
  • Client scaricata dataset
  • Server shutdown (taskkill, vicino applicazione senza argomenti)
  • richiesta del cliente un DataSet againt (ehhrrr Socket Error)

Soluzione:

  • On cliente I catch exception (AppEvents.OnException)
  • Riconoscere che è Errore socket dalla connessione al server DataSnap
  • I mostra finestra di dialogo con informazioni che la connessione è persa. L'utente può cliccare su "Riprova" - in caso affermativo,
    • libero e ricreare modulo client DataSnap e inizializzare il collegamento
    • una richiesta di dati (dataset speciale per test di connessione) se un'eccezione di applicazione cattura tutto il processo funziona dall'inizio.

Dopo questa operazione il mio client ri-connettersi al server DataSnap e può richiedere set di dati utilizzando la nuova connessione TCP/IP. Ovviamente l'utente può chiudere il dialogo, ma poi l'applicazione è disattivata.

Penso che questo possa aiutarti. Ho provato molte altre soluzioni, ma questo si è dimostrato il migliore. Inoltre l'algoritmo supporta anche la perdita di connessione con l'errore del cliente.