如何正确的理解和设置队列的超时时间
队列的超时时间可以在监听时使用参数--timeout = x
来设置,不设置的话默认是60秒
例如:
php artisan queue:listen --queue=default --timeout=30
##我的问题:
加入超时这只为60秒
1.这个超时时间是指:两个任务之间的空闲时间超过60就终止监听,还是指监听期间每个任务的执行时间不能超过60秒
2.如果timeout设置为0,有没有什么不良后果,work模式下即使任务很小,过很久会不会导致内存溢出
3.是否我没有正确的返回什么以告诉队列监听者我的这次任务执行完毕了
##我的猜测:
如果超时前收到过消息,则会根据最后一条消息的时间从新计算60秒后超时,这么看感觉这个超时时间就是指空闲的等待时间了,这样的话设置--timeout=0
的应该是没问题的
但是,在work模式如果一条消息都没有收到过,无论过多久都不会显示超时,而收到一条消息空闲60秒后会被killed,所以感觉又是跟消费者有关系的
但是我在消费者中调用了 $this->delete();
了
##相关代码
消费者:
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class ProcessMessage implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
private $message;
public function __construct($message)
{
$this->message = $message;
}
public function handle()
{
echo '收到消息:' . $this->message . PHP_EOL;
$this->delete();
}
public function failed()
{
echo '失败了';
$this->delete();
}
}
生产者:
//可以在tinker中执行
use App\Jobs\ProcessMessage;
ProcessMessage::dispatch('这是一个' . date('H:i:s') . '发送的任务');
超时报错,上面是listen模式的,下面是work模式的
@youkr 可是我单个任务就只是echo了一句话,没有超过60秒,为什么还是报超时了