在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
问题:
如果想达到实时消费的目的,有更好的思路或者办法吗?
$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版本将支持配置。
最后一个优化,
这个在onWorkerStart里只执行一次就行了,不用放到while循环里。
非常感谢老大
我试试看
请问老大
$queue->receiveMessage(30); 改成 $queue->receiveMessage(1);
这里为啥要改成1呢
我修改了之后还是 每30秒多自动消费一次
如上代码的话?
请问 mns那边的
长轮询时间消息
可见性超时时间
应该如何设置