如果将所有任务放在
ScheduledExecutorService
上,但是如果服务器关闭或服务器获取更新并重新启动,我分配给线程的任务将丢失,有什么解决方案吗
如何保存我已经放入的数据
ScheduledExecutorService
。
Java 提供的
ScheduledExecutorService
的实现仅在内存中记住其提交的任务。
当你的应用程序退出时,所有已提交和正在执行但未完成的任务都会消失,噗💨。或者更糟糕的是,如果您没有优雅地关闭它们,支持线程池的线程可能会无限期地继续下去,就像僵尸一样🧟u200d♂️。
如果您需要跟踪任何未完成或等待执行的剩余任务,请使用其他工具,或自行管理跟踪。
追踪自己并不困难。这是一个解决方案......
当您提交任务时,您会将其标识符记录在数据库中。作为任务工作的最后一步,任务将删除或修改与其自身标识符匹配的数据库记录。
启动时,您的应用程序将查询数据库以查找尚未完成的任务。然后重新创建这些任务对象,并提交给新的
ScheduledExecutorService
。
在这种情况下,强大的数据库引擎(例如 H2 或 Postgres)可以应对并发挑战,以及面对崩溃或断电等中断时的弹性挑战。
我想您可以编写自己的
ScheduledExecutorService
实现来处理这种持久的任务跟踪。但我不知道我是否会打扰。