服務(wù)會(huì)接收1min左右一次的消息,當(dāng)收到消息后會(huì)根據(jù)消息中的經(jīng)緯度,異步調(diào)用逆地理位置服務(wù),獲取逆地理位置信息。
異步調(diào)用逆地理位置服務(wù)成功幾次后,就會(huì)出現(xiàn)一次異步調(diào)用失敗,錯(cuò)誤原始提示 異步調(diào)用的方法已經(jīng)被調(diào)用。但是根據(jù)記錄的log,前面幾次調(diào)用都已經(jīng)完成了接收數(shù)據(jù)的操作(見(jiàn)附件圖片)。
查看source出現(xiàn)這種情況的時(shí)候是異步調(diào)用方法所有參數(shù)序列化后作為key來(lái)保存實(shí)例,如果已經(jīng)存在實(shí)例,那么就拋已經(jīng)調(diào)用異步服務(wù)的異常。那么同一個(gè)進(jìn)程,如果key不變,那么第二次調(diào)用就會(huì)拋這個(gè)異常。
這樣的實(shí)現(xiàn)是不是bug?
找到原因了,接收消息,然后異步調(diào)用逆地理位置解析服務(wù)的服務(wù),是個(gè)常駐內(nèi)存的服務(wù),因此導(dǎo)致self::$asyncInstances必然出現(xiàn)已經(jīng)存在的情況。
概率出現(xiàn)的原因是接收消息的服務(wù)本身就是個(gè)多進(jìn)程的服務(wù),當(dāng)隨機(jī)接收消息時(shí)出現(xiàn)在同一個(gè)進(jìn)程中時(shí),就會(huì)報(bào)錯(cuò)。
解決的辦法是在異步接收數(shù)據(jù)后,將self::$asyncInstances置null。