我在下面的监听器中称为ProcessDocumentFields
。我的侦听器类实现了ShouldQueue
。
在此,我通过使用withChain
方法解雇两个作业:
ParseFieldContent::withChain([
new ParseFieldRules($event->document, $fields),
])->dispatch($event->document, $fields);
现在,我想有条件地触发一个事件,该事件最终会触发另一个工作。
事实是,两个作业(ParseFieldContent
和ParseFieldRules
)都必须完成运行。
#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
作业是否已完成。
然后,在ProcessDocumentRouteFields
中,检查作业是否仍在运行或已完成。缓存方法类似于:
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::forget('processing_job');
此后,下次执行缓存检查时,缓存助手将返回false并处理其他作业。
我希望这会有所帮助。