2
我有一個Scala應用程序,它的某些功能依賴於外部RESTful Web服務。我們希望對應用程序進行一些性能測試,所以我們用一個內部類來僞造webservice,以此來僞造響應。異步模擬網絡延遲
爲了讓性能測試儘可能逼真,我們希望保留的一件事是來自遠程主機的網絡延遲和響應時間。這是50至500毫秒(我們測量)。
我們的第一次嘗試是簡單地做一個Thread.sleep(random.nextInt(450) + 50)
,但我認爲這並不準確 - 我們使用非阻塞的NIO,並且Thread.sleep
阻塞並鎖定了整個線程。
是否有一種(相對簡單/短的)方法來存儲聯繫外部資源的方法,然後在準備好時返回並調用回調對象?我們願與存根實現替換的代碼位如下(使用Sonatype的的AsyncHttpClient),在這裏我們總結其完成處理對象在我們自己的,做一些處理:
def getActualTravelPlan(trip: Trip, completionHandler: AsyncRequestCompletionHandler) {
val client = clientFactory.getHttpClient
val handler = new TravelPlanCompletionHandler(completionHandler)
// non-blocking call here.
client.prepareGet(buildApiURL(trip)).setRealm(realm).execute(handler)
}
我們當前的實現不該方法中的Thread.sleep
,但就像我說的那樣,阻塞因此是錯誤的。
就是這樣 - 完美地工作,就像它應該那樣。謝謝! – fwielstra