【问题标题】:Laravel queue listener from external service来自外部服务的 Laravel 队列监听器
【发布时间】:2016-12-29 01:00:39
【问题描述】:

我有一个用 Laravel 编写的遗留 API,我正在尝试从 RabbitMQ 队列向它发布数据。我正在使用第三方库将 RabbitMQ 集成到本地 Laravel 队列架构中。效果很好,并且在侦听器控制台命令运行时正确处理消息。

但是,当我传递以下事件时,包括队列处理程序所需的作业和数据键...

{"job":"SixtyFiveContrib\\Jobs\\CreateSubmissionMetaDataJob@handle","data":{"title":"","story":"Testing 123","author":"Ewan Valentine","email":"","address":"","dob":"","phone":"","site":"The Lad Bible","legal":"The LAD bible - Facebook","agreed":false,"signature":"","files":[{"filename":"test.png","filesize":0,"filetype":""}],"agreement":{"id":"","facebook_id":""},"attempts":1036}}

我注意到处理排队事件的类,拆分类路径和方法名称(SixtyFiveContrib\Jobs\CreateSubmissionMetaDataJob 和句柄),并尝试从容器中调用该类。

但是,作业不会自动成为容器的一部分。当我尝试自己将作业添加到容器中时,我遇到了无法将队列中的“数据”动态传递到作业中的情况,例如...

$this->app->bind(\SixtyFiveContrib\Jobs\CreateSubmissionMetaDataJob::class, function() {
    return \SixtyFiveContrib\Jobs\CreateSubmissionMetaDataJob(????);
});

如果我从容器中省略此条目,队列处理程序将无法再解析作业,我会收到以下 错误...

[Illuminate\Contracts\Container\BindingResolutionException]
无法解析的依赖解析 [Parameter #0 [ $data ]] 在类 SixtyFiveContrib\Jobs\CreateSubmissionMetaDataJob

这是我的工作类(省略了敏感的业务逻辑)。

<?php

namespace SixtyFiveContrib\Jobs;

use App;

use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Bus\SelfHandling;
use Illuminate\Contracts\Queue\ShouldQueue;

use SixtyFiveContrib\Jobs\Job;

/**
 * CreateSubmissionsMetaDataJob
 *
 * @author    Ewan Valentine <ewan@theladbible.com>
 * @copyright The LAD bible Group - 2016
 */
class CreateSubmissionMetaDataJob extends Job implements SelfHandling 
{
    use InteractsWithQueue, SerializesModels;

    /**
     * @var array $data
     */
    public $data;

    /**
     * __construct
     *
     * @param array $this->data
     */
    public function __construct($data)
    {
        $this->data = $data;
    }

    public function handle() 
    {
        try {

            // Omitted 
        } catch (\Exception $e) {
            \Log::error($e->getMessage() . " " . $e->getLine());
            return $e->getMessage(); 
        }
    }
}

【问题讨论】:

    标签: php laravel laravel-5 rabbitmq


    【解决方案1】:

    好的,我想通了!您必须将数据作为第二个参数传递给您的 handlefire 方法,第一个参数是应用程序实例。

    <?php
    
    namespace SixtyFiveContrib\Jobs;
    
    use App;
    
    use Illuminate\Queue\SerializesModels;
    use Illuminate\Queue\InteractsWithQueue;
    use Illuminate\Contracts\Bus\SelfHandling;
    use Illuminate\Contracts\Queue\ShouldQueue;
    
    use SixtyFiveContrib\Jobs\Job;
    
    /**
     * CreateSubmissionsMetaDataJob
     *
     * @author    Ewan Valentine <ewan@theladbible.com>
     * @copyright The LAD bible Group - 2016
     */
    class CreateSubmissionMetaDataJob extends Job implements SelfHandling 
    {
        use InteractsWithQueue, SerializesModels;
    
        /**
         * @var array $data
         */
        public $data;
    
        /**
         * __construct
         */
        public function __construct()
        {
        }
    
        public function handle($app, array $data) 
        {
            try {
    
                // Omitted 
            } catch (\Exception $e) {
                \Log::error($e->getMessage() . " " . $e->getLine());
                return $e->getMessage(); 
            }
        }
    }
    

    【讨论】:

    • 对此非常感兴趣,因为我可能很快就会尝试类似的东西...您是否愿意在回购中分享其中的一些内容?
    • 嗨,我也在做这样的事情,我的 laravel 应用程序与节点应用程序共享 rabbitMQ,但我无法执行作业类,甚至无法将其加载到容器中。你能分享一下你是怎么做到的吗?
    猜你喜欢
    • 1970-01-01
    • 2019-01-19
    • 2019-07-03
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    相关资源
    最近更新 更多