【问题标题】:Vertx timer change delayVertx 定时器更改延迟
【发布时间】: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)

【问题讨论】:

    标签: timer delay vert.x


    【解决方案1】:

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

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

    你会做这样的事情:

    vertx.setTimer(newDelayFromDB , task);
    

    【讨论】:

    • 谢谢 :) 我忘了补充一点,延迟不会经常变化,所以每次使用 setTimer 再次创建时效率会降低?
    • 你知道从被取消函数的句柄中取消定时器并在之后创建另一个定时器吗?
    • 是的,您可以在计时器处理程序中取消计时器(下一次调用)。这是可行的,因为它们都在同一个事件循环(线程)上运行。
    猜你喜欢
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 2016-05-09
    • 2018-04-06
    • 2012-08-30
    • 1970-01-01
    相关资源
    最近更新 更多