php - 异常 'BadMethodCallException' 消息 'Method handleQueuedMessage does not exist.'

标签 php laravel redis

我在 Laravel 4.3 的本地环境中使用 Redis 作为电子邮件队列。我最近升级到 Laravel 5.4,当我现在尝试使用 redis 队列(默认)时:

php artisan queue:listen

我得到快速连续的输出语句,如下所示:

Processing: mailer@handleQueuedMessage

每个日志文件中都有一个错误:

exception 'BadMethodCallException' with message 'Method handleQueuedMessage does not exist.' in C:\xampp\htdocs\explore\vendor\laravel\framework\src\Illuminate\Support\Traits\Macroable.php:74
Stack trace:
#0 C:\xampp\htdocs\explore\vendor\laravel\framework\src\Illuminate\Queue\Jobs\Job.php(69): Illuminate\Mail\Mailer->__call('handleQueuedMes...', Array)
#1 C:\xampp\htdocs\explore\vendor\laravel\framework\src\Illuminate\Queue\Jobs\Job.php(69): Illuminate\Mail\Mailer->handleQueuedMessage(Object(Illuminate\Queue\Jobs\RedisJob), Array)
#2 C:\xampp\htdocs\explore\vendor\laravel\framework\src\Illuminate\Queue\Worker.php(317): Illuminate\Queue\Jobs\Job->fire()
#3 C:\xampp\htdocs\explore\vendor\laravel\framework\src\Illuminate\Queue\Worker.php(267): Illuminate\Queue\Worker->process('redis', Object(Illuminate\Queue\Jobs\RedisJob), Object(Illuminate\Queue\WorkerOptions))
#4 C:\xampp\htdocs\explore\vendor\laravel\framework\src\Illuminate\Queue\Worker.php(224): Illuminate\Queue\Worker->runJob(Object(Illuminate\Queue\Jobs\RedisJob), 'redis', Object(Illuminate\Queue\WorkerOptions))
#5 C:\xampp\htdocs\explore\vendor\laravel\framework\src\Illuminate\Queue\Console\WorkCommand.php(102): Illuminate\Queue\Worker->runNextJob('redis', 'default', Object(Illuminate\Queue\WorkerOptions))
#6 C:\xampp\htdocs\explore\vendor\laravel\framework\src\Illuminate\Queue\Console\WorkCommand.php(86): Illuminate\Queue\Console\WorkCommand->runWorker('redis', 'default')
#7 [internal function]: Illuminate\Queue\Console\WorkCommand->fire()
#8 C:\xampp\htdocs\explore\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(30): call_user_func_array(Array, Array)
#9 C:\xampp\htdocs\explore\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(87): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#10 C:\xampp\htdocs\explore\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php(31): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#11 C:\xampp\htdocs\explore\vendor\laravel\framework\src\Illuminate\Container\Container.php(539): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)
#12 C:\xampp\htdocs\explore\vendor\laravel\framework\src\Illuminate\Console\Command.php(182): Illuminate\Container\Container->call(Array)
#13 C:\xampp\htdocs\explore\vendor\symfony\console\Command\Command.php(264): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#14 C:\xampp\htdocs\explore\vendor\laravel\framework\src\Illuminate\Console\Command.php(168): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#15 C:\xampp\htdocs\explore\vendor\symfony\console\Application.php(869): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#16 C:\xampp\htdocs\explore\vendor\symfony\console\Application.php(223): Symfony\Component\Console\Application->doRunCommand(Object(Illuminate\Queue\Console\WorkCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#17 C:\xampp\htdocs\explore\vendor\symfony\console\Application.php(130): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#18 C:\xampp\htdocs\explore\vendor\laravel\framework\src\Illuminate\Foundation\Console\Kernel.php(122): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#19 C:\xampp\htdocs\explore\artisan(36): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#20 {main}  

我用谷歌搜索了这个方法,没有找到。我的电子邮件队列运行正常,但我不知道为什么会出现此消息。有没有人经历过这个可以阐明这个问题?

这是我相关的 app/database.php:

<?php


    /*
    |--------------------------------------------------------------------------
    | Redis Databases
    |--------------------------------------------------------------------------
    |
    | Redis is an open source, fast, and advanced key-value store that also
    | provides a richer set of commands than a typical key-value systems
    | such as APC or Memcached. Laravel makes it easy to dig right in.
    |
    */

    'redis' => [

        'client' => 'predis',

        'default' => [
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => 0,
        ],

    ],

和我相关的 app/queue.php:

<?php

return [

    'default' => env('QUEUE_DRIVER', 'redis'),

    'connections' => [

        'redis' => [
            'driver' => 'redis',
            'connection' => 'default',
            'queue' => 'default',
            'retry_after' => 90,
        ],

    ],

    /*
    |--------------------------------------------------------------------------
    | Failed Queue Jobs
    |--------------------------------------------------------------------------
    |
    | These options configure the behavior of failed queue job logging so you
    | can control which database and table are used to store the jobs that
    | have failed. You may change them to any database / table you wish.
    |
    */

    'failed' => [
        'database' => env('DB_CONNECTION', 'mysql'),
        'table' => 'failed_jobs',
    ],

];

和相关的.env:

QUEUE_DRIVER=redis

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

提前致谢!

最佳答案

这是与以下 Laravel 框架线程相关的问题: https://github.com/laravel/framework/issues/9881 https://github.com/laravel/framework/issues/11892

具体而言,以前的电子邮件存在问题,无法正确呈现,并且 Redis 队列继续尝试,而没有收到指示在标记为失败之前尝试有限次数。

下面的命令解决了它:

php artisan queue:work --daemon --tries=1

输出:

[2017-07-28 06:48:13] Processing: mailer@handleQueuedMessage
[2017-07-28 06:48:13] Failed:     mailer@handleQueuedMessage

希望这会帮助遇到此问题的其他人。

关于php - 异常 'BadMethodCallException' 消息 'Method handleQueuedMessage does not exist.',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45360419/

相关文章:

php - 在哪里部署 symfony2 应用程序

php - 带有 GET 参数的 URL 格式?

javascript - 如何停止执行yii2页面上的所有js?

laravel - 未找到类 'SocialiteProviders\Manager\ServiceProvider'

Laravel Lumen - Eloquent 查询日志

node.js - 比较两个值的计算结果为 false 而不是 true

php - 使用 Node.js 在 PHP 应用程序中显示消息的实时通知

mysql - 将主键从 id 切换为数据透视表中的值组合

php - 你如何将 php session 数据传递给 socket.io?

php - 队列 Redis 不会在 Laravel Forge 上被触发