文章
· 五月 31, 2023 阅读大约需 4 分钟

第二十一章 开发Productions - ObjectScript Productions - 延迟发送

第二十一章 开发Productions - ObjectScript Productions - 延迟发送

延迟发送

除了同步(等待)和异步(不等待)的直接选择之外,还可以使用称为延迟响应的机制在 IRIS 之外发送消息。

假设一个业务流程希望在 IRIS 之外调用一个动作。它向业务操作发送请求,业务操作执行调用并返回响应。业务流程是任何响应的预期接收者;业务操作只是请求发出和响应进来的方式。如果业务流程同步发出请求,或者如果它发出请求并请求异步响应,业务操作将中继回响应。下图总结了这种机制。

现在假设从业务流程接收请求的业务操作已被编写为使用延迟响应功能。原始发件人不知道响应将被业务操作延迟这一事实。延迟响应是业务运营开发人员做出的设计决策。如果业务操作确实延迟了响应,那么当原始发送者在延迟期结束时收到响应时,它不知道响应曾经被延迟过。

业务操作通过调用其 DeferResponse() 方法来生成表示原始发送者和原始请求的令牌来延迟响应。业务运营还必须找到一种方法将此令牌传达给外部实体,然后外部实体负责将此令牌包含在对 IRIS 的任何后续响应中。例如,如果外部目的地是电子邮件,业务操作可以在外发电子邮件的主题行中包含令牌字符串。接收此电子邮件的实体可以从请求主题行中提取此令牌,并在响应主题行中使用它。在下图中,项目 t 代表此令牌。

从业务操作延迟请求到原始发送者最终收到响应之间,请求消息的状态为 Deferred。原发送方收到相应响应后,请求消息状态由Deferred变为Completed

Productions中的任何业务主机都可以拾取响应请求的传入事件并将其返回给原始发送者。事件在 IRIS Productions中到达的确切位置取决于Productions的设计;通常,业务服务的任务是接收来自 IRIS 外部的传入事件。接收传入事件的业务主机还必须随事件一起接收延迟响应令牌。然后,业务主机调用其 SendDeferredResponse() 方法,根据传入的事件数据创建适当的响应消息,并将此响应定向到原始发件人。原始发件人在不知道响应如何返回的情况下收到响应。下图显示了一个请求及其延迟响应。

生成事件日志条目

事件日志是一个表,记录在给定名称空间中运行的生产中发生的事件。 Management Portal 提供了一个显示此日志的页面,它主要供系统管理员使用,但在开发过程中也很有用。 (有关此页面的详细信息,请参阅监控制作。)

事件日志的主要目的是提供诊断信息,在生产运行时出现问题时,这些信息对系统管理员很有用。

IRIS 自动生成事件日志条目,可以添加自己的条目。任何给定事件都是以下类型之一:断言、信息、警告、错误和状态。 (事件日志还可以包括警报消息和跟踪项,将在下一节中讨论。)

要生成事件日志条目:

  1. 确定要记录的事件。

并非所有类型的错误或活动都必须生成事件日志条目。必须选择要记录的事件、要使用的类型以及要记录的信息。例如,事件日志条目应在出现外部物理问题(如网络连接不良)时出现。

事件日志不应记录程序错误;这些应该在产品发布之前解决。

  1. 修改Productions的适用部分(通常是业务主机类)以在 ObjectScript 中生成事件日志条目,如以下小节所述。

重要提示:如果需要主动通知用户某些情况或事件,请使用警报,这将在下一节和定义警报处理器中讨论。

ObjectScript 中生成事件日志条目

在业务主机类或产品使用的其他代码中,可以在 ObjectScript 中生成事件日志条目。为此,请使用以下任一宏。这些宏在 Ensemble.inc 包含文件中定义,该文件自动包含在 IRIS 系统类中:

Macro Details
$$$LOGINFO(message) 写入 Info 类型的条目。在本表的此处和后面的内容中,消息是字符串文字或计算结果为字符串的 ObjectScript 表达式。
$$$LOGERROR(message) 写入错误类型的条目。
$$$LOGWARNING(message) 写入警告类型的条目。
$$$LOGSTATUS(status_code) 根据给定的 status_code 的值,写入一个 ErrorInfo 类型的条目,它必须是 %Status 的一个实例。
$$$ASSERT(condition) 如果参数为 false,则写入一个 Assert 类型的条目。 condition 是一个 ObjectScript 表达式,计算结果为 truefalse
$$$LOGASSERT(condition) 为参数的任何值写入一个 Assert 类型的条目。 condition 是一个 ObjectScript 表达式,计算结果为 truefalse

下面显示了一个示例,其中包含将静态文本与类属性值组合在一起的表达式:

 $$$LOGERROR("Awaiting connect on port "_..Port_" with timeout "_..CallInterval)

以下示例使用 ObjectScript 函数:

 $$$LOGINFO("Got data chunk, size="_$length(data)_"/"_tChunkSize)
讨论 (0)1
登录或注册以继续