服务会接收1min左右一次的消息,当收到消息后会根据消息中的经纬度,异步调用逆地理位置服务,获取逆地理位置信息。
异步调用逆地理位置服务成功几次后,就会出现一次异步调用失败,错误原始提示 异步调用的方法已经被调用。但是根据记录的log,前面几次调用都已经完成了接收数据的操作(见附件图片)。
查看source出现这种情况的时候是异步调用方法所有参数序列化后作为key来保存实例,如果已经存在实例,那么就抛已经调用异步服务的异常。那么同一个进程,如果key不变,那么第二次调用就会抛这个异常。
这样的实现是不是bug?
找到原因了,接收消息,然后异步调用逆地理位置解析服务的服务,是个常驻内存的服务,因此导致self::$asyncInstances必然出现已经存在的情况。
概率出现的原因是接收消息的服务本身就是个多进程的服务,当随机接收消息时出现在同一个进程中时,就会报错。
解决的办法是在异步接收数据后,将self::$asyncInstances置null。
ok