我有一个来自不同客户端的 API 列表保存在我的数据库表中,并且所有 API 都有不同的时间间隔来调用 API。我调用 API 的方法应该是什么。新数据可能会添加到 API 列表列表中。我应该选择动态计时器吗?
- 我有一个客户端用来添加新记录的应用程序 (GUI)。
- 这些记录表示 API url 和应该调用该 API 的时间(计划)。
- 您的挑战是编写能够在指定的时间表/时间调用所有客户端指定的 API 的代码。
我有一个来自不同客户端的 API 列表保存在我的数据库表中,并且所有 API 都有不同的时间间隔来调用 API。我调用 API 的方法应该是什么。新数据可能会添加到 API 列表列表中。我应该选择动态计时器吗?
有多种调度程序可用于自动执行此操作。例如,您可以使用Quartz.NET及其AdoJobStore
. 我自己没有使用过,但听起来很合适:
通过使用包含的 AdoJobStore,所有配置为“非易失性”的作业和触发器都通过 ADO.NET 存储在关系数据库中。
或者,您的数据库可能内置了计时器。但是,如果这主要是一项学术练习(如“您的挑战”所建议的那样),您可能无法使用这些。
我会保留一个计划任务表,其中列指定:
然后,您可以在无限循环中编写代码以仅扫描该表,例如每分钟一次。它应该寻找比现在更早的“下一次”尚未完成的所有任务:
当任务成功完成时,更新该行以指示它已完成,并在下次启动时添加另一行。
你需要弄清楚你的错误策略是什么:
为了获得额外的可靠性,您还需要考虑其他方面:
您可能不需要在此处实际实现所有内容,但值得考虑它们。
对我来说 - API 调用和处理响应(存储到数据库等)应该是一个组件。并且,安排何时调用哪个 API - 应该是其他组件(类似于 cron 作业)。这样 - 当时间合适时,将触发适当的 API 调用。这也使您可以灵活地在一天内进行多次尝试/重试等。
评论后更新:
如果我解决了这个问题 - 我最初的建议是有效的。
组件 1 - 调度程序 使用 Quartz.net(或使用 Timer 等创建您自己的) - 并创建一个服务(例如 WCF)或进程,它将从数据库中读取记录并识别所有调度和需要调用的 API url。当预定时间发生时,Quartz.net 将触发您的处理程序方法 - 您将在其中调用组件 2 并传递 API url。
组件 2 - API 引擎 当它收到来自组件 1 的调用时 - 它会进行 API 调用并获取响应。根据需要存储/处理它。