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.