0

我有一个来自不同客户端的 API 列表保存在我的数据库表中,并且所有 API 都有不同的时间间隔来调用 API。我调用 API 的方法应该是什么。新数据可能会添加到 API 列表列表中。我应该选择动态计时器吗?

  1. 我有一个客户端用来添加新记录的应用程序 (GUI)。
  2. 这些记录表示 API url 和应该调用该 API 的时间(计划)。
  3. 您的挑战是编写能够在指定的时间表/时间调用所有客户端指定的 API 的代码。
4

2 回答 2

0

有多种调度程序可用于自动执行此操作。例如,您可以使用Quartz.NET及其AdoJobStore. 我自己没有使用过,但听起来很合适

通过使用包含的 AdoJobStore,所有配置为“非易失性”的作业和触发器都通过 ADO.NET 存储在关系数据库中。

或者,您的数据库可能内置了计时器。但是,如果这主要是一项学术练习(如“您的挑战”所建议的那样),您可能无法使用这些。

我会保留一个计划任务表,其中列指定:

  • 下次应该运行任务的时间
  • 任务应该做什么
  • 之后如何制定该任务的下一次迭代
  • 如果任务已经开始,它是什么时候开始的
  • 如果任务完成,什么时候完成

然后,您可以在无限循环中编写代码以仅扫描该表,例如每分钟一次。它应该寻找比现在更早的“下一次”尚未完成的所有任务:

  • 如果任务尚未启动,则更新该行以显示它启动(现在),并开始执行任务
  • 如果任务是最近开始的,忽略它
  • 如果任务是“很久以前”启动的(即比成功运行所需的时间长),要么以某种方式将其标记为“已损坏”,要么重新启动

当任务成功完成时,更新该行以指示它已完成,并在下次启动时添加另一行。

你需要弄清楚你的错误策略是什么:

  • 任务开始和您决定它失败之间的间隔应该是多长时间?
  • 您是否总是想重新启动任务,或者某些故障应该是永久性的?
  • 您是否需要记录任务失败的频率,并在尝试一定次数后放弃?
  • 如果您在执行任务时明确注意到任务失败,您会怎么做?(而不仅仅是因为它是很久以前开始的。)

为了获得额外的可靠性,您还需要考虑其他方面:

  • 您需要多个任务运行器吗?
  • 您如何发现任务运行程序失败并重新启动它?
  • 你如何处理多个任务运行者试图同时启动同一个任务?

您可能不需要在此处实际实现所有内容,但值得考虑它们。

于 2018-04-02T09:36:15.813 回答
0

对我来说 - API 调用和处理响应(存储到数据库等)应该是一个组件。并且,安排何时调用哪个 API - 应该是其他组件(类似于 cron 作业)。这样 - 当时间合适时,将触发适当的 API 调用。这也使您可以灵活地在一天内进行多次尝试/重试等。

评论后更新:

  1. 您有一个应用程序 (GUI),客户端使用它来添加新记录。
  2. 这些记录表示 API url 和应该调用该 API 的时间(计划)。
  3. 您的挑战是编写能够在指定的时间表/时间调用所有客户端指定的 API 的代码。

如果我解决了这个问题 - 我最初的建议是有效的。

组件 1 - 调度程序 使用 Quartz.net(或使用 Timer 等创建您自己的) - 并创建一个服务(例如 WCF)或进程,它将从数据库中读取记录并识别所有调度和需要调用的 API url。当预定时间发生时,Quartz.net 将触发您的处理程序方法 - 您将在其中调用组件 2 并传递 API url。

组件 2 - API 引擎 当它收到来自组件 1 的调用时 - 它会进行 API 调用并获取响应。根据需要存储/处理它。

于 2018-04-02T09:01:09.473 回答