Макет задержки в сети асинхронно - PullRequest
2 голосов
/ 07 ноября 2011

У меня есть приложение Scala, которое использует внешний веб-сервис RESTful для некоторой части своей функциональности.Мы хотели бы провести несколько тестов производительности приложения, поэтому мы заглушаем веб-сервис внутренним классом, который подделывает ответ.

Одна вещь, которую мы хотели бы сохранить, чтобы сделать тест производительности максимально реалистичным.насколько возможно, задержка сети и время ответа от удаленного хоста.Это между 50 и 500 мсек (мы измерили).

Нашей первой попыткой было просто сделать Thread.sleep(random.nextInt(450) + 50), однако я не думаю, что это точно - мы используем NIO, который не блокирует, иThread.sleep блокирует и блокирует весь поток.

Есть ли (относительно простой / короткий) способ заглушки метода, который связывается с внешним ресурсом, затем возвращает и вызывает объект обратного вызова, когда готов?Кусок кода, который мы хотели бы заменить реализацией-заглушкой, выглядит следующим образом (используя AsyncHttpClient Sonatype), где мы оборачиваем его обработчик завершения в один из наших собственных, который выполняет некоторую обработку:

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 Ответ

1 голос
/ 08 ноября 2011

Используйте ScheduledExecutorService.Это позволит вам запланировать запуск некоторых вещей в будущем.Executors имеет фабричные методы для их простого создания.

...