Buenos días . . .
Tengo un Servidor DataSnap REST para atender solicitudes por HTTP con WebMod y atendido por un DSRESTDispacher + DSAuthenticationManager + Otros componentes básicos . . .
Recibe solicitudes desde las oficinas centrales por la Red interna y desde Móbiles y Tablets por Internet . . .
Fue creado con el asistente y lo he pulido hasta conseguir que funcione bien y sin mayores inconvenientes para un número de solicitudes HTTP bastante bajo de momento, según mi concepto (Unas 10 por minuto) . . .
El tema es que una de las API's funciona bien y sin problema si se hace una sóla solicitud, pero también tengo que enviar una Lista Diaria de Solicitudes a dicha API, las cuales se hacen desde un ciclo "While" de manera secuencial y sin descanso, tardándose en promedio 6 segundos en procesar cada una de un total de 1000 que deben enviarse . . .
Comienza trabajando bien, pero cuando entra alguna solicitud al Servidor, de otra aplicación ó de la misma, el Servidor DataSnap se bloquea y salta un error en el cliente . . . Se le dá aceptar al mensaje de Error y el proceso sigue, pero con dificultad, afectando a todas las API's, y se nota que el Servidor está pillado, hasta que se detiene por completo y hay que resetearlo.
La única solución que he encontrado para ésto, es ejecutar el Servidor como segunda opción y arrancarlo con un número de Puerto diferente, dejando dos ejecuciones del Servidor, la segunda que trabaje exclusivamente para este caso en particular.
El error que he conseguido ver es: HTTP/1.1 500 Internal Server Error
El código en el cliente es:
Código Delphi
[-]
Procedure TForm.acSendExecute(Sender: TObject);
Var i: Integer;
Begin
i := 1;
While i <= 1000 do
Try
Try
FHTTP := TIdHTTP.Create(Self);
FHTTP.Request.ContentType := 'text/xml; charset=utf-8';
FHTTP.Request.ContentEncoding := 'utf-8';
FHTTP.HTTPOptions := [hoForceEncodeParams];
FHTTP.Request.CharSet := 'utf-8';
FHTTP.Request.Authentication := TIdBasicAuthentication.Create;
FHTTP.Request.Authentication.Username := 'BLAISE';
FHTTP.Request.Authentication.Password := 'PASCAL';
FHTTP.Get('http://localhost:8080/datasnap/rest/TServerMethods1/fWGenerate/"' + Trim(Data[i]) + '"');
Except
On E: EIdHTTPProtocolException do
Begin
Application.MessageBox(PChar('Error --> ' + Trim(Data[i]) + ' - ' + E.Message), 'Attention', MB_ICONERROR);
Dec(i);
End; End; Finally
TIdBasicAuthentication.Free;
FHTTP.Free;
Inc(i);
End; End;
Estoy usando Delphi XE7, tiene acceso a la BBDD en Oracle 11g usando el componente DOA (Direct Oracle Access).
Gracias.