首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何对新建数据进行任务调度?

如何对新建数据进行任务调度?
EN

Stack Overflow用户
提问于 2017-08-16 02:43:13
回答 1查看 195关注 0票数 0

在我系统中,用户可以创建具有时间和条件的计划。在计划时间的30分钟之前,如果条件不满足,系统将发出警报,通知用户。

我的系统是spring boot应用程序,并使用spring计划任务来触发警报。问题是,当用户在将来创建大量计划时,如果我为每个计划数据创建一个计划任务,就会出现内存问题。

我目前的解决方案是创建一个在每天的时间运行的计划,以扫描未来24小时内的所有数据,并为它们创建计划任务以触发警报。这将减少创建的计划任务,但如果用户在扫描后的24小时内创建新的计划数据,该数据将不会触发任何警报。

那么我该怎么做呢?

EN

回答 1

Stack Overflow用户

发布于 2017-08-16 03:25:48

您将所有这些都安排在JVM内存中有什么原因吗?如果JVM崩溃(或者只是重启),计时器就会丢失,就好像用户从未计划过任何警报一样。正如您所提到的,为每个请求创建一个计时器可能不是一个可伸缩的解决方案。

在不知道系统具体细节的情况下,最常见的方法是持久化(即在DB、平面文件等中)用户每次请求安排事件时的数据。这样,在发生崩溃或重启的情况下,您不会丢失事件。同样,如果需要,此方法可以扩展到多个服务器。然后,以您支持的任何粒度(即分钟、小时、天等)将有一个进程或线程(只有一个监视器线程)查找自上次运行以来已过期的所有事件。最后,一旦这个线程识别出需要“警报”的事件,这个线程就可以控制发送这些事件进行主动处理。该线程可以单独处理每个事件,也可以将它们提交给活动的工作队列进行并行处理。

更具体地说,如果您有随时可能发生的警报,您应该安排一个监视器线程每分钟运行一次。此线程应找到需要报警的所有事件,然后实际发送该报警。

请记住,您应该调度监视器线程的频率取决于您想要的警报分辨率和您对延迟警报的容忍度。如果延迟报警是完全不可接受的,那么您的监视器必须至少以最细的粒度运行,以调度报警事件。当然,这是假设警报总是安排在将来--否则,您可能希望将监视检查的频率提高一倍。要了解原因,请考虑以下示例:

代码语言:javascript
运行
复制
minute 0: Run monitor
minute 0: User schedules alarm for minute 0
minute 1: Run monitor

如果我们每分钟运行一次监视器,但允许用户在当前分钟安排一个警报,我们很可能会错过事件(如上面的示例所示)。如果有必要,我可以更深入地探讨这一点,但这里主要是为了完整性,因为从您的描述中我没有迹象表明这实际上会带来任何问题。

祝好运。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45699421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档