- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
更新:我使用的是 Java 1.6.34,没有机会升级到 Java 7。
我有一个场景,我每分钟只能调用一个方法 80 次。它实际上是由第 3 方编写的服务 API,如果您多次调用它,它会“关闭”(忽略调用)它的 API:
public class WidgetService {
// Can only call this method 80x/min, otherwise it
// it just doesn't do anything
public void doSomething(Fizz fizz);
}
我想编写一个 ApiThrottler
类,它有一个 boolean canRun()
方法,它会告诉我的 Java 客户端 doSomething(Fizz)
方法可以调用也可以不调用。 (当然它总是可以被调用,但是如果我们超过了我们的速率就没有调用它的意义了。)
所以可以让我像这样编写代码:
// 80x/min
ApiThrottler throttler = new ApiThrottler(80);
WidgetService widgetService = new DefaultWidgetService();
// Massive list of Fizzes
List<Fizz> fizzes = getFizzes();
for(Fizz fizz : fizzes)
if(throttler.canRun())
widgetService.doSomething(fizz);
这不一定是 API (ApiThrottler#canRun
),但我仍然需要一个可靠的机制来暂停/hibernate 直到 WidgetService#doSomething(Fizz)
可以被调用。
这让我感觉我们正在进入使用多线程的领域,这让我感觉我们可以使用某种锁定机制和 Java通知(wait()
/notify()
)模型。但是由于没有这方面的经验,我似乎无法想出最优雅的解决方案。提前致谢。
最佳答案
最好的选择之一可能是使用信号量 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html类并每分钟给它 80 个许可。例如,这可以通过使用计时器类 http://docs.oracle.com/javase/7/docs/api/java/util/Timer.html 来完成。 .调用者线程每次通过在信号量上调用 acquire() 来执行对服务的调用时都会消耗许可,如果所有许可都已耗尽,这将阻塞。
正如您提到的,当然可以使用带有计时器或单独线程的等待/通知和整数计数器来对此进行编码,但是与使用更现代的 java.util.concurrent API 相比,这会更复杂我已经在上面概述了。
它看起来接近于以下内容:
class Throttler implements TimerTask {
final Semaphore s = new Semaphore(80);
final Timer timer = new Timer(true);
Throttler() {
timer.schedule(this, 0, 60*1000); //schedule this for 1 min execution
}
run() { //called by timer
s.release(80 - s.availablePermits());
}
makeCall() {
s.acquire();
doMakeCall();
}
}
这应该从 Java 5 开始工作。
更好的解决方案是使用 Guava 的 com.google.common.util.concurrent.RateLimiter
。它可能看起来像这样:
class Throttler {
final RateLimiter rateLimiter = RateLimiter.create(80.0/60.0);
makeCall() {
rateLimiter.acquire();
doMakeCall();
}
}
与 Semaphore 解决方案相比,语义略有不同,RateLimiter 很可能更适合您的情况。
关于Java throttle 机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14638349/
上下文:我正在 javascript tutorial 的任务下编写一个简单的 throttle 。 任务:编写一个像这样工作的 throttle : function f(a) { consol
我有一个带有 React 函数 component 的简单点击事件,我尝试使用 RxJS throttleTime 进行 throttle 。每次单击我都会在 500 毫秒 内 throttle ,但
在 Laravel 6 中,密码代理现在具有以下功能来限制密码重置( https://github.com/laravel/framework/blob/6.x/src/Illuminate/Auth
我有一个事件监听器,我正在尝试用 lodash.throttle 包装它: import throttle from "lodash.throttle" const throttledHandleRe
当我尝试使用 go get 命令安装 throttled 时: go get "github.com/throttled/throttled" 我得到错误: 无法加载包:包 github.com/th
更具体地说,我正在寻找 BlackBerry 6.0 API Animator 类,其构造函数描述为“创建一个以指定帧速率限制 update() 调用的 Animator 对象”。 http://ww
在应用洞察中,在 API->Activity & Errors 下有与“Api Throttling”和“API Throttling Warnings”相关的部分。但是我找不到关于这些部分的含义以及
最近,我们在使用IPP数据服务的应用中,不时遇到这些错误。 ErrorRequest 2012-12-07T10:10:59+00:00 3001 messag
最近,我们在使用IPP数据服务的应用中,不时遇到这些错误。 ErrorRequest 2012-12-07T10:10:59+00:00 3001 messag
我有以下代码: IDisposable subscription = myObservable.Throttle(TimeSpan.FromMilliseconds(50), RxApp.MainTh
我有一个定义 onDragEvent 的 Controller : controller = Em.Object.create( { onDragEvent: function() {
我如何使用 ScheduledThreadPoolExecutor、ScheduledFuture 和 ExecutorCompletionService 的组合来限制接受可变参数?收到来自 Call
我在 trait ThrottlesLogins 中添加了以下方法在 Laravel 5.5 中 protected function TotalRegisterAttemptsLeft($reque
我正在使用 ThrottleRequest 来限制登录尝试。 在 Kendler.php 我有 'throttle' => \Illuminate\Routing\Middleware\Throttl
我可能对此完全疯了,但是YouTube视频的下载/缓冲速率似乎在一开始就更快,并且缓冲点距当前播放的标记越远,缓冲的速度就越慢。 我疯了吗,还是对其他所有人一样? 假设是后者,那么关于它们如何做的任何
我在我的几个页面上设置了无限滚动功能。它工作得很好,但是加载更多项目的 Ajax 调用会进行多次数据库调用,并且每次都必须加载大量图像,并且通常需要几秒钟才能加载。根据我的连接情况,我将其计时在 3
加特林世界的新手,但一位经验丰富的 Loadrunner 用户。我创建了一个示例模拟来运行两个场景,每个场景有 10 个用户,并且希望运行 10 分钟。以下是我的 setup 函数中的内容。但每次我运
我想知道是否有办法执行诸如 System.out.println(); 之类的操作或记录已发生的限制。目前我可以查看是否发生限制的唯一方法是将rejectExecution 设置为True。问题在于,
我正在使用一个 API,它只允许您使用像 request-promise 或 axios 这样的 promise 请求库每秒进行 200 次调用(1000 毫秒)怎么可能你使用 rx.js 去抖/限制
我正在以用户在多线程环境中定义的批量大小写入内存分布式数据库。但是我想限制写入ex的行数。 1000 行/秒。这个要求的原因是我的生产者写得太快而消费者遇到叶内存错误。在批处理记录时是否有任何标准做法
我是一名优秀的程序员,十分优秀!