【问题标题】:Fire off event after job-chain has "finished"工作链“完成”后触发事件
【发布时间】:2019-10-03 18:47:56
【问题描述】:

我在下面有一个名为ProcessDocumentFields 的监听器。我的监听器类实现了ShouldQueue

在此,我使用withChain 方法解雇了两个工作,如下所示:

ParseFieldContent::withChain([
        new ParseFieldRules($event->document, $fields),
])->dispatch($event->document, $fields);

现在,我想有条件地触发一个事件,最终触发另一个工作。

问题是,两个作业(ParseFieldContentParseFieldRules)必须已完成运行。

#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);
        }
}

正如您在上面看到的,我运行两个相同的作业(ParseFieldContentParseFieldRules) - 但前提是某个断言为真。

我的问题是:我怎样才能确保放在ProcessDocumentFields 中的作业首先运行,然后当触发 `` 事件时,ProcessDocumentRouteFields 中的作业将运行?

【问题讨论】:

    标签: php laravel laravel-5.8


    【解决方案1】:

    首先,您可以通过缓存或 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('processing_job', true, now()->addMinutes(20));
    

    您可以在全部完成后删除键/值对(放置在作业脚本的末尾):

    Cache::forget('processing_job');
    

    在此之后,下次执行缓存检查时,缓存助手将返回 false 并处理其他作业。

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-24
      • 2011-01-01
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 2020-06-09
      相关资源
      最近更新 更多