使用Hyperlambda和重试的预定任务

160 阅读4分钟

用Hyperlambda和Retry来调度任务

调度任务意味着按照一定的时间间隔重复执行一些代码。添加重试,意味着重复执行直到成功。

计划任务意味着按照一定的时间间隔重复执行一些代码。添加重试意味着重试执行,直到成功。用Hyperlambda创建计划任务是非常容易的。确保你的任务使用重试逻辑执行要稍微复杂一些,但是一旦你理解了事情的流程,并且学会了一些基本的Hyperlambda,这就很容易了。为了理解我们的代码,我们需要先分析一下Hyperlambda的一些核心槽。

Hyperlambda是异步到骨子里的

上面的内容意味着Hyperlambda在等待任务的时候会消耗极少量的操作系统资源。如果你调用**[http.get]从另一个服务器获取一些数据,你的Hyperlambda被安排运行的线程实际上被暂停并释放回操作系统。这允许你的操作系统为不同的任务"重用 "线程,从而使你的应用程序作为一个整体可以接受更多吞吐量。因此,你的应用程序的扩展性要好得多。

所有与线程有关的槽也都是异步的。这意味着如果你调用**[sleep]**,线程就会在Hyperlambda的等待中被释放。

Hyperlambda任务调度器

现在可能需要一些关于Hyperlambda任务调度器的额外理论。这有助于你理解它的可扩展性特征。很多任务调度器会消耗你的服务器的资源,直到你什么都没有了。Hyperlambda的任务调度器不是这样操作的。首先,它使用一个信号来确保最多有8个任务同时执行。如果第9个任务试图执行,它需要等待其他任务中的一个完成,然后再给它CPU时间。这可以防止你的操作系统被并行执行的计划任务*"淹没"*。

此外,在一个重复的任务执行完毕之前,它绝不会重新安排该任务。因此,从字面上看,不可能创建一个经常重复的任务,足以淹没你的信号灯,导致堆栈溢出或内存不足的异常。创建*"坏代码"*,以某种方式耗尽你的服务器,还是有可能的,但这实际上是非常困难的,而且几乎需要你作为一个软件开发者的有意识的选择。

代码

现在我们了解了Hyperlambda的任务调度器的内部结构,是时候写一些代码了。

纯文本

.no:int:5
while
   mt
      get-value:x:@.no
      .:int:0
   .lambda
      try

         // Do stuff here ...
         // If exception, task will "retry" 5 times.

         // Task succeeded, "breaking" while loop!
         set-value:x:@.no
            .:int:0

      .catch

         // Task failed, retrying 5 times.
         log.error:Task failed ...
         sleep:1000
         math.increment:x:@.no

      // Task is finished, [while] loop will now abort.

上面的代码将在你的**[try]**块中执行任务,如果没有成功,它将在放弃之前重试5次。将上述代码复制并粘贴到计划任务中,如图所示。

在这一点上,我们需要做的是安排或任务。这可以通过点击你的任务右下角的时钟图标并选择一个重复模式来完成。

上述安排你的任务以5天的间隔执行。从*"每月1日 ""每周二和周四"*,各种重复模式都有。以下是创建重复任务的基本构建模块。

单位重复

这种重复的形式是:n.unitn 是一个数字,单位可以是以下任何数值。

  • 分钟
  • 小时

创建一个模式,比如说5.weeks ,意味着你的任务将执行一次,然后等待5周后再执行。

平日重复

这种模式类似于以下内容;ww.HH.mm.ss 。各部分按出现顺序暗示如下。

  • 平日
  • 小时
  • 分钟

周日部分可以将多个工作日连在一起,允许你使用以下模式Tuesday|Thursday.23.55.00 ,在每周二和周四午夜5分钟前执行你的任务。周日可以有一个双星号作为其值,意味着*"每个工作日"*。这允许你声明一个模式,如以下**.05.00.00 ,在每天早上5点执行任务。

每月重复执行

这种模式如下:MM.dd.HH.mm.ss ,实体按出现的顺序暗示如下:

  • 月份
  • 月的一天
  • 小时
  • 分钟
  • 秒数

要创建一个只在2月5日早上7点执行的任务,你可以使用如下值:02.05.07.00.00 。一个月可以像上面的工作日一样用管道连接,允许你提供多个月份,如:01|02|03.05.07.00.00 。最后一个模式是在早上7点执行1月、2月和3月的5号。

上述两个重复模式中的MM、dd和WW值可以有** ,因为它们的值意味着*"所有值"*。

向我们寻求帮助

创建这篇文章是因为我们的一个合作伙伴有一个特定的用例需要*"杭火功能"*。我没有直接向他解释,而是选择写一篇文章,在文章中我解决了他的用例。如果你有一些与Hyperlambda或Magic相关的问题,请告诉我们,我们会帮助你的 :)