使用不同的间隔时间调用不同的API,保存在我的数据库表中

时间:2018-04-02 08:53:52

标签: c# .net api system.timers.timer

我有一个来自不同客户端的API列表保存在我的数据库表中,并且所有API都有不同的时间间隔来调用API。我应该怎样调用API。可以在API表列表中添加新数据。我应该选择动态定时器吗?

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

2 个答案:

答案 0 :(得分:0)

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

评论后更新:

  1. 您有一个应用程序(GUI),客户端用它来添加新记录。
  2. 这些记录代表API网址和应该调用该API的时间(计划)。
  3. 您的挑战是编写能够在指定的时间/时间调用所有客户指定API的代码。
  4. 如果我有正确的问题 - 我的原始建议就是。

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

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

答案 1 :(得分:0)

可以使用各种调度程序自动执行此操作。例如,您可以使用Quartz.NET及其AdoJobStore。我自己还没有用过它,但sounds appropriate

  

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

或者,您的数据库可能内置了计时器。但是,如果这主要是学术练习(正如#34;您的挑战所提示的那样),您可能无法使用这些练习。

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

  • 下次运行任务时
  • 任务应该做什么
  • 之后如何计算该任务的下一次迭代
  • 如果任务已经启动,则启动时
  • 如果任务完成,完成时

然后,您可以在无限循环中编写代码,只扫描该表,例如每分钟一次。它应该使用"下一次"来查找所有任务。早于现在尚未完成:

  • 如果任务尚未启动,请更新该行以显示已启动(现在),并开始执行任务
  • 如果最近启动了任务,请忽略它
  • 如果任务已经开始"很久以前" (即比成功运行所需的时间更长),要么将其标记为“#34;已损坏"某种程度上,或重新启动

任务成功完成后,更新行以表明它已完成,并在下次启动时添加另一行。

您需要确切了解您的错误策略:

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

为了提高可靠性,您还需要考虑其他方面:

  • 您需要多个任务选手吗?
  • 如何在任务运行器发生故障时发现并重新启动它?
  • 你如何处理试图同时启动同一任务的多个任务运行者?

你可能不需要在这里实际实现所有内容,但值得考虑它们。