Ejemplo Perl (múltiples conexiones simultáneas)
Para crear un programa en modo remoto que pueda manejar múltiples conexiones simultáneas, cada conexión debe ser manejada independientemente para evitar bloqueos. El marco Perl AE realiza esta tarea. Por defecto, el framework Perl AE se ejecuta en un único hilo mientras gestiona cada petición. Es posible anular esta funcionalidad y hacer que el framework se ejecute utilizando la bifurcación para manejar múltiples peticiones simultáneas.
Cuando se llama a run(), la clase llama a getRequestHandlingStyle(). Por defecto hace referencia a la variable de clase, DEFAULT_REQUEST_HANDLING_STYLE. Hay dos formas de anular la ejecución de AE. En primer lugar, puede establecer la variable de clase DEFAULT_REQUEST_HANDLING_STYLE mediante setDefaultRequestHandlingStyle(), como se muestra en el siguiente ejemplo. O, la función getRequestHandlingStyle() puede sobrecargarse cuando se desee un comportamiento más intrincado. El ejemplo mostrado utiliza el método simple para forzar al framework a bifurcarse y mostrar que el manejador interno no está siendo ejecutado en el mismo proceso que el AE remoto en ejecución devolviendo los IDs del proceso actual y del proceso padre.
Este ejemplo utiliza el siguiente nombre de archivo:
ForkAe.pm
Código
package ForkAe;
use strict;
use English;
use autodie;
use nzae::Ae;
our @ISA = qw(nzae::Ae);
my $ae = ForkAe->new();
my $parentProcessId = $PID;
$ae->setDefaultRequestHandlingStyle($ae->getRequestHandlingStyleFork());
$ae->run();
sub _getFunctionResult($@)
{
my $self = shift;
return ($parentProcessId, $PID);
}
1;
virtual
Despliegue el script:
$NZ_EXPORT_DIR/ae/utilities/bin/compile_ae --language perl --version 3 \
--template deploy ForkAe.pm
Registro
Registrar tanto el AE bifurcador como el AE lanzador:
$NZ_EXPORT_DIR/ae/utilities/bin/register_ae --language perl --version 3 \
--template udtf --exe ForkAe.pm --sig "remote_fork(int4)" \
--return "table(parent_id int4, child_id int4)" --remote \
--rname forkRemote
$NZ_EXPORT_DIR/ae/utilities/bin/register_ae --language perl --version 3 \
--template udtf --exe ForkAe.pm --sig "launch_remote_fork(int4)" \
--return "table(aeresult varchar(255))" --remote --launch \
--rname forkRemote
En ejecución
Ejecute el servidor remoto AE en la base de datos del sistema:
SELECT * FROM TABLE WITH FINAL(launch_remote_fork(0));
AERESULT
-------------------------------------------------------------------------
tran: 8592 session: 16283 DATA slc: 0 hardware: 0 machine: TT4-R045 process:
32082 thread: 32082
(1 row)
Ahora ejecute la bifurcación AE:
SELECT * FROM TABLE WITH FINAL(remote_fork(0));
PARENT_ID | CHILD_ID
----------+----------
32082 | 32154
(1 row)
El framework Perl realiza la bifurcación. Si la variable DEFAULT_REQUEST_HANDLING_STYLE no estuviera anulada, los números coincidirían, ya que no se crea ningún proceso nuevo para gestionar la petición.
Ahora se puede terminar el EA utilizando el siguiente comando SQL:
SELECT aeresult FROM TABLE WITH FINAL(inza..nzaejobcontrol('stop', 0,
'forkRemote',false, NULL, NULL));
AERESULT
---------------------------------------------------------------------
vnairsim 25227 (forkRemote dataslc:-1 sess:-1 trans:-1) AE stopped
(1 row)
Aunque en estos ejemplos la ruta /nz/export está codificada, cuando se crean EAs para la liberación, esta ruta debe ser recuperada a través del comando nzenv usando la variable NZ_EXPORT_DIR.