Perl (mehrere gleichzeitige Verbindungen)
Um ein Fernsteuerungsprogramm zu erstellen, das mehrere gleichzeitige Verbindungen verarbeiten kann, muss jede Verbindung unabhängig behandelt werden, um Blockierungen zu vermeiden. Das Perl AE Framework übernimmt diese Aufgabe. Standardmäßig läuft das Perl AE-Framework bei der Bearbeitung jeder Anfrage im Single-Thread-Verfahren. Es ist möglich, diese Funktionalität außer Kraft zu setzen und das Framework mit Forking laufen zu lassen, um mehrere gleichzeitige Anfragen zu bearbeiten.
Wenn run() für die Klasse aufgerufen wird, ruft die Klasse getRequestHandlingStyle() auf. Standardmäßig verweist sie auf die Klassenvariable DEFAULT_REQUEST_HANDLING_STYLE. Es gibt zwei Möglichkeiten, die Ausführung von AE aufzuheben. Zunächst können Sie die Klassenvariable DEFAULT_REQUEST_HANDLING_STYLE mit der Funktion setDefaultRequestHandlingStyle() setzen, wie im folgenden Beispiel gezeigt. Oder die Funktion getRequestHandlingStyle() kann überladen werden, wenn ein komplizierteres Verhalten gewünscht ist. Im gezeigten Beispiel wird die einfache Methode verwendet, um das Framework zum Fork zu zwingen und zu zeigen, dass der interne Handler nicht im selben Prozess wie die laufende entfernte AE ausgeführt wird, indem die IDs des aktuellen und des übergeordneten Prozesses zurückgegeben werden.
In diesem Beispiel wird der folgende Dateiname verwendet:
ForkAe.pm
Code erstellen
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;
Bereitstellung
Setzen Sie das Skript ein:
$NZ_EXPORT_DIR/ae/utilities/bin/compile_ae --language perl --version 3 \
--template deploy ForkAe.pm
Registrierung
Registrieren Sie sowohl die forking AE als auch die launcher AE:
$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
Aktiv
Führen Sie den entfernten AE-Server auf der Systemdatenbank aus:
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)
Führen Sie nun die Forking AE aus:
SELECT * FROM TABLE WITH FINAL(remote_fork(0));
PARENT_ID | CHILD_ID
----------+----------
32082 | 32154
(1 row)
Das Perl führt das Forking durch. Wenn die Variable DEFAULT_REQUEST_HANDLING_STYLE nicht überschrieben würde, würden die Zahlen übereinstimmen, da kein neuer Prozess zur Bearbeitung der Anfrage erstellt wird.
Die AE kann nun mit dem folgenden SQL-Befehl beendet werden:
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)
Obwohl in diesen Beispielen der Pfad /nz/export fest kodiert ist, sollte dieser Pfad bei der Erstellung von AEs für die Freigabe durch den Befehl nzenv unter Verwendung der Variablen NZ_EXPORT_DIR abgerufen werden.