例外' BadMethodCallException'使用消息'方法handleQueuedMessage不存在。'

时间:2017-07-27 20:26:51

标签: php laravel redis

我在本地环境中使用redis作为Laravel 4.3的电子邮件队列。我最近升级到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

提前致谢!

1 个答案:

答案 0 :(得分:0)

这是与以下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

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