webman,开启自定义进程,监听 阿里云 MNS

evilk

webman中,开启自定义进程
onWorkerStart中,使用 while (true)来达到实时消费的目的
阿里云MNS文档

while (true) {
            try {
                pcntl_signal(SIGINT, function () {
                    Worker::stopAll();
                });

                //waitSeconds非0表示这次receiveMessage是一次http long polling,如果queue内没有message,那么这次request会在server端等到queue内有消息才返回。最长等待时间为waitSeconds的值,最大为30。
                $res = $queue->receiveMessage(30);
                $receiptHandle = $res->getReceiptHandle();

                $message = $res->getMessageBody();
                Log::channel('default')->info('received message : ' . $message);

                sleep(5);//模拟消费数据
                Log::channel('default')->info('handle success');

                $res = $queue->deleteMessage($receiptHandle);

                pcntl_signal_dispatch();
            } catch (\Throwable $throwable) {

            }
        }

但当使用 stop命令时,会报worker[gain-star:37993] exit with status 9
参考了这篇帖子
while(true)中加入了

pcntl_signal(SIGINT, function () {
    Worker::stopAll();
});

和

pcntl_signal_dispatch();

使用stop命令时,依然会报 worker[gain-star:37993] exit with status 9

问题:
如果想达到实时消费的目的,有更好的思路或者办法吗?

2168 2 2
2个回答

walkor 打赏

$queue->receiveMessage(30); 改成 $queue->receiveMessage(1);

至于sleep(5);,执行stop后workerman会kill掉2秒没反应的进程,所以sleep(5)这里会导致进程被kill产生exit with status 9
关于2秒的限制参考 https://www.workerman.net/q/8213#answer_12601 ,如果你的业务需要5秒才能安全停止,需要改动workerman源码 KILL_WORKER_TIMR_TIME 改成大于5秒的值。关于这个超时将在下个workerman和webman版本将支持配置。

最后一个优化,

pcntl_signal(SIGINT, function () {
    Worker::stopAll();
});

这个在onWorkerStart里只执行一次就行了,不用放到while循环里。

  • evilk 2022-04-13

    非常感谢老大
    我试试看

  • adminadmin 2022-09-29

    请问老大
    $queue->receiveMessage(30); 改成 $queue->receiveMessage(1);
    这里为啥要改成1呢

    我修改了之后还是 每30秒多自动消费一次

adminadmin

如上代码的话?
请问 mns那边的
长轮询时间消息
可见性超时时间
应该如何设置

  • 暂无评论
年代过于久远,无法发表回答
×
🔝