延迟,速率受限可运行执行

问题描述 投票:0回答:0

我正在编写一个必须触发一些下游更新过程的事件处理程序,目前通过将一个

Runnable
实例放入一个
ExecutorService
execute
)来完成。

挑战是:事件可能在一小时内发生一次(这很好),但也可能在几秒钟内发生 100 次。

如果事件发生,必须调用下游流程之后以保持数据结构最新。所以说“(现在()-previousEventTime)< threshold ==>不要这样做”不是一个选择。因为最近的事件可能已经改变了一切,虽然它只比上一个晚了2秒。

但另一方面,在事件发生后,将下游流程延迟几秒钟(例如 10-30 秒)并不是什么大事。

我在想这样的伪代码:

private void onEvent() {
    if( isRunnableAlreadyPendingToBeExecuted() ) return;
    executeDeferred( updateProcessRunnable, 10, TimeUnit.SECONDS );
}

请看这个事件序列的例子:

  • t+0sec:事件 A -> Runnable 排队等待 10 秒后运行。
  • t+1sec:事件 B -> 什么都没有发生,因为 runnable 已经挂起。
  • t+8sec:事件 C -> 什么都没有发生,因为 runnable 已经挂起。
  • t+10sec:(执行延迟的可运行对象。)
  • t+10.5sec:事件 D -> 下一个可运行对象排队等待 10 秒后运行。

如何在没有第三方库的情况下用纯 Java(最多 17 个)实现?

java executorservice runnable rate-limiting
© www.soinside.com 2019 - 2024. All rights reserved.