对于一个学校项目,我必须计算一个热门项目'一个购物袋(这是当月最受欢迎的项目)。 但我不知道如何在每个月的第一天调用方法(getHotItem)。 我已经做了一些研究,发现了Timer和ScheduleExpressions,但据我所知,它主要用于固定的时间间隔(30或31天的月份不是这样)
有没有办法在将来的某个特定日期(每月的第1天)调用此方法?
谢谢
答案 0 :(得分:0)
Timer
类如果在网络应用环境中运行,请不使用Timer类。搜索StackOverflow以了解原因。
ScheduleExpression
根据Oracle Tutorial,可以在第一个月设置ScheduleExpression。看起来该类需要EJB容器。对于包括我和我的工作在内的许多人而言,EJB是过度的,所以我对这门课程并不熟悉。
ScheduledExecutorService
没有完整EJB和Java EE的另一个路由是Executor类/接口系列。请参阅Tutorial。特别要看ScheduledExecutorService。
我会每天安排它,让任务检查当前日期。如果不是本月的第一天,则不执行任何操作并完成该任务。明天,新任务将再次检查日期,依此类推。
请务必阅读文档并搜索该类的StackOverflow以了解更多信息。一个技巧是您的预定代码不能抛出任何异常,否则ScheduledExecutorService会静默停止。所以在你的代码周围放一个try-catch。
对于Web应用程序环境(仅限Servlet,或Java EE Web Profile或完整Java EE),使用ServletContextListener在运行时检测Web应用程序启动时,从而启动ScheduledExecutorService。同样,你可以关机。再次,搜索StackOverflow,因为之前已经介绍过。
您可以尝试计算下一个月初的时间量,但为什么要这么麻烦?快速检查今天的日期对您的服务器几乎没有任何影响,并使您的代码更简单,并避免由于您的计算错误而导致的错误。这是对现实世界的建议;也许你的作业的目标是计算日期。
另一个现实世界的提示:避免使用java.util.Date/.Calendar类,因为它们非常麻烦,令人困惑和有缺陷。而是使用Joda-Time库或Java 8中内置的java.time包(受Joda-Time启发)。