对于一个学校项目,我必须计算购物袋的“hotItem”(这是那个月最受欢迎的商品)。但是我不知道如何在每个月的第一天调用这个方法(getHotItem)。我已经做了一些研究,并发现了关于Timer和ScheduleExpressions的知识,但据我了解,它主要用于固定的时间间隔(而不是30或31天的月份)。
是否有一种方法可以在将来的某个特定日期(每月1次)调用此方法?
谢谢
发布于 2014-11-17 09:15:37
避免Servlets中的Timer
类
如果在web应用程序环境中运行,那么而不是使用计时器类。搜索StackOverflow来了解原因。
ScheduleExpression
根据Oracle教程的说法,ScheduleExpression可以设置为最初的几个月。看起来这个类需要一个EJB容器。EJB对包括我和我的工作在内的许多人来说都是过分的浪费,所以我不熟悉这个类。
ScheduledExecutorService
另一种没有完整EJB和Java的方法是类/接口的执行器系列。见教程。特别是看看ScheduledExecutorService。
我会安排它每天,让任务检查的当前日期。如果不是这个月的第一天,什么也不做,这个任务就完成了。明天,一项新任务将再次检查日期,以此类推。
一定要阅读文档并搜索StackOverflow以了解更多内容。一个诀窍是,您的计划代码不能抛出任何异常,否则ScheduledExecutorService将静默停止。所以在你的代码周围放一个尝试捕捉。
对于web应用程序环境( Servlets或Java或完整Java ),使用ServletContextListener在运行时检测Web应用程序启动时的情况,因此启动ScheduledExecutorService。同样,你也可以关机。同样,搜索StackOverflow,因为这之前已经讨论过了。
支票日报
你可以试着计算到下个月的第一个月的时间,但为什么要费心呢?快速检查今天的日期对您的服务器几乎没有任何影响,使您的代码更简单,并避免由于您的错误计算而可能出现的错误。这是对现实世界的建议,也许你的家庭作业的目标是计算日期。
另一个真实的提示:避免java.util.Date/..Calendar类,因为它们是众所周知的麻烦、混乱和缺陷。相反,可以使用Joda-Time库或者内置到Java8中的java.time包(灵感来自于Joda-Time)。
https://stackoverflow.com/questions/26976386
复制相似问题