Android Spring 引导中的 CountDownTimer 替代项 (Java)

Android CountDownTimer alternative in Spring Boot (Java)

我有这种情况,我的传感器的数据每 5 分钟发送到我的服务器。服务器将接收到的数据存储在数据库中。现在,当服务器收到数据时,我想为这个特定传感器启动 6 分钟计时器。如果我在这 6 分钟之前收到数据,则必须取消并重新启动此计时器。如果计时器恰好结束,则必须调用 onFinish(),然后我将向用户发送有关传感器可能存在连接问题的通知。我有这个传感器列表和一个在服务器接收数据时调用的方法:

// list to save sensors and their timers
private val sensors: MutableMap<Long, CountDownTimer> = HashMap()

// this method gets called after server receives data from the sensor
// must keep in mind that CountDownTimer is undefined
fun initiateTimer(sensorId: Long) {
    sensors[sensorId] = object : CountDownTimer(360000, 1000) {
        fun onTick(duration: Long) {
            // Blank
        }

        fun onFinish() {
            // Send notification to user about possible connection issue
        }
    }.start()
}

我一直在研究 scheduleWithFixedDelay,但这需要 ExecutorService 具有特定的线程数。现在,如果我有数千个传感器并且我同时需要那一千个计时器怎么办?运行?

现在 Android,我可以简单地使用 CountDownTimer,但由于它不是 Android,我正在寻求使用 [=18 解决此问题的最佳方法的建议=] 在 Spring Boot 环境中(或者简单来说,不在 Android 环境中)。谢谢。

您发现的

ScheduledExecutorService 是未来安排任务的标准方式。您可以安排数千个计时器并使用单个线程执行所有计时器 - 没问题。

或者,如果您使用协程,则可以使用像 delay() or withTimeout().

这样的实用程序

此外,如果您真的打算拥有大量这样的计时器,那么实施和维护替代解决方案可能会更容易,我们只有一个“滴答”thread/coroutine 来检查所有传感器一次例如10 秒。它遍历所有传感器并检查上次接收数据的时间。当新数据到达时,我们只更新时间,但不需要取消和重启任何定时器。