上一主题: 在业务逻辑内

下一主题: 注册

事件流

如前所述,业务逻辑的输入是引擎事件和原始数据事件。

业务逻辑接收的原始数据事件由注册函数决定,该函数中的代码会请求由其事件类型和资源标识符定义的一组特定原始数据事件。

在业务逻辑中,注册还关联了已执行的用户定义的子例程,以便在接收原始数据事件时对其进行处理。 (默认情况下,它是 OnXXXEvent,应将其重命名为更有意义的名称。)

引擎事件由引擎根据关联的合同和度量标准定义来触发。 一旦触发并接收引擎事件,引擎将执行相关的事件处理程序。 每个引擎事件都有一个隐式事件处理程序。 这些事件处理程序是基于 VBScript 定义的函数和过程。 处理注册的事件处理程序和“结果”函数都是在代码中实施时必需的。 所有其他事件处理程序都是可选的。 但是,业务逻辑不处理未实施事件处理程序的引擎事件。 因此,最好将其全部准备就绪(即使未使用),以允许将来增强功能。

注意:在编写业务逻辑脚本时,实施所有引擎事件以便能够涵盖所有最终的可能性,这是非常重要的。 例如,即使在实施的第一阶段,时间段定义不适用,但将来所有公式将需要修改。 因此,建议业务逻辑专家提前定义“时间段内”和“时间段外”行为,即使最初不适用,但当引入该行为时,只需对系统进行少量更改。

以下是各种引擎事件及其事件处理程序:

事件流

以下是为了处理单个业务逻辑公式,计算机制(PslWriter 服务)需要执行的步骤:

在每个计算周期期间,引擎将评估计算时间段基于哪些相关的引擎事件和原始数据事件。 它先按时间对其排序,然后将其发送给相关公式进行计算。 原始数据事件的时间是其时间戳,引擎事件的时间是其触发时间。 然后,将这两种类型的事件组合在一个时间序列中,并发送以供计算。

事件的时间基于关联的本地度量标准,但事件处理程序的 Time 参数(即 OnPeriodStart (Time))和原始数据事件的时间戳基于其 UTC 值。 引擎根据其 UTC 值对其进行比较,以使用不变的参考点。

示例

如果度量标准与 UTC 的时区差异是两小时(即 GMT+2),并且突发事件开始时间的时间戳为上午 10:00,那么在引擎中,事件处理程序将使用的时间戳实际会进行相应转换,在 UTC 上午 8:00 真正开始。 假定适配器配置为使用同一时区,那么原始数据事件也将在数据库中转换回 UTC 2 个小时。 在将事件传递给业务逻辑时,负责为从上午 10:00 开始的期间计算事件的计算代理将实际对事件使用 UTC 时间,即从上午 8:00 开始。 但是,如果在代码中使用 out.log 消息来打印时间戳,则会显示转换为 UTC 的时间戳,因此将显示上午 8:00,尽管指定的期间为上午 10 点(根据度量标准)。

在下面的计算要求中,在使用事件的时间戳之前对其进行转换非常重要:

如果度量标准要计算在同一天打开和关闭的突发事件数,则需要比较每个突发事件的开始和结束时间。 如果突发事件的开始和结束时间在同一天(并在定义的时间段内),将计算该突发事件。

在突发事件从其原始本地时间转换为 UTC 的过程中,可能会出现天更改的情况。(即 再次使用 GMT+2)。 在凌晨 1 点打开的突发事件将转换回 UTC 时间前一天的晚上 11 点。那么即使本应计算该突发事件,也不会将其计算在内。 在此情况下,必须先将时间转换回本地度量标准时间,然后才能进行比较。 对于此类情况,请使用 GetLocaleTime(utcTime) 方法。 此方法可将以 UTC 时区给定的时间转换为本地度量标准的时区。

以下是事件处理程序代码:
Sub OnIncidentEvent(eventDetails)
   If dateDiff("d",Tools.GetLocaleTime(eventDetails.time),_
     Tools.GetLocaleTime(eventDetails("ClosedAt)))=0 then
          CountIncidents=CountIncidents+1
   End If
End Sub