作业链有 "finished" 后触发事件
Fire off event after job-chain has "finished"
我下面有一个名为 ProcessDocumentFields
的监听器。我的监听器 class 实现了 ShouldQueue
.
在此,我使用如下 withChain
方法触发了两个作业:
ParseFieldContent::withChain([
new ParseFieldRules($event->document, $fields),
])->dispatch($event->document, $fields);
现在,我想有条件地触发一个事件,最终触发另一个作业。
事实是,两个作业(ParseFieldContent
和 ParseFieldRules
)必须已完成 运行ning。
#If below is true, fire off
if ($event->document->stream->settings()->get('field_routing')) {
event(new DocumentDefaultRulesWasProcessed($event->documents));
}
以上事件将触发相同的两个作业,但我必须先做一些其他检查:
#EventServiceProvider.php
DocumentDefaultRulesWasProcessed::class => [
ProcessDocumentRouteFields::class,
],
在我的 ProcessDocumentRouteFields
里面,我有:
foreach ($event->routes as $route) {
if ($this->assertIfRouteFieldsShouldBeHandled($route, $event->document)) {
ParseFieldContent::withChain([
new ParseFieldRules($event->document, $route->fields, false),
])->dispatch($event->document, $route->fields);
}
}
正如你在上面看到的,我 运行 两个相同的工作(ParseFieldContent
和 ParseFieldRules
)——但前提是某个断言是真的。
我的问题是:我如何确保首先放置在 ProcessDocumentFields
运行 中的工作,然后当触发 `` 事件时,ProcessDocumentRouteFields
中的工作会 运行 吗?
首先想到的是,您可以通过缓存或 DB 设置某种指示器,用于检查 ProcessDocumentFields
作业是否为 processing/running。
然后,在您的 ProcessDocumentRouteFields
中,您检查作业是否仍然 processing/running。
缓存方法类似于:
if (cache('processing_job')) {
return;
}
foreach ($event->routes as $route) {
if ($this->assertIfRouteFieldsShouldBeHandled($route, $event->document)) {
ParseFieldContent::withChain([
new ParseFieldRules($event->document, $route->fields, false),
])->dispatch($event->document, $route->fields);
}
}
请注意缓存时,必须设置足够的时间来执行作业。
cache('processing_job', true, now()->addMinutes(20));
然后您可以在完成所有操作后删除 key/value 对(放置在作业脚本的末尾):
Cache::forget('processing_job');
此后,下次执行缓存检查时,缓存助手将return false 并处理其他作业。
希望对您有所帮助。
我下面有一个名为 ProcessDocumentFields
的监听器。我的监听器 class 实现了 ShouldQueue
.
在此,我使用如下 withChain
方法触发了两个作业:
ParseFieldContent::withChain([
new ParseFieldRules($event->document, $fields),
])->dispatch($event->document, $fields);
现在,我想有条件地触发一个事件,最终触发另一个作业。
事实是,两个作业(ParseFieldContent
和 ParseFieldRules
)必须已完成 运行ning。
#If below is true, fire off
if ($event->document->stream->settings()->get('field_routing')) {
event(new DocumentDefaultRulesWasProcessed($event->documents));
}
以上事件将触发相同的两个作业,但我必须先做一些其他检查:
#EventServiceProvider.php
DocumentDefaultRulesWasProcessed::class => [
ProcessDocumentRouteFields::class,
],
在我的 ProcessDocumentRouteFields
里面,我有:
foreach ($event->routes as $route) {
if ($this->assertIfRouteFieldsShouldBeHandled($route, $event->document)) {
ParseFieldContent::withChain([
new ParseFieldRules($event->document, $route->fields, false),
])->dispatch($event->document, $route->fields);
}
}
正如你在上面看到的,我 运行 两个相同的工作(ParseFieldContent
和 ParseFieldRules
)——但前提是某个断言是真的。
我的问题是:我如何确保首先放置在 ProcessDocumentFields
运行 中的工作,然后当触发 `` 事件时,ProcessDocumentRouteFields
中的工作会 运行 吗?
首先想到的是,您可以通过缓存或 DB 设置某种指示器,用于检查 ProcessDocumentFields
作业是否为 processing/running。
然后,在您的 ProcessDocumentRouteFields
中,您检查作业是否仍然 processing/running。
缓存方法类似于:
if (cache('processing_job')) {
return;
}
foreach ($event->routes as $route) {
if ($this->assertIfRouteFieldsShouldBeHandled($route, $event->document)) {
ParseFieldContent::withChain([
new ParseFieldRules($event->document, $route->fields, false),
])->dispatch($event->document, $route->fields);
}
}
请注意缓存时,必须设置足够的时间来执行作业。
cache('processing_job', true, now()->addMinutes(20));
然后您可以在完成所有操作后删除 key/value 对(放置在作业脚本的末尾):
Cache::forget('processing_job');
此后,下次执行缓存检查时,缓存助手将return false 并处理其他作业。
希望对您有所帮助。