OnMessage 无法收到数据

版本:Gateway 最新版本

自定义协议

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

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

可能的原因有哪些?

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

walkor

赞同来自: aidong_wang

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

walkor

赞同来自: aidong_wang

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

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 异步处理逻辑的方法?

aidong_wang

赞同来自:

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

要回复问题请先登录注册