class ServiceClient(val rateLimit: Float = 1.0f) { private val fuelManager = FuelManager() private var previousDispatchTime = Instant(dateFormatter.parse("19700101")) private val rateLimit1 = 1.0 / rateLimit * 1000.0 init { fuelManager.basePath = "https://my-service.com" fuelManager.addRequestInterceptor { it.apply { synchronized(previousDispatchTime) { val now = Instant.now() val timeBetweenRequests = now.minus(previousDispatchTime.millis).millis if (timeBetweenRequests < rateLimit1) { val pauseTime = rateLimit1.toLong() - timeBetweenRequests Thread.sleep(pauseTime) } previousDispatchTime = now } } } } fun objectsForDate(date: Date) : Triple, FuelError>> = fuelManager .request( Method.GET, "api/objects/${dateFormatter.format(date)}/") .responseObject() }