模拟网络延迟异步

时间:2011-11-07 12:16:59

标签: scala asynchronous callback delay

我有一个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,但就像我说的那样,阻塞因而错误。

1 个答案:

答案 0 :(得分:1)

使用ScheduledExecutorService。它允许您安排在将来的某个时间运行的东西。 Executors有相当简单的工厂方法来创建它们。