月曜日, 4月 28, 2008

[PostgreSQL] PgQ続き(PerlでConsumer)

キューに入ったジョブを処理するプログラムを作りたいのだが、Pythonのフレームワークが提供されているのみでなかなか(Python以外で)書くことが難しい。何をどう呼んだら登録されるのか分からないし。。。
なので、大枠を例のままPythonを使って動かし、肝心の処理関数(通常はProcess_batch())だけをPerlで記述するためのTIPS。
#!/usr/bin/perl

use Data::Dumper;
use Sys::Syslog;

use Inline Python => <<'END_OF_PYTHON_CODE';
import sys, os, pgq, skytools
import syslog ,time

class zConsumer(pgq.Consumer):
def __init__(self, service_name, db_name):
self.procEvent = perl.procEvent;
pgq.Consumer.__init__(self, service_name, db_name, ["/tmp/var/mqueue/consumer.ini"])
def process_batch(self, src_db, batch_id, ev_list):
for ev in ev_list:
d = ev.data
self.log.debug ("event: %s | type: %s | extra1: %s" % (d, ev.type, ev.extra1))
if not self.procEvent(ev):
ev.tag_retry()
else:
ev.tag_done()

END_OF_PYTHON_CODE

my $objPgq = zConsumer->new("mqueue_consumer","src_db");

#print Dumper($objPgq);
$objPgq->start();

# イベント処理関数は、この関数を差し替えることでPerlで書けます
sub procEvent{
openlog(__FILE__, 'cons,pid', 'local4');
syslog('debug', 'this is Inline test');
closelog();

print Dumper(shift);
}

(Inline::Pythonのおかげで)上のプログラムでは各イベントを処理する部分だけ、procEvent()関数に切り出せていると思うので、これを書き換えればよい(=Perlで処理が書ける)です。
一部設定ファイルの指定は配列で渡さないとだめなのですが、Perlから渡すとなぜか上手くいかないので内部で宣言してしまっていますが、、、また調べます。

初めて使いますが、Inline::Pythonって便利ですね。これだあればアドオンモジュールをPythonで書かなくてはならない某商用アプリなんかも倒せそう。

0 件のコメント: