php resque 计划任务,PHP-RESQUE - 实现重试

因为PHP-Resque 的重试部分需要自己写,网上又没啥轮子,而且resque也已经很久不更新了,所以自己研究下resque的源码,然后也借鉴了Laravel的队列重试机制,实现了PHP-Resque的重试机制。

Resque地址

设计思路

1.这里需要阅读resque源码,resque的worker把失败的队列的数据都放在了"resque:failed"列表,数据如下。

ff6fdc1e197d3516b6cdfaeef6c74b01.png

2.我的项目是在yii2下统一处理resque的,打算开一个守护进程不断重试这些失败的队列。

3.我直接resque源码在新增了retry方法,在每一个failJob的payload增加了attempts尝试次数,

一开始创建的时候attempts为0,重试之后attempts每次加1然后进行retry,直到到达尝试数次才停止重试。

核心代码

调用重试的代码

/**

* Retry Job

*/

public function actionRetry()

{

$redis = new Redis('redis');

while (true) {

$json = $redis->rPop('resque:failed');

$array = json_decode($json, true);

if ($array) {

$jobArray = $array['payload'];

if ($jobArray['attempts'] < $this->retryTimes) {

//retry

\Resque::retry($jobArray, $array['queue']);

echo "Queued job " . $jobArray['id'] . ' has retry!' . "\n";

} else {

//stop retry

$redis->lPush('resque:failed', [$json]);

}

}

//take a sleep

echo "*** Sleeping for ".$this->sleep. "\n";

sleep($this->sleep);

}

return true;

}

这里可以弄成守护进程一直处理失败的队列任务。

/php-resque/lib/Resque.php

/**

* retry job and save it to the specified queue.

*

* @param array $jobArray The attempts of the the job .

* array(

* 'id'=> The id of the job

* 'class' => The name of the class that contains the code to execute the job.

* 'args' => Any optional arguments that should be passed when the job is executed.''

* 'attempts'=> The retry attempts of the job

* )

* @param string $queue The name of the queue to place the job in.

*

* @return boolean

*/

public static function retry($jobArray,$queue)

{

require_once dirname(__FILE__) . '/Resque/Job.php';

$result = Resque_Job::retry($jobArray,$queue);

if ($result) {

Resque_Event::trigger('afterEnqueue', array(

'class' => $jobArray['class'],

'args' => $jobArray['args'],

'queue' => $queue,

));

}

return true;

}

php-resque/lib/Resque/Job.php

/**

* retry job and save it to the specified queue.

* *

* @param array $jobArray The data of the job.

* array(

* 'id'=> The id of the job

* 'class' => The name of the class that contains the code to execute the job.

* 'args' => Any optional arguments that should be passed when the job is executed.''

* 'attempts'=> The retry attempts of the job

* )

* @param string $queue The name of the queue to place the job in.

*

* @return string

*/

public static function retry($jobArray,$queue)

{

$args = $jobArray['args'];

if($args !== null && !is_array($args)) {

throw new InvalidArgumentException(

'Supplied $args must be an array.'

);

}

$jobArray['attempts']++;

Resque::push($queue, array(

'class' => $jobArray['class'],

'args' => $args,

'id' => $jobArray['id'],

'attempts'=>$jobArray['attempts']

));

return true;

}

结果:

9c6548f232318d9673c7b2b1c8fa62ee.png

我这里我设置了重试次数为3次,每隔5秒处理一个队列。

注意

1. 只有任务JOB实现类出现异常才会被重新扔回到"resque:failed"队列里面。

2. 对于正常的业务错误不需要重试,目前只考虑到对curl会出现的异常进行重试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ集群、镜像部署配置

1 RABBITMQ简介及安装 RabbitMQ是一个开源的AMQP实现&#xff0c;服务器端用Erlang语言编写&#xff0c;支持多种客户端&#xff0c;如&#xff1a;Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等&#xff0c;支持AJAX。用于在分布式系统中存储转发消息…

C语言、c++实现超好玩植物大战僵尸(完整版附源码)

实现这个游戏需要Easy_X main.cpp //开发日志 //1导入素材 //2实现最开始的游戏场景 //3实现游戏顶部的工具栏 //4实现工具栏里面的游戏卡牌 #define WIN_WIDTH 900 #define WIN_HEIGHT 600 //定义植物类型 enum { WAN_DOU, XIANG_RI_KUI, ZHI_WU_COUNT }; #include<stdio.…

【代码笔记】Web-HTML-颜色

一&#xff0c;效果图。 二&#xff0c;代码。 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>html 颜色</title> </head> <body> <!--html 颜色--> <p style"">> 通过十六…

java 如何去掉http debug日志_你居然还去服务器上捞日志,搭个日志收集系统难道不香吗?...

作者&#xff1a;MacroZheng链接&#xff1a;https://juejin.im/post/5eef217d51882565d74fb4eb来源&#xff1a;掘金SpringBoot实战电商项目mall&#xff08;35kstar&#xff09;地址&#xff1a;http://github.com/macrozheng/…摘要ELK日志收集系统进阶使用&#xff0c;本文…

GitHub的10,000个最受欢迎的Java项目-以下是它们使用的顶级库

随着Java开发人员正在使用既成熟又高度发展的语言来工作&#xff0c;无论何时编写新代码&#xff0c;我们都将面临一个持续的难题–使用大家都在谈论的热门新技术&#xff0c;或者坚持使用久经考验的库&#xff1f; 由于Java应用程序的很大一部分是商业性质的&#xff0c;因此…

Java防止Xss注入json_每日一题(java篇) 如何防止xss注入

1、XssAndSqlHttpServletRequestWrapper 类&#xff1a;import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; public class XssAndSqlHttpServletRequestWrapper extends HttpServletReques…

【工具相关】web-HTML/CSS/JS Prettify的使用

一&#xff0c;打开Sublime Text,代码如下面所示。 二&#xff0c;鼠标右键--->HTML/CSS/JS Prettify--->Prettify Code.代码如图所示&#xff0c;明显的代码变得整齐了。 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

MS SQL 分页存储过程

最近换了家新公司&#xff0c;但是新公司没有使用分页的存储过程。那我就自个写一个往项目上套 &#xff08;效率怎么样就不怎么清楚没有详细的测试过&#xff09; CREATE PROCEDURE [dbo].[pro_common_pageList](tab NVARCHAR(MAX) ,---表名PrimaryKey VARCHAR(100) , --主键I…

STM32CubeMX HAL库串口+DMA数据发送不定长度数据接收

参考资料&#xff1a;1、ST HAL库官网资料 2、https://blog.csdn.net/u014470361/article/details/79206352#comments 一、STM32CubeMX配置外部时钟 注意在进行外部时钟配置时&#xff0c;即“High Speed Clock”和“Low Speed Clock”需配置成“Crytal/Ceramic Resonator&…

pyqt5 qlabel无法显示图片_实战PyQt5: 011-单选框控件QRadioButton

单选框QRadioButton简介QRadioButton为单选按钮&#xff0c; 可以选中(打开)或者取消选中(关闭)。在一组单选按钮中&#xff0c;一次只能选中其中的一个按钮。选中或者取消选中QRadioButton&#xff0c; 都会发出toggled()信号。使用isChecked()可以查看是否选择了某个QRadioBu…

matlab数据游标不能使用,启用数据游标模式

文本解释器&#xff0c;指定为下列值之一&#xff1a;tex - 使用 TeX 标记子集解释字符。latex - 使用 LaTeX 标记解释字符。none - 显示字面字符。TeX 标记默认情况下&#xff0c;MATLAB 支持一部分 TeX 标记。使用 TeX 标记可添加下标和上标&#xff0c;修改字体类型和颜色&a…

MySQL 快速定位性能问题

一、性能查看几款小工具&#xff1a;Top 查看&#xff1a;观察 load average &#xff1a;1分钟&#xff0c;5分钟&#xff0c;15分钟的平均负载值1. us% 用户使用的 CPU 占比&#xff0c;如果 us% 太高&#xff0c; 极有可能索引使用不当。2. sy% 系统内核使用的CPU占比&#…

mybatis-plus分页查询_SpringBoot + MyBatisPlus 快速入门

Hello,大家好&#xff01;前面与大家分享了一次如何搭建Java项目脚手架&#xff0c;并且送给大家一个基础项目模板。那今天与大家分享如何使用这个基础项目&#xff0c;也就是快速上手 SpringBoots ➕ MyBatisPlus。 项目 / 目录结构 天津商业大学学院信息 这是一张天津商业大学…

php 获取每年的节假日,shell获取每年农历节日的日期

原创内容&#xff0c;转载请注明出处&#xff1a;https://www.myzhenai.com.cn/post/3711.html我打算自己写一个每年节日就自动在网站上展示灯笼的源码功能&#xff0c;但是这里最重要的是要获得每年春节、端午节、中秋节等节日的日期&#xff0c;因为要自己写这判断这些日期的…

python爬虫requests实战_Python爬虫之requests库网络爬取简单实战

实例1&#xff1a;直接爬取网页 实例2 &#xff1a; 构造headers&#xff0c;突破访问限制&#xff0c;模拟浏览器爬取网页 实例3 &#xff1a; 分析请求参数&#xff0c;构造请求参数爬取所需网页 实例4&#xff1a; 爬取图片 实例5&#xff1a; 分析请求参数&#xff0c;构造…

某制冷设备制造厂商

某制冷设备制造厂商 该公司是一家以钣金加工&#xff0c;制冷设备制造、销售为主的公司&#xff0c;其产品广泛应用于高级宾馆、饭店及大型餐饮设施等。销售网点遍及日本、北美、欧洲及东南亚&#xff0c;产品深受世界各地用户的欢迎。 该公司原先使用的是TPICS生产管理系统&am…

python数字转换_Python实现中文数字转换为阿拉伯数字的方法示例

本文实例讲述了Python实现中文数字转换为阿拉伯数字的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 一、需求 今天写了三千二百行代码。 今天写了3200行代码。 两行意思相同&#xff0c;只是表达方式不太能够&#xff0c;统一掉。 二、原理 数字的特征是 数字 …

LeetCode第14题:最长公共前缀

题目描述 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1: 输入: ["flower","flow","flight"] 输出: "fl" 示例 2: 输入: ["dog","racecar"…

臭名昭著的sun.misc.Unsafe解释

Java虚拟机的最大竞争对手可能是托管C&#xff03;等语言的Microsoft CLR 。 CLR允许编写不安全的代码作为低级编程的入口&#xff0c;这在JVM上很难实现。 如果您需要Java中的此类高级功能&#xff0c;则可能会被迫使用JNI &#xff0c;这需要您了解一些C并Swift导致代码紧密耦…

主从复制

五 主从复制 Replication(重要&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;) 5.1、介绍 基于主库二进制日志实时恢复到备库。 5.2、原理 5.2.1 主从复制的前提 &#xff08;1&#xff09;两台或两台以上数据库实例 &#xff08;2&#xff09;主库…