OnMessage 无法收到数据

aidong_wang

版本:Gateway 最新版本

自定义协议

在 decode 方法中,对收到的数据进行解析,在 decode 方法的结尾处,返回一个数组,结果如:

某些情况下,在 decode 中已经解析了数据,并且 decode 方法也正确的执行结束了,但 onMessage 函数并没有收到新数据。

可能的原因有哪些?

请问在哪里可以看到错误信息?包括 gateway 本身错误信息?

6605 15 0
15个回答

walkor

一般是协议处理有问题或者客户端发的数据不符合协议

  • 暂无评论
aidong_wang

协议是自定义的,而且已经进入了 decode 函数,我自己都解析成功了

  • 暂无评论
aidong_wang

decode 的函数的返回值有限制吗?

  • 暂无评论
walkor

返回值任意,如果进了decode没有数据,可能是返回的就是空数据

  • 暂无评论
aidong_wang

不是数据空,而是 decode 方法正确的执行结束后,OnMessage 函数并没有被执行。OnMessage 函数第一行就是打印日志,但在某些情况下,一直未被执行,有些情况是正常的

  • 暂无评论
aidong_wang

decode 函数使用 try catch 有关系吗?

  • 暂无评论
walkor

再检查下协议代码吧。

  • 暂无评论
aidong_wang

我再检查一下, decode 的函数的 try catch 去掉了,OnMessage 就正常收到了

  • 暂无评论
aidong_wang

为 Workerman 项目捐赠了100元,仅表心意,谢谢

  • 暂无评论
walkor

非常感谢

  • 暂无评论
aidong_wang

2017-05-24 20:41:01 pid:20362 process_timeout:

1 /data/wwwroot/sd_watch_gateway/vendor/workerman/workerman/Events/Select.php(231): pcntl_signal_dispatch()

2 /data/wwwroot/sd_watch_gateway/vendor/workerman/workerman/Worker.php(1561): Workerman\Events\Select->loop()

3 /data/wwwroot/sd_watch_gateway/vendor/workerman/gateway-worker/src/BusinessWorker.php(183): Workerman\Worker->run()

4 /data/wwwroot/sd_watch_gateway/vendor/workerman/workerman/Worker.php(959): GatewayWorker\BusinessWorker->run()

5 /data/wwwroot/sd_watch_gateway/vendor/workerman/workerman/Worker.php(922): Workerman\Worker::forkOneWorker(Object(GatewayWorker\BusinessWorker))

6 /data/wwwroot/sd_watch_gateway/vendor/workerman/workerman/Worker.php(430): Workerman\Worker::forkWorkers()

7 /data/wwwroot/sd_watch_gateway/start.php(38): Workerman\Worker::runAll()

8 {main}

2017-05-24 20:44:52 pid:20380 process_timeout:

1 /data/wwwroot/sd_watch_gateway/vendor/workerman/workerman/Events/Select.php(231): pcntl_signal_dispatch()

2 /data/wwwroot/sd_watch_gateway/vendor/workerman/workerman/Worker.php(1561): Workerman\Events\Select->loop()

3 /data/wwwroot/sd_watch_gateway/vendor/workerman/gateway-worker/src/BusinessWorker.php(183): Workerman\Worker->run()

4 /data/wwwroot/sd_watch_gateway/vendor/workerman/workerman/Worker.php(959): GatewayWorker\BusinessWorker->run()

5 /data/wwwroot/sd_watch_gateway/vendor/workerman/workerman/Worker.php(922): Workerman\Worker::forkOneWorker(Object(GatewayWorker\BusinessWorker))

6 /data/wwwroot/sd_watch_gateway/vendor/workerman/workerman/Worker.php(1075): Workerman\Worker::forkWorkers()

7 /data/wwwroot/sd_watch_gateway/vendor/workerman/workerman/Worker.php(433): Workerman\Worker::monitorWorkers()

8 /data/wwwroot/sd_watch_gateway/start.php(38): Workerman\Worker::runAll()

9 {main}

这个可能是 decode 方法正确的执行了,但 OnMessage 方法不被调用的可能原因?

  • 暂无评论
walkor

onMessage里的业务太慢了,超时了。
比如onMessage里执行30秒才执行完,
那么第二个请求要等第一个onMessage执行完毕才能执行onMessage,所以会有onMessae没执行的假象

  • 暂无评论
aidong_wang

是的,刚发现是之前在 OnMessage 调用的一个函数里,有个 sleep(60)的代码
有没有 OnMessage 异步处理逻辑的方法?

  • 暂无评论
walkor

慢的任务可以交给其它进程去做,避免阻塞主业务
比如这个
http://doc.workerman.net/315283

  • 暂无评论
aidong_wang

非常感谢,之前通读了一遍手册,感觉 还是读的不精。谢谢了

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