内容简介:在项目中我们使用了适合于关于 thinkphp-queue 的使用可以见这个网址我遇到的问题 就是因为一个配置 当我们在
在项目中我们使用了适合于 thinphp5
的队列 thinphp-queue
version v1.1.5
。 正常执行没有问题,但是每隔一段时间就会有很多任务重试。经过排查发现是一个配置的问题。具体可以进入本文来查看一些事项。
关于 thinkphp-queue 的使用可以见这个网址 thinkphp-queue 笔记
我遇到的问题 就是因为一个配置 当我们在 thinkphp
的 application
应用目录下创建一个 extra/queue.php
时 我们一般这样创建
return [
'connector' => 'Database', // 数据库驱动
'expire' =>60, // 任务的过期时间,默认为60秒; 若要禁用,则设置为 null
'default' => 'pic', // 默认的队列名称
'table' => 'jobs', // 存储消息的表名,不带前缀
// 'dsn' => [],
];
我天真的以为这个任务过期时间时自动删掉任务的结果不是。
结果通过 \think\queue\connector\Database::pop
这个方法的一个判断得到这样的结果
if (!is_null($this->options['expire'])) {
$this->releaseJobsThatHaveBeenReservedTooLong($queue);
}
且 \think\queue\connector\Database::releaseJobsThatHaveBeenReservedTooLong
方法是这样写的(请注意:这个方法是 protected
所以无法在类外部直接调用)
protected function releaseJobsThatHaveBeenReservedTooLong($queue)
{
$expired = time() - $this->options['expire'];
$this->db->name($this->options['table'])
->where('queue', $this->getQueue($queue))
->where('reserved', 1)
->where('reserved_at', '<=', $expired)
->update([
'reserved' => 0,
'reserved_at' => null,
'attempts' => ['inc', 1]
]);
}
如果过期时间不是 null
, 那么就重新将任务更新为未执行任务。
于是我悲哀的任务重复执行来了。。。
所以如果你的任务只执行一次,且你想保留任务的话可以将这个设置项 expire
设置为 null
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 开发对接过程中的教训
- 使用Kubernetes两年来的经验教训
- 多任务深度学习的三个经验教训
- 生产环境使用一年Kubernetes的经验教训
- 机器学习的教训:5家公司分享的错误经验
- 医疗领域构建自然语言处理系统的经验教训
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
编程原本
Alexander Stepanov、Paul McJones / 裘宗燕 / 机械工业出版社华章公司 / 2012-1-10 / 59.00元
本书提供了有关编程的一种与众不同的理解。其主旨是,实际的编程也应像其他科学和工程领域一样基于坚实的数学基础。本书展示了在实际编程语言(如C++)中实现的算法如何在最一般的数学背景中操作。例如,如何定义快速求幂算法,使之能使用任何可交换运算。使用抽象算法将能得到更高效、可靠、安全和经济的软件。 这不是一本很容易读的书,它也不是能提升你的编程技能的秘诀和技巧汇编。本书的价值是更根本性的,其终极目......一起来看看 《编程原本》 这本书的介绍吧!