我有一个Scala应用程序,它依赖于外部RESTful Web服务来实现其部分功能。我们想对应用程序进行一些性能测试,因此我们使用内部类来阻止响应的Web服务。
为了使性能测试尽可能真实,我们希望保留的一件事是远程主机的网络延迟和响应时间。这是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
,但就像我说的那样,阻塞因而错误。