Perlの例(複数同時接続)
複数の同時接続を処理できるリモート・モード・プログラムを作成するには、ブロッキングを避けるために各接続を独立して処理しなければならない。 PerlAEフレームワークがこのタスクを実行する。 デフォルトでは、PerlAEフレームワークは各リクエストを処理する間、シングルスレッドで実行されます。 この機能をオーバーライドし、複数の同時リクエストを処理するためにforkingを使ってフレームワークを実行させることも可能である。
このクラスで run() が呼び出されると、クラスはgetRequestHandlingStyle() を呼び出します。デフォルトでは、クラス変数 DEFAULT_REQUEST_HANDLING_STYLE を参照します。 AE実行をオーバーライドするには2つの方法がある。 まず、以下の例のようにsetDefaultRequestHandlingStyle() を使ってクラス変数 DEFAULT_REQUEST_HANDLING_STYLE を設定します。 また、より複雑な挙動が必要な場合は、関数getRequestHandlingStyle() をオーバーロードすることもできます。 この例では、シンプル・メソッドを使用してフレームワークを強制的にフォークさせ、現在のプロセス ID と親プロセス ID を返すことで、内部ハンドラが実行中のリモート AE と同じプロセスで実行されていないことを示します。
この例では以下のファイル名を使用している:
ForkAe.pm
コード
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;
デプロイメント
スクリプトをデプロイする:
$NZ_EXPORT_DIR/ae/utilities/bin/compile_ae --language perl --version 3 \
--template deploy ForkAe.pm
登録
フォーキングAEとランチャー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
実行中
システムデータベース上でリモート AE サーバーを実行する:
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)
次にフォークAEを実行する:
SELECT * FROM TABLE WITH FINAL(remote_fork(0));
PARENT_ID | CHILD_ID
----------+----------
32082 | 32154
(1 row)
Perlフレームワークがフォークを実行している。 DEFAULT_REQUEST_HANDLING_STYLE変数がオーバーライドされなければ、 リクエストを処理するために新しいプロセスが生成されないので、数字は一致する。
次の SQL コマンドを使用して AE を終了できる:
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)
これらの例では/nz/exportパスをハードコードしていますが、リリース用のAEを作成する場合、このパスはNZ_EXPORT_DIR変数を使用して nzenvコマンドで取得する必要があります。