2011-11-07 141 views
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,但就像我說的那樣,阻塞因此是錯誤的。

回答

1

使用ScheduledExecutorService。它可以讓你安排事情在未來某個時候運行。 Executors有相當簡單地創建它們的工廠方法。

+0

就是這樣 - 完美地工作,就像它應該那樣。謝謝! – fwielstra