Exemplo Perl (várias conexões simultâneas)
Para criar um programa de modo remoto que possa lidar com várias conexões simultâneas, cada conexão deve ser tratada de forma independente para evitar bloqueios. A estrutura Perl AE executa essa tarefa. Por padrão, a estrutura Perl AE é executada em um único thread enquanto processa cada solicitação. É possível substituir essa funcionalidade e fazer com que a estrutura seja executada usando bifurcação para lidar com várias solicitações simultâneas.
Quando run() é chamado na classe, a classe chama getRequestHandlingStyle(). Por padrão, ele faz referência à variável de classe, DEFAULT_REQUEST_HANDLING_STYLE. Há duas maneiras de substituir a execução do AE. Primeiro, você pode definir a variável de classe DEFAULT_REQUEST_HANDLING_STYLE usando a função setDefaultRequestHandlingStyle(), conforme mostrado no exemplo abaixo. Ou, a função getRequestHandlingStyle() pode ser sobrecarregada quando se deseja um comportamento mais complexo. O exemplo mostrado usa o método simples para forçar a estrutura a bifurcar e mostrar que o manipulador interno não está sendo executado no mesmo processo que o AE remoto em execução, retornando as IDs do processo atual e do processo pai.
Este exemplo usa o seguinte nome de arquivo:
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;
Implementação
Implemente o script:
$NZ_EXPORT_DIR/ae/utilities/bin/compile_ae --language perl --version 3 \
--template deploy ForkAe.pm
Registro
Registre o AE de bifurcação e o AE de lançamento:
$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
Executando
Execute o servidor AE remoto no banco de dados do 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)
Agora, execute o AE de bifurcação:
SELECT * FROM TABLE WITH FINAL(remote_fork(0));
PARENT_ID | CHILD_ID
----------+----------
32082 | 32154
(1 row)
A estrutura Perl está realizando a bifurcação. Se a variável DEFAULT_REQUEST_HANDLING_STYLE não fosse substituída, os números seriam iguais, pois nenhum novo processo é criado para tratar a solicitação.
O AE agora pode ser encerrado usando o seguinte 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)
Embora nesses exemplos o caminho /nz/export esteja codificado, ao criar AEs para liberação, esse caminho deve ser recuperado por meio do comando nzenv usando a variável NZ_EXPORT_DIR.