Java节流机制

2024-04-24

Update:我使用的是 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)方法可以被调用,也可以不被调用。 (当然,它总是可以called,但如果我们超出了我们的费率,就没有调用它的意义。)

所以可以让我编写这样的代码:

// 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),但尽管如此,我需要一个坚实/可靠的机制,它将暂停/睡眠,直到WidgetService#doSomething(Fizz) can叫做。

这让我feel就像我们正在进入使用多线程的领域一样,这让我feel就像我们可以使用某种锁定机制和 Java 通知(wait()/notify()) 模型。但由于没有这方面的经验,我似乎无法理解最优雅的解决方案。提前致谢。


最好的选择之一可能是使用信号量http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html 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 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 开始工作。

另外更好的解决方案是使用com.google.common.util.concurrent.RateLimiter来自番石榴。它可以看起来像这样:

class Throttler {
  final RateLimiter rateLimiter = RateLimiter.create(80.0/60.0);

  makeCall() {
    rateLimiter.acquire();
    doMakeCall();
  }
}

与 Semaphore 解决方案相比,语义略有不同,RateLimiter 很可能更适合您的情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java节流机制 的相关文章

  • 如何在 Eclipse 中用阿拉伯语读写

    我在 eclipse 中编写了这段代码来获取一些阿拉伯语单词 然后打印它们 public class getString public static void main String args throws Exception PrintS
  • 检查双精度值的等于和不等于条件

    我在比较两者时遇到困难double values using and 我创建了 6 个双变量并尝试进行比较If健康 状况 double a b c d e f if a b c d e f My code here in case of t
  • JTree 节点不会被直观地选择

    不知何故 我无法为我的 JTree 节点启用 选择突出显示 我正在我的项目中使用自定义单元格渲染器 这很可能导致此问题 这是完整的渲染器类代码 protected class ProfessionTreeCellRenderer exten
  • 通过 InjectMocks Spy 注入对象

    我需要对一个类运行一系列单元测试 该类具有 Autowired Logger 实现 实现的基本思想是 Mock Logger logger InjectMocks TestedClass tested 但我想保存日志输出功能 Mockito
  • 使用 Spring 时实例化对象,用于测试与生产

    使用 Spring 时 应该使用 Spring 配置 xml 来实例化生产对象 并在测试时直接实例化对象 这样的理解是否正确 Eg MyMain java package org world hello import org springf
  • 方法断点可能会大大减慢调试速度

    每当向方法声明行添加断点 在 Intellij IDEA 或 Android Studio 中 时 都会出现一个弹出窗口 方法断点可能会大大减慢调试速度 为什么会这样戏剧性地减慢调试速度 是我的问题吗 将断点放在函数的第一行有什么不同 Th
  • 使用 java 按电子邮件发送日历邀请

    我正在尝试使用 java 发送每封电子邮件的日历邀请 收件人收到电子邮件 但不会显示接受或拒绝的邀请 而是将该事件自动添加到他的日历中 我正在使用 ical4j jar 构建活动 邀请 private Calendar getInvite
  • 使用 Guava 联合两个 ImmutableEnumSets

    我想联合两个ImmutableEnumSets来自番石榴 这是我的尝试 public final class OurColors public enum Colors RED GREEN BLUE YELLOW PINK BLACK pub
  • 参数动态时如何构建 JPQL 查询?

    我想知道是否有一个好的解决方案来构建基于过滤器的 JPQL 查询 我的查询太 富有表现力 我无法使用 Criteria 就像是 query Select from Ent if parameter null query WHERE fiel
  • 如何在java中使jpeg无损?

    有没有人可以告诉我如何使用编写 jpeg 文件losslessjava中的压缩 我使用下面的代码读取字节来编辑字节 WritableRaster raster image getRaster DataBufferByte buffer Da
  • 从 html 页面和 javascript 调用 java webservice

    我正在尝试从 javascript 调用 java 实现的 Web 服务 使用 NetBeans IDE 我读过很多关于 jQuery 和 AJAX 的内容 但我似乎无法掌握它 假设我的 Web 服务 WSDL 位于 http localh
  • 让JScrollPane控制多个组件

    对于我的应用程序 我正在设计一个脚本编辑器 目前我有一个JPanel其中包含另一个JPanel保存行号 位于左侧 以及JTextArea用于允许用户输入代码 位于右侧 目前 我已经实施了JScrollPane on the JTextAre
  • 在 AKKA 中,对主管调用 shutdown 是否会停止其监督的所有参与者?

    假设我有一位主管连接了 2 位演员 当我的应用程序关闭时 我想优雅地关闭这些参与者 调用supervisor shutdown 是否会停止所有参与者 还是我仍然需要手动停止我的参与者 gracias 阻止主管 https github co
  • WPF 从主线程以外的其他线程截屏

    我有一个线程用于侦听 WPF 应用程序的命令 如果 WPF 应用程序收到截取屏幕截图的命令 则任务将移交给 screenshotService 我在互联网上的某个地方找到了一些代码来截取屏幕截图 似乎可以工作 但我还没有想清楚 我无法从另一
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • 我想要一个 Java 阿拉伯语词干分析器

    我正在寻找阿拉伯语的 Java 词干分析器 我找到了一个名为 AraMorph 的库 但它的输出是无法控制的 并且它会形成不需要的单词 还有其他阿拉伯语词干分析器吗 这是新的阿拉伯语词干分析器 Assem 的阿拉伯语轻词干分析器 http
  • 重写Object类的finalize()方法有什么用?

    据我所知 在java中如果我们想手动调用垃圾收集器 我们可以执行System gc 1 我们在重写的finalize 方法中做了哪些操作 2 如果我们想手动调用JVM垃圾收集器 是否需要重写finalize 方法 我们在重写的 Finali
  • 从一个文本文件中获取数据并将其移动到新的文本文件

    我有一个文件 里面有数据 在我的主要方法中 我读入文件并关闭文件 我调用另一种方法 在原始文件的同一文件夹内创建一个新文件 所以现在我有两个文件 原始文件和通过我调用的方法生成的文件 我需要另一种方法 从原始文件中获取数据并将其写入创建的新
  • MongoDB Java 驱动程序:MongoCore 驱动程序与 MongoDB 驱动程序与 MongoDB 异步驱动程序

    MongoDB Java 驱动程序有三种不同的驱动程序选项 核心驱动 MongoDB 驱动程序 MongoDB 异步驱动程序 The 驱动程序描述页面 https docs mongodb org ecosystem drivers jav
  • Java 推断泛型类型

    我正在寻找类似的推断捕获泛型类型的概念 类似于以下方法片段 但不是捕获泛型类型的类 public

随机推荐

  • Spark 2.0 弃用了“DirectParquetOutputCommitter”,没有它如何生活?

    最近 我们从 HDFS 上的 EMR gt S3 上的 EMR 启用了一致视图的 EMRFS 迁移 我们意识到 Spark SaveAsTable 镶木地板格式 写入 S3 的速度比 HDFS 慢约 4 倍 但我们发现使用 DirectPa
  • 在 MySQL 中的分组列中搜索?

    我需要创建一个男人的数据库 男人可以有一个或多个属性 每个男人的属性都有一个特定的值 听起来很简单吧 好吧 继续阅读 因为这个问题有点不可能 5 天处理它 s 所以我创建了这 3 个表 CREATE TABLE guy id int 11
  • Int32 和 UInt32 有什么区别?

    有什么区别Int32 and UInt32 如果它们与容量范围能力相同 问题是出于什么原因UInt32被创造了 我应该什么时候使用UInt32代替Int32 UInt32 不允许负数 从MSDN http msdn microsoft co
  • 修复了滚动 html 文档时的 div

    我正在寻找一个 jquery 插件 可以让我实现这种效果 静态向下滚动 http www bnet com blog drug business it 8217s a trap congress wants to see j j ceo s
  • jQuery hide() div 直到完全加载

    我正在为我的博客使用选项卡式特色帖子 如何实施div latest featured will hide then show 内容完全加载后它会回来吗 document ready function Default Action tab c
  • 从 pod 连接到其他 pod

    基本上 我有一个部署 它创建了 3 个自动扩展的容器 PHP FPM NGINX 和包含应用程序的容器 所有这些都设置了机密 服务和入口 该应用程序还在 PHP FPM 和 NGINX 之间共享项目 因此一切都已设置完毕 由于我想使用 K8
  • M1 Apple Silicon Mac 上的 Dynamodb 本地设置

    我使用 dynamodb 进行了本地设置https docs aws amazon com amazondynamodb latest developerguide DynamoDBLocal DownloadingAndRunning h
  • iOS - iOS 设备和外部配件 (BluetoothWatch) 之间 BLE 数据传输的 MTU 大小

    我正在为使用 BLE CoreBluetooth 的蓝牙手表开发 iOS 应用程序 Objective C 并且我的手表具有 GATT 蓝牙配置文件 iOS 应用程序最低支持来自 iOS7 我想知道如何使用 Core Bluetooth 框
  • 如何从 SDK 插件数据文件夹加载 dll?

    我们使用 Web IDE 来创建插件 我的 test dll 位于数据文件夹中 如何通过js ctypes加载它 使用像 c test dll 这样的绝对路径没有问题 但我无法使用此路径来分发它 var lib ctypes open c
  • Linux 中的机器人框架

    如何借助Robot框架获取Linux中执行的命令的状态 例如如果使用这个 SSHLibrary open Connection server SSHLibrary login xxxxx xxxxx 1111 Write command 2
  • 最近有关于 JVM 的书吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何重命名 iOS 8 Today Widget?

    我刚刚开始尝试将 iOS 8 Today Widget 添加到我的应用程序中 到目前为止一切顺利 但我遵循原始模板并使用 TodayWidget 作为名称创建了我的小部件 在 Xcode 中我的应用程序文件的上下文中 目标 产品名称很好 但
  • Java反射性能——替代方案

    各种问题中讨论的主题 参考文献1 https stackoverflow com questions 19557829 faster alternatives to javas reflection 19563000 19563000 参考
  • boost::shared_mutex 多读取器/单写入器互斥体

    我正在尝试使用 boost shared mutex 来实现多读取器 单写入器互斥体 我的问题相当简单 当另一个线程尝试锁定共享互斥体进行写入时 线程是否有可能获得对共享互斥体的读取器访问权限 例如 我有10个线程 只有其中一个可以写 线程
  • 如何通过脚本使Texture2D可读

    我想让用户能够解码从图库加载的 QR 图像 我找到了一个插件来探索图像并将其加载为texture2D 但是要解码该 QR 代码 Texture2D 必须是可读 可写的 我检查了该插件 对于 Android 它使用 jar 进行探索和加载内容
  • 从 PhoneGap 重新启动设备

    有没有办法用phonegap cordova重启设备 我该怎么做呢 我认为这在 iPad iPhone 上可能不可能 但在 Android 上可以 首先 除非您的设备已root 越狱 否则基本上无法完成 取决于我们谈论的是Android o
  • Visual Studio 2010:如何在解决方案中强制执行项目的构建顺序?

    我在 Visual Studio 2008 中没有遇到任何问题 但 VS 2010 似乎有问题 我敢打赌这可能是我的问题 我有一个包含 ASP NET 网站项目和一些 C 项目 BLL DAL NUnit 中的测试 的解决方案 我已将测试项
  • Java:如何复制一个对象,使其来自同一个子类?

    我尝试使用一个简单的例子来更好地理解 我有一堂课Tool以及正在延伸班级的子班Tool Hammer Saw 两者都定义了一些字段 例如weight两者都是重写方法getCost有自己的实现 Tool first tool new Hamm
  • 如何以及何时在 MySQL 中正确使用 SLEEP()?

    和 关联我的另一个问题 https stackoverflow com questions 4284162 calling stored procedure sequentially from sql file and php fails
  • Java节流机制

    Update 我使用的是 Java 1 6 34 没有机会升级到 Java 7 我有一个场景 每分钟只允许调用一个方法 80 次 它实际上是由第 3 方编写的服务 API 如果调用次数过多 它会 关闭 忽略调用 其 API public c