Perl 设置「;“完成”;Mojolicious/Minion::Job上的事件

Perl 设置「;“完成”;Mojolicious/Minion::Job上的事件,perl,mojolicious,Perl,Mojolicious,我正在尝试让仆从乔布斯在完成后反馈给Mojolicious web应用程序(可能是通过向API发布消息)。这里的基本思想是web应用程序将反馈给已上载/启动作业的客户端 我尝试过这样做: get '/' => sub { my $c = shift; my $id = $c->minion->enqueue('thing', [ qw/a b 1/, { foo => 'bar' } ]); my $job = $c->minion->

我正在尝试让仆从乔布斯在完成后反馈给Mojolicious web应用程序(可能是通过向API发布消息)。这里的基本思想是web应用程序将反馈给已上载/启动作业的客户端

我尝试过这样做:

get '/' => sub {
    my $c = shift;
    my $id = $c->minion->enqueue('thing', [ qw/a b 1/, { foo => 'bar' } ]);

    my $job = $c->minion->job($id);

    $job->on(finish => sub ($job) {
              my $id   = $job->id;
              my $task = $job->task;
              $job->app->log->info(qq{Job "$id" was performed with task "$task"});
         });


    $c->render(template => 'index');
};
这不起作用-我猜是因为事件只在执行作业的进程中发出,并且事件不会被序列化和排队

如果我这样做:

app->minion->add_task
    (thing => sub ($job, $c, $sub, @args) {
     $job->on(finish => sub ($job) {
              my $id   = $job->id;
              my $task = $job->task;
              $job->app->log->info(qq{Job "$id" was performed with task "$task"});
          });
          sleep 2;
     });
它工作正常,但这意味着我必须将事件处理添加到每个任务中,这会增加代码的复杂性

有没有办法避免这样做

我在想:

  • 能够为作业设置默认类(以便作业都是Mojo::Job的子类-例如
    Minion::Job::WithFeedback
  • 更好的是,能够将角色注入到任务创建中(这样你就可以做
    $c->minion->enqueue('thing',[qw/ab1/,{foo=>'bar'}],{roles=>qw/+WithFeedback+WithTimeout/);
  • 我知道我可以定期轮询所有作业并查看更改的状态-这就是
    Minion::Admin
    插件所做的-但我想看看是否有其他方式不需要轮询数据库

    这是可能的吗?当我们这样做的时候,这本身就是一个坏主意吗