2012-08-13 20 views
7

Tengo un servidor con un cliente DataSnap formas VCL. Desde el cliente, ¿cómo puedo manejar si el servidor ha sido apagado y reiniciado con las conexiones de clientes existentes? Este escenario genera una excepción 10053 EIdSocketError.DataSnap y SocketError

Para replicar, corro hasta el servidor y el cliente, realizar una llamada al servidor (utilizo métodos expuestas a través del generador de DataSnap de proxy), que succeeeds. Luego apago el servidor (por ejemplo, cierro la aplicación) y lo reinicio. Luego intento hacer una llamada al servidor nuevamente.

por ejemplo: llamada del cliente

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 es un TDataSetProvider y cdsPolicyGroup es un TClientDataSet (sólo tiene que utilizar de forma local a "almacenar" mi resultado TDataSet).

SERVIDOR

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; 

yo creo que esto se encuentra regularmente por personas que ven que es bastante fácil de replicar. ¿Debo hacer una llamada "Prueba de conexión" o algo en primer lugar (como un método TestConnection) antes de cada llamada para comprobar si hay EIdSocketError (y equivalentes) y el mango? ¿O es más un defecto de diseño, tal vez?

Gracias

Respuesta

1

La solución más sencilla para este problema es cambiar el atributo TDSServerClass LifeCycle a Invocación. Esto hará que se dispone de un servidor sin estado, y el servidor creará una nueva sesión por solicitud. Pero, podrá cerrar y volver a conectar el servidor sin interrumpir la conexión de los clientes.

2

Mi escenario:

  • solicitud de conexión del cliente al servidor DataSnap (TCP/IP, servidor remoto)
  • petición del cliente un conjunto de datos (utilizando métodos de servidor DataSnap). TClientDataSet
  • Client descargada conjunto de datos
  • servidor apagado (taskkill, cerca de la aplicación ya no importa)
  • petición del cliente un conjunto de datos Againt (ehhrrr Error de socket)

Solución:

  • El cliente me la captura de excepciones (AppEvents.OnException)
  • Reconocer que es un error del zócalo de conexión al servidor DataSnap
  • que muestran la ventana de diálogo con la información que se pierde la conexión. El usuario puede hacer clic en "Reintentar" - si es así,
    • gratuito y recrear módulo cliente DataSnap e inicializar la conexión
    • intenta solicitar conjunto de datos (conjunto de datos especial para la prueba de conexión) si toda excepción capturas aplicación proceso funciona desde el principio.

Después de esta operación, mi cliente volver a conectarse al servidor DataSnap y puede solicitar conjunto de datos utilizando la nueva conexión TCP/IP. Por supuesto, el usuario puede cerrar el diálogo, pero luego la aplicación se apaga.

Creo que esto puede ayudarlo. Intenté muchas otras soluciones pero resultó ser la mejor. Además, el algoritmo también admite la pérdida de conexión con la falla del cliente.

Cuestiones relacionadas