【发布时间】:2021-03-23 12:05:38
【问题描述】:
我正在开展一个项目,我们正在创建一个每周运行的拍卖网站。计划在周一开始所有拍卖,并在周五结束。
到目前为止,我发现我需要一个保存开始日期和结束日期的数据库,这样我就可以检查剩下多少时间等等。但是我需要能够不断地检查时间是否到了,我不知道如何进行。这样做的正确方法是什么?
我们使用 Java8 和 Spring 并作为前端做出反应。
【问题讨论】:
标签: java spring-boot
我正在开展一个项目,我们正在创建一个每周运行的拍卖网站。计划在周一开始所有拍卖,并在周五结束。
到目前为止,我发现我需要一个保存开始日期和结束日期的数据库,这样我就可以检查剩下多少时间等等。但是我需要能够不断地检查时间是否到了,我不知道如何进行。这样做的正确方法是什么?
我们使用 Java8 和 Spring 并作为前端做出反应。
【问题讨论】:
标签: java spring-boot
两种解决方案:
【讨论】:
这里有 3 层:
现在您需要弄清楚如何在这些层之间传播数据。
可以使用轮询或 websocket 来完成从后端到前端的传播。
可以使用轮询或数据库触发器来完成从数据库到后端的传播。
我个人会通过 websockets 将 React 与 Spring App 连接起来。然后我会有一些后台任务轮询数据库并将发现的更改推送到连接的 websocket 客户端。
这是 Springs 自己的 websockets 教程https://spring.io/guides/gs/messaging-stomp-websocket/
【讨论】:
我认为您正在寻找一个拉模型。基本上,您的 Java 应用程序需要以特定的时间间隔从数据库中提取结束日期。您可以为此编写一个 cron 作业。Quartz cron 是目前流行的基于 Java 的框架之一http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html。它也处理分布式系统。因此,如果您的应用程序有多个实例,Quartz 可以为您解决。
拉模型的另一个变体,您可以在 JVM 本地缓存或其他一些缓存(Redis、Memcache)中读取带有结束日期的条目并在其上运行 cron。但是你必须保持与数据库的缓存一致性。
您选择哪一个取决于您的业务用例(结束日期更改的频率、您需要检查结束日期的频率等)。
其他选择是推模式。但是对于这种情况,推送模型不适用于传统数据库。
【讨论】:
可能的选择 - 扩展org.springframework.web.servlet.handler.HandlerInterceptorAdapter
并在此类中根据您的时间范围编写检查当前时间的逻辑 - 如果检查失败则抛出异常。
潜在的优化 - 从数据库缓存值(至少一段时间,例如 - 15 分钟 - 因为这将有助于减少对数据库的实际调用次数。
【讨论】: