国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

redis-queue 隊列插件能不能主動拋出異常?

kspade

http://www.wtbis.cn/plugin/12
下面是webman 官方插件的一些說明:

消費失敗重試
如果消費失敗(發(fā)生了異常),則消息會放入延遲隊列,等待下次重試。重試次數(shù)通過參數(shù) max_attempts 控制,重試間隔由
retry_seconds 和 max_attempts共同控制。比如max_attempts為5,retry_seconds為10,第1次重試間隔為1*10秒,第2次重試時間間隔為 2*10秒,第3次重試時間間隔為3*10秒,以此類推直到重試5次。如果超過了max_attempts設(shè)置測重試次數(shù),則消息放入key為{redis-queue}-failed的失敗隊列。

注意
消費過程中沒有拋出異常視為消費成功,否則消費失敗,進入重試隊列

問題

因為redis沒有ack 模式,
1.能否故意把某個隊列拋出為異常(目的是為了丟進重試隊列)
2.又或者能不能主動把某條隊列丟入重試隊列

原因

因為我的隊列消費時的工作場景為:curl 攜帶XX參數(shù),訪問一個異步通知地址,當整個地址返回的內(nèi)容為:success 代表消費成功,否則丟入重試隊列(xx秒后重試 - 一共重試5次)

rabbitmq 的stomp是符合我的使用場景的,搞了兩天了都沒搞定這玩意 太難了!
什么都搞好了,投遞消息就提示:Stomp client: not_found
放棄了 搞redis-queue

1862 4 0
4個回答

2548a

使用 throw new \Exception();不就好了嗎

  • kspade 2022-05-22

    public function consume 里面 怎么使用哦

  • 2548a 2022-05-22

    判斷返回地址,不符合要求就調(diào)用 throw new \Exception('xx不符合,重試'); 就完了,這句話就是手動拋異常的.這樣它就會判斷隊列執(zhí)行失敗,等會就會再重新執(zhí)行了

  • kspade 2022-05-22

    我試了一下并不行,產(chǎn)生一堆垃圾信息

    0 /log/webman/vendor/workerman/redis-queue/src/Client.php(218): app\queue\redis\MyMailSend->consume()

    1 /log/webman/vendor/workerman/redis/src/Client.php(422): Workerman\RedisQueue\Client->Workerman\RedisQueue{closure}()

    2 /log/webman/vendor/workerman/workerman/Connection/TcpConnection.php(638): Workerman\Redis\Client->Workerman\Redis{closure}()

    3 [internal function]: Workerman\Connection\TcpConnection->baseRead()

    4 /log/webman/vendor/workerman/workerman/Events/Event.php(193): EventBase->loop()

    5 /log/webman/vendor/workerman/workerman/Worker.php(2435): Workerman\Events\Event->loop()

    6 /log/webman/vendor/workerman/workerman/Worker.php(1555): Workerman\Worker->run()

    7 /log/webman/vendor/workerman/workerman/Worker.php(1397): Workerman\Worker::forkOneWorkerForLinux()

    8 /log/webman/vendor/workerman/workerman/Worker.php(1371): Workerman\Worker::forkWorkersForLinux()

    9 /log/webman/vendor/workerman/workerman/Worker.php(1692): Workerman\Worker::forkWorkers()

    10 /log/webman/vendor/workerman/workerman/Worker.php(1641): Workerman\Worker::monitorWorkersForLinux()

    11 /log/webman/vendor/workerman/workerman/Worker.php(551): Workerman\Worker::monitorWorkers()

    12 /log/webman/start.php(108): Workerman\Worker::runAll()

  • damao 2022-05-23

    可以的,如果發(fā)生異常會顯示異常包括調(diào)用棧,然后自動扔到重試隊列里。你貼的這個就是顯示的異常信息

nitron

我給個思路吧,也是現(xiàn)在在用的,不使用提供的失敗隊列,沒有得到需要的結(jié)果重新將任務(wù)發(fā)送到隊列內(nèi),如果執(zhí)行有異常則catch住后重新將任務(wù)發(fā)送到隊列內(nèi),自己記數(shù),超過了設(shè)定的次數(shù)都未得到需要的結(jié)果則丟棄(即不再送入隊列),同時記錄日志,通知系統(tǒng)有處理失敗的任務(wù)

  • 暫無評論
yzh52521
 // 隊列名
    public $queue = '/topic/send_mail';

    // 連接名,對應(yīng) config/redis_queue.php 里的連接`
    public $connection = 'default';

    // 消費
    public function consume($data)
    {
        // 無需反序列化
        //var_export($data); // 輸出 ['to' => 'tom@gmail.com', 'content' => 'hello']
        throw new \Exception('異常消息');
    }
  • 暫無評論
evilk

我現(xiàn)在的做法是:
1.
在消費過程中,如果失敗了,則手動拋出異常,讓該任務(wù)進入原隊列,等待重新執(zhí)行

2.
如果最終超過重試次數(shù),則進入失敗隊列

3.
為了防止失敗隊列中的任務(wù)堆積 和 監(jiān)控失敗的任務(wù)
在整個服務(wù)啟動的時候,單獨起一個自定義進程
在進程啟動的時候,開啟一個定時器
每5秒(時間自定義,我目前設(shè)置的是每5秒執(zhí)行一次),從失敗隊列中,取出一個失敗的任務(wù)
把這個任務(wù)所有的數(shù)據(jù)(包括任務(wù)本身 和 異常堆棧),入庫(一個專門存放失敗任務(wù)的表)

4.
在后臺,開一個頁面,可以看到這個表里的數(shù)據(jù),也就是所有失敗的任務(wù)
在這個頁面,根據(jù)任務(wù)失敗的原因,可以選擇

  • 重新丟入原隊列執(zhí)行
  • 刪除該任務(wù)
  • 暫無評論
年代過于久遠,無法發(fā)表回答
??