Vertx 定时器更改延迟

Posted

技术标签:

【中文标题】Vertx 定时器更改延迟【英文标题】:Vertx timer change delay 【发布时间】:2021-12-20 16:36:12 【问题描述】:

需要定时器方面的帮助:) 我需要在 vertx 中创建一个重复的计时器,延迟会发生变化。

参数延迟值 - 保存在我的数据库中。 假设我们从 10 秒开始。

当我每 10 秒运行一次处理程序时,我正在检查我的数据库。

如果值-延迟发生变化,我想更新延迟计时器

你知道如何编写一个改变延迟的计时器吗?

public void initTimer()

    long delayFromDB = getDelayFromDB(); 
    setPeriodicTimer(delayFromDB); 

public long setPeriodicTimer(long delayFromDB)

long timerID = vertx.setPeriodic(delayFromDB, new Handler<Long>() 
  @Override
  public void handle(Long timerID) 
    long currDelayFromDB = getDelayFromDB(); 
    doSomeOperation();
    newDelayFromDB = getDelayFromDB(); 

    if(currDelayFromDB != newDelayFromDB ) 
      restartTimerWithNewDelay(newDelayFromDB , timerID);
    
  
);
return timerID;

public void restartRefreshTimerWithNewTtl(long newDelayFromDB , Long timerID)

  //cancel last timer: timerID and  restart timer with the new delay    
  vertx.cancelTimer(timerID);
  setPeriodicTimer(newDelayFromDB );

是否可以取消计时器并立即从将要取消的计时器的句柄中创建另一个计时器。像这里?(在这个函数restartRefreshTimerWithNewTtl)

【问题讨论】:

【参考方案1】:

您的方法有效。另一种方法是不使用setPeriodic,而只是使用常规计时器并每次都重新启动计时器。所以而不是:

if(currDelayFromDB != newDelayFromDB ) 
      restartTimerWithNewDelay(newDelayFromDB , timerID);

你会做这样的事情:

vertx.setTimer(newDelayFromDB , task);

【讨论】:

谢谢 :) 我忘了补充一点,延迟不会经常变化,所以每次使用 setTimer 再次创建时效率会降低? 你知道从被取消函数的句柄中取消定时器并在之后创建另一个定时器吗? 是的,您可以在计时器处理程序中取消计时器(下一次调用)。这是可行的,因为它们都在同一个事件循环(线程)上运行。

以上是关于Vertx 定时器更改延迟的主要内容,如果未能解决你的问题,请参考以下文章

计时器不会造成延迟

使用 Juggernaut 同步客户端计时器时处理延迟

启用外设定时器和定时器实际开始计数之间是不是有延迟?这是啥延迟,是啥原因造成的?

定时器触发 Tick 事件,延迟 15 毫秒

JMeter定时器设置延迟与同步

JavaScript 之 定时器 延迟器