zoukankan      html  css  js  c++  java
  • Laravel 队列重复执行同一个任务

    Laravel 队列重复执行同一个任务

    一、总结

    一句话总结:

    现象:发现插入到数据库里的数据【有大量重复的数据】。(注释:用的 redis 驱动队列)
    原因:发现是【因为任务的执行时间太长,导致任务过期,重新把任务放到队列里面】,然后问题就出来了,超时的任务并没有停止掉,而新放到队列里的任务也在执行,这就导致有两个队列在同时执行一个任务。
    解释:【参数项 --timeout 的值应该始终小于配置项 retry_after 的值】,这是为了【确保队列进程总在【任务重试】以前关闭】。如果 --timeout 比 retry_after 大,那么你的任务可能被执行两次。

    二、Laravel 队列重复执行同一个任务

    转自:https://learnku.com/articles/41316

    在 laravel 中使用队列执行任务,任务的逻辑大体是循环插入数据 (这里我就要说一下了,循环里面最好不要执行插入/修改操作)。

    这是大体代码:
    $data=array(这是数据);
    foreach ($data as $key => $value) {
        //这里是判断数据是否已存在
        //code....


        $table1 = new Table1;
        $table1->field1=$value['field1'];
        $table1->field2=$value['field2'];
        if($table1->save()){
            $table2 = new Table2;
            $table2->table1_id=$table1->id;
            $table2->field1=$value['field3'];
            $table2->field2=$value['field4'];
            $table2->save();
        }
    }
    但是发现插入到数据库里的数据有大量重复的数据。(注释:用的 redis 驱动队列)

    查看队列执行日志,发现是因为任务的执行时间太长,导致任务过期,重新把任务放到队列里面,然后问题就出来了,超时的任务并没有停止掉,而新放到队列里的任务也在执行,这就导致有两个队列在同时执行一个任务。

    我查看了文档发现,有这么一个东西:

    注:参数项 --timeout 的值应该始终小于配置项 retry_after 的值,这是为了确保队列进程总在任务重试以前关闭。如果 --timeout 比 retry_after 大,那么你的任务可能被执行两次。

    然后就去检查了参数设置,--timeout 为 500,而 retry_after 才 90,怪不得会重复执行


     
    我的旨在学过的东西不再忘记(主要使用艾宾浩斯遗忘曲线算法及其它智能学习复习算法)的偏公益性质的完全免费的编程视频学习网站: fanrenyi.com;有各种前端、后端、算法、大数据、人工智能等课程。
    博主25岁,前端后端算法大数据人工智能都有兴趣。
    大家有啥都可以加博主联系方式(qq404006308,微信fan404006308)互相交流。工作、生活、心境,可以互相启迪。
    聊技术,交朋友,修心境,qq404006308,微信fan404006308
    26岁,真心找女朋友,非诚勿扰,微信fan404006308,qq404006308
    人工智能群:939687837

    作者相关推荐

  • 相关阅读:
    Welcome to my website
    花生壳
    Gentle.NET Attribute
    发布WebFtp 控件(ASP.NET控件,用以web方式进行文件上下传操作)
    发布数据库连接字符串生成工具
    发布语法加亮控件(SyntaxTextBox)
    .NET中现有的 ORM 工具(转)
    发布Oracle存储过程包c#代码生成工具(CodeRobot)
    ASCII码表
    爱上语法高亮控件ICSharpCode.TextEditor ~o~
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/14484001.html
Copyright © 2011-2022 走看看