Hasta hace poco, generar informes a través de la Web desde una aplicación escrita en Lazarus era, digamos, muy creativa. Hoy nos complace anunciar el lanzamiento de componentes cliente-servidor para Lazarus en pruebas beta. Se pueden utilizar para crear y personalizar un servidor para la generación y exportación de informes remotos, mientras que su programa y navegador web pueden actuar como un cliente.
Los componentes cliente-servidor en FastReport VCL se implementaron hace mucho tiempo, pero antes no se habían adaptado para Lazarus y había funcionado solo en Rad Studio Delphi y C ++ Builder.
El artículo será útil no solo para aquellos que nunca los han usado antes, sino también para aquellos que quieren migrar su servidor FR a Linux, ya que describe honestamente todas las ventajas y desventajas. También descubrimos un problema en el propio Lázaro y encontramos la manera de resolverlo.
Y ahora pasemos al aspecto técnico del problema.
Componentes cliente-servidor para informes en Lazarus
Los componentes cliente-servidor de Lazarus están disponibles en dos sistemas operativos: Windows y Linux (solo GTK2). Se implementan en el paquete "fr6CS_lazarus.lpk", cuyas dependencias especifican el paquete de exportación y, por lo tanto, el paquete de exportación ubicado en la carpeta "Source / ExportPack" debe instalarse antes de la instalación.
Después de instalar el paquete de componentes cliente / servidor, tendrá una nueva pestaña llamada "FastReport 6.0 Cliente / Servidor", donde encontrará 4 componentes:
1. TfrxReportServer es un componente de servidor, un servidor de informes y un servidor HTTP dos en uno. Su campo más importante es ConfigFileName, donde se debe especificar la ruta al archivo xml con una configuración.
Puede especificar muchas configuraciones en este archivo, estas son solo las más importantes:
- Configuración del servidor en sí, como el puerto y el tiempo de espera;
- Configuración del motor FR, como deshabilitar la ejecución de scripts;
- Amplias configuraciones de exportación;
- Configuración de caché, como la duración del archivo de caché, la ubicación del almacenamiento de caché o puede deshabilitarlo por completo;
- Configuración del sistema de registro;
- Configuración de conexión a la base de datos.
Puede leer más sobre todas las configuraciones aquí.
2. TfrxServerConnection es un componente de cliente que contiene información para la conexión remota a TfrxReportServer, como: host, puerto, número de intentos de error, tiempo de espera, etc.
3. TfrxReportClient, un componente de cliente, análogo a TfrxReport, realiza una solicitud de informe en el servidor y lo muestra en el cliente. Utiliza este componente TfrxServerConnection para obtener información sobre el servidor. Puede recibir un informe construido desde el servidor y mostrarlo o exportarlo solo (en la máquina del cliente).
4. TfrxHTTPClient es un componente de cliente diseñado para recibir archivos arbitrarios a través del protocolo HTTP. Por ejemplo, puede solicitar informes ya exportados desde el servidor.
También proporcionamos 3 aplicaciones de demostración:
1 del servidor que va junto con informes y bases de datos;
2 del cliente: simple y "avanzado".
Como cliente "avanzado", puede realizar pruebas multiproceso de soporte de carga presionando el botón Start:
También nos gustaría recordarle que el cliente puede ser un navegador normal y la generación del sitio web para el cliente web también se puede configurar a su gusto, mientras que el servidor de demostración ya está configurado para el cliente web.
"Cuello de botella" GTK2
Lazarus es un IDE de código abierto multiplataforma. Pero este perfume lujoso, lamentablemente, también tiene una una mosca dentro. Empezaremos por el más desagradable, a saber, el servidor Linux.
GTK2 tiene una propiedad extremadamente desagradable: un solo subproceso.
Esto significa que incluso si 2 programas dibujarán cifras en su BitMap en un ciclo sin fin, GTK2 reducirá todo a 1 flujo. Por lo tanto, en total, estos 2 programas dibujarán menos cifras de las que habría dibujado un programa, porque parte del tiempo se dedicará a la sincronización.
Pero en este caso la sincronización se organiza sin nuestra participación.
Tomemos ahora, por ejemplo, la situación en la que las cifras son dibujadas por 1 programa en varios flujos (cada flujo tiene su propio mapa de bits local). En este caso, tendrá que crear un sistema de bloqueo en su código, porque recordamos acerca de los subprocesos individuales de esta biblioteca. Pero estas no deberían ser secciones críticas ordinarias, sino secciones críticas globales a nivel GTK2. Y cuando uno de los hilos entra en esta función crítica, incluso la forma básica se cuelga hasta que sale de ella.
El subproceso múltiple con imágenes solo se puede organizar encontrando un componente de dibujo similar que sea independiente de GTK2 (por ejemplo, para este ejemplo con imágenes), en nuestro caso, otro componente no es adecuado.
Por lo tanto, algunas operaciones del servidor se reducen a una secuencia.
Y debido a esta característica, en particular, es mejor no usar diálogos, porque mientras 1 cliente responda a un diálogo, la construcción de informes para otros clientes se detenrá.
Puede surgir la pregunta: "¿Por qué necesita un servidor de un solo subproceso?" y estará parcialmente en lo cierto, ya que es similar al problema del "cuello de botella" en las carreteras donde la capacidad total de la carretera es igual a la capacidad de la carretera en el lugar más estrecho.
Pero tendrá razón solo en parte. Solo 3 grandes operaciones se reducen a un solo flujo: carga de informes, creación y exportación. La recepción y la transferencia se llevan a cabo en paralelo y, gracias al sistema de almacenamiento en caché de los informes creados, en algunos casos no será necesario volver a crearlos.
Y esto, en combinación con un servidor potente, hará que este problema sea mucho menos visible. También es un problema solo para Linux (GTK2), porque este problema no existe en Windows, y con el lanzamiento de GTK3 (que ya soporta multihilo) en Lazarus desaparecerá por completo.
El resto de los problemas son muchas veces más pequeños e incluso minúsculos en comparación con este.
Lo que queda atrás
Una pequeña parte de la funcionalidad se eliminó durante la migración, a saber, el CGI y el sistema de autorización. La rapidez con la que los implementemos depende de las solicitudes reales de nuestros clientes.
Exportar a HTML para Lazarus aún está lejos de ser perfecto, el cliente web puede y debe usarse, porque es conveniente, pero los informes no se mostrarán perfectamente.
Sin embargo, puede configurar el sistema para que el cliente web reciba informes exportados no en HTML sino en PDF, por ejemplo. Después de todo, la mayoría de los navegadores modernos pueden mostrar archivos PDF perfectamente. Hemos implementado muy bien este formato de exportación, que puede comprobar usted mismo.
Corrección de un error en la cola de mensajes de Lazarus 2.0.10
También para aquellos que quieran usar nuestros nuevos componentes en Linux, vale la pena mencionar una cosa importante: encontramos un error al bloquear la cola de mensajes y no pudimos omitirlo. Pudimos contactar a los programadores en Lazarus, ellos ya han solucionado este problema y en la próxima versión de Lazarus todo funcionará de manera constante. Por ahora, en la versión 2.0.10 y posteriores, este error deberá corregirse localmente. No tomará mucho esfuerzo ni tiempo, todo lo que tiene que hacer es añadir 3 líneas a uno de los archivos de Lazarus y reconstruirlo:
1. Abra la carpeta donde se encuentra Lazarus (en Ubuntu, por ejemplo "/usr/share/lazarus/2.0.10")
2. Abra el archivo ~ / lcl / interfaces / gtk2 / gtk2msgqueue.pp en él.
3. Busque el procedimiento: procedimiento TGtkMessageQueue.Lock;
4. En este procedimiento, busque la línea: g_main_context_acquire (FMainContext);
Este código ignora el hecho de que la función g_main_context_acquire puede fallar.
Así que reemplázalo con:
repeat until g_main_context_acquire(FMainContext);
Es decir, llamamos a g_main_context_acquire en un ciclo hasta que devuelve True (completado con éxito).
Le invitamos a que pruebe nuestros nuevos componentes para Lazarus, pero nos gustaría recordarle que esta es una versión beta y mejorará según tus necesidades. En caso de cualquier error, póngase en contacto con el soporte.