鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

Qudoを使ってリトライ成功時に、リトライ前のexception_logを消したい

enqueue.pl

use strict;
use warnings;
use Qudo;
    my $qudo = Qudo->new(
        driver_class => 'Skinny', # optional.
        databases => [+{
                   dsn      => 'dbi:SQLite:qudo.db',
                   username => '',
                   password => '',
               }],
    );
    $qudo->enqueue("Worker::Test", { arg => 'hello', run_after => 30})
;

manage.pl

use Qudo;
use Worker::Test;
    my $qudo = Qudo->new(
        driver_class => 'Skinny', # optional.
        databases => [+{
            dsn      => 'dbi:SQLite:qudo.db',
            username => '',
            password => '',
        }],
        manager_abilities => [qw/Worker::Test/],
    );
    $qudo->work(); # boot manager

Test.pm(ワーカー)

package Worker::Test;
use strict;
use warnings;
use Data::Dumper;
use base 'Qudo::Worker';
    sub max_retries {1}
    sub work {
        my ($class, $job) = @_;
        print $class; #print $user->email;
        print Dumper($job->arg); #print $user->email;
        #1回目失敗、2回目成功を疑似的に作り出している
        if( $job->retry_cnt == 1){
            $job->completed; # finished job!
        }
    }
    1;

qudoコマンドでテーブルを用意する

$ qudo --db qudo.db --user root --pass password --rdbms SQLite

キューにワーカーを突っ込む

$ perl enqueue.pl

テーブルの確認

$ sqlite3.exe qudo.db
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from job;
5|1|hello||1388028503|0|1388028533|0|0

ワーカーの実行

perl -Ilib manage.pl

再度テーブルの確認

$ sqlite3.exe qudo.db
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from job;
sqlite>

やりたいこと

上記の例では、1回目は失敗、2回目は成功($job->completed) するのですが、1回目の失敗時点でexception_logテーブルにINSERTされるけど 2回目成功したときには、exception_logテーブルの1回目の失敗履歴を消し去りたい。 できるかな??

まぁ、リトライ回数0で使っている分なら特に気を使う必要はないんだけど・・・