perl - 在 Mojolicious/Minion::Job 上设置“完成”事件
问题描述
我试图让 Minion 作业在完成后反馈到 Mojolicious 网络应用程序(可能通过向 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/a b 1/, { foo => 'bar' } ], { roles => qw/+WithFeedback +WithTimeout/);
我知道我可以定期轮询所有作业并查看状态发生了什么变化——这就是Minion::Admin
插件所做的——但我想看看是否有一种不同的方式不需要轮询数据库。
这可能吗?当我们这样做的时候——这本身是一个坏主意吗?
解决方案
推荐阅读
- python - 如何在 Python 中解析来自 YAHOO.Finance.SymbolSuggest.ssCallback 的结果
- android - 我正在使用 android studio 4.0 并面临错误消息无法加载包装器属性
- react-native - 找不到变量 Connect ,堆栈 React native
- r - ggplot histogram:在每个 bin 中显示除组计数之外的总体计数
- flutter - 使用 mime 指定 http 多部分请求的内容类型
- r - 在 R 中设置非线性优化
- python - 在 django 的 setting.py 中配置已安装的应用程序
- c++ - 如何为变量参数编写 std::function?
- nlp - 来自测试数据的模型精度与混淆矩阵精度之间的差异
- ios - 推送通知权利 - 将应用程序上传到应用程序商店时出现问题