文章 姚 鑫 · 七月 19, 2023 2m read

第六十三章 开发Productions - ObjectScript Productions - 部署Production - 在目标系统上部署Production

管理门户自动执行将Productions从开发系统部署到实时系统的过程。本节介绍当在实时系统上加载Productions的新版本时,IRIS 会执行哪些操作。

获得部署包 XML 文件后,可以将其加载到目标系统上。在管理门户中,选择正确的命名空间并单击互操作性、管理、部署更改、部署,然后单击打开部署或打开本地部署按钮,具体取决于 XML 部署包位于服务器上还是本地计算机上。如果位于服务器计算机上,则“打开本地部署”按钮不处于活动状态。选择 XML 部署包文件后,表单会列出部署包中的新项和更改项,显示创建包时指定的部署说明,并允许指定以下部署设置:

  • 目标Production —指定将添加组件的Production。如果部署包包含来自源ProductionProduction类,则目标Production将设置为源Production且无法更改。否则, IRIS 将默认Production设置为当前打开的Production,但允许更改它。
  • 回滚文件—指定包含回滚信息的文件。回滚文件包含由部署替换的所有组件的当前定义。
  • 部署日志文件—包含由部署引起的更改的日志。
0
0 163
文章 姚 鑫 · 七月 18, 2023 4m read

第六十二章 开发Productions - ObjectScript Productions - 部署Production - 导出Production

导出Production

要使用管理门户导出ProductionXML,请打开Production,单击Production设置和操作选项卡,然后单击导出按钮。 IRIS 选择所有业务服务、业务流程、业务操作和一些相关类,然后显示以下表单以允许添加导出注释和其他组件。

还可以导出业务服务、流程或操作,方法是在Productions配置中选择组件,然后单击“操作”选项卡上的“导出”按钮。在这两种情况下,都可以通过单击其中一个按钮并选择一个组件来将其他组件添加到包中。以通过清除该复选框来从包中删除组件。

可以使用导出注释来描述部署包中的内容。例如,可以描述完整的Productions是否位于作为Productions更新的包或组件集中。当使用管理门户将包部署到目标系统时,会显示导出注释。

当导出部署包时,应该做出的第一个决定是目标系统是否具有旧版本的Productions

如果将Productions部署为新安装,应该:

  • 包括Production类的定义。
  • 包括Production设置。
  • 包括Production中使用的所有组件的定义。
  • 排除每个组件的Production设置(ptd 文件)。这将重复Production类中的定义。
0
0 155
文章 姚 鑫 · 七月 17, 2023 3m read

第六十一章 开发Productions - ObjectScript Productions - 部署Production

部署Production

通常,在开发系统上开发Production,然后在测试部署上完成并测试生产后,将其部署在实时生产系统上。本页介绍如何使用管理门户打包开发系统中的部署,然后将其部署到另一个系统上。它还描述了如何开发和测试对生产的更改,然后将这些更新部署到使用实时业务数据运行的系统。

部署Production概述

可以使用管理门户或 IDE 来部署Production。管理门户会自动执行一些需要使用 IDE 手动执行的步骤。如果有正在使用的实时Production,并且正在开发该Production的更新,则需要确保在不中断业务数据处理的情况下更新实时Production。在最简单的层面上,部署Production是通过从一个系统导出ProductionXML 定义并在目标系统上导入和编译 XML 来完成的。从开发到上线系统的成功部署最重要的问题是:

  • 确保 XML 部署文件具有所有必需的组件。
  • 在将部署文件部署到实时系统之前,先在测试系统上测试部署文件。
  • 确保部署文件加载到目标系统上而不中断实时Production

通常,将Production部署到实时系统是一个迭代过程,包括以下步骤:

  1. 从开发系统导出Production
  2. 在测试系统上部署部署文件。
0
0 108
文章 姚 鑫 · 七月 16, 2023 13m read

一篇文章了解IRIS/Caché编码方案

一直以来,编码问题像幽灵一般,不少开发人员都受过它的困扰。

试想你请求一个数据,却得到一堆乱码,丈二和尚摸不着头脑。有同事质疑你的数据是乱码,虽然你很确定传了UTF-8 ,却也无法自证清白,更别说帮同事 debug 了。

有时,靠着百度和一手瞎调的手艺,乱码也能解决。尽管如此,还是很羡慕那些骨灰级程序员。为什么他们每次都能犀利地指出问题,并快速修复呢?原因在于,他们早就把编码问题背后的各种来龙去脉搞清楚了。

ASCII

标准ASCII 码,使用7 位二进制数(最高位为0)来表示所有的大写和小写字母,数字09、半角标点符号,以及在英语中使用的特殊控制符号。

最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母a的编码是97,小写字母z的编码是122

IRIS/Caché中获取字符ASCII码与二进制字符串,如下代码示例:

USER>w $a("a")
97
USER>w ##class(M.Code).LogicalToDisplay(97)
10000110

经过如下二进制转十进制计算可得出 1+32+64 = 97

2**0 + 2**5 + 2**6 = 97

Unicode

GB2312GBKGB18030 都是中文编码字符集。

0
0 563
文章 姚 鑫 · 七月 16, 2023 2m read

第六十章 开发Productions - ObjectScript Productions - 从管理门户进行测试 - 调试Production代码

调试Production代码

调试的第一步是启用跟踪,如监控生产中所述。如果这没有揭示问题,可以使用调试器单步调试代码,如下所示:

  1. IDE 中编辑代码以在要开始调试的位置插入 BREAK 命令。
  2. 为使用要调试的类的业务主机启用前台设置。
  3. 开始Production。在步骤 2 中标记的作业在终端的前台运行。
  4. 当到达该 BREAK 命令时,终端将进入调试模式,可以单步调试代码。

启用 %ETN 日志记录

事件日志自动包含有关系统级异常(包括代码中的异常)的部分信息。默认情况下,这些事件日志条目的结尾如下:

-- logged as '-' number - @' quit arg1/arg2 }'

要获得有关此类错误的更完整信息:

  1. 将 ^Ens.Debug("LogETN") 全局节点设置为任意值。

这会导致 IRIS 记录系统级异常的附加详细信息。

  1. 重新运行认为导致异常的代码(例如,重新发送消息)。
0
0 77
文章 姚 鑫 · 七月 15, 2023 3m read

第五十九章 开发Productions - ObjectScript Productions - 测试和调试Production - 从管理门户进行测试

从管理门户进行测试

可以使用管理门户在开发、测试和调试Production时执行多项任务:

  • 能够查看和修改系统配置。
  • 能够启动和停止Production
  • 能够查看队列及其内容;消息及其详细信息;适配器和参与者及其状态;业务流程及其状态;配置项的代码和图形表示。
  • 能够查看、排序和有选择地清除事件日志条目。
  • 能够暂停(并稍后重新发送)连接暂时被阻止的消息。
  • 能够使用图形用户界面或通过输入 SQL SELECT 命令,按类别或消息内容过滤和搜索消息仓库中的特定消息。
  • 能够使用图形用户界面直观地跟踪消息活动。
  • 能够创建和查看统计报告。

对于开发人员来说,最有用的门户功能是不断收集运行时数据的监视服务、可用于向正在开发的产品发出模拟请求的测试服务以及记录业务主机发出的状态消息的事件日志。同时使用这些功能来生成测试数据并研究结果。

管理门户具有测试菜单,可以在其中测试业务主机和数据转换。它包含以下项目:

  • 业务主机-互操作性>测试>业务主机页面允许测试业务流程和业务操作。
  • 数据转换-此选项将带到另一个页面,可以在其中选择数据转换并单击测试。

使用测试服务

测试服务允许测试活动命名空间中正在运行的Production的业务流程或业务操作。

0
0 113
文章 姚 鑫 · 七月 14, 2023 2m read

第五十八章 开发Productions - ObjectScript Productions - 测试和调试Production

本主题介绍可用于测试和调试产品的工具。该信息对于故障排除和调整企业已在使用的Production软件也很有用。

纠正Production问题状态

如果Production暂停或出现问题,请阅读本节。

暂停Production

Production在队列中的所有异步消息可以被处理之前停止时,就会发生暂停Production。如果不手动清除这些异步消息,它们会在Production开始备份时自动处理。如果希望处理消息,则在开始暂停Production之前不需要其他步骤。

恢复陷入困境的Production

如果 IRIS 停止但Production没有正常关闭,Production将获得故障状态。如果在没有先停止Production的情况下重新启动 IRIS 或重新启动机器,就会发生这种情况。

在这种情况下,“恢复”命令将显示在“Production配置”页面上。单击“恢复”关闭并清理有问题的Production实例,以便可以在准备好时运行新实例。

或者可能需要使用命令行来恢复Production。请参阅使用 Ens.Director 启动和停止Production

0
0 95
文章 姚 鑫 · 七月 13, 2023 3m read

第五十七章 开发Productions - ObjectScript Productions - 不常见的任务 - 以编程方式使用查找表

IRIS 提供了名为 Lookup() 的实用函数,以便可以轻松地从业务规则或 DTL 数据转换中执行表查找。此功能仅在创建至少一个查找表并用适当的数据填充后才起作用。

有关定义查找表的信息,请参阅配置产品中的定义数据查找表。

如果需要比管理门户提供的更直接的查找表操作,请在类中使用 Ens.Util.LookupTable。此类公开查找表以通过对象或 SQL 进行访问。此外,它还提供类方法来清除表、将数据导出为 XML 以及从 XML 导入数据。

Ens.Util.LookupTable提供以下字符串属性:

TableName

查找表的名称,最多 255 个字符。可以通过在 IRIS 门户中选择“互操作性”、“配置”和“数据查找表”,然后选择“打开”来查看命名空间中定义的查找表。

KeyName

查找表中条目的键,最多 255 个字符。这是互操作性 > 配置 > 数据查找表页面上键字段的值。

DataValue

查找表中与此键关联的值,最多 32000 个字符。这是互操作性 > 配置 > 数据查找表页面上的值字段中的值。

示例 SQL 查询是:

SELECT KeyName,DataValue FROM Ens_Util.
0
0 87
文章 姚 鑫 · 七月 12, 2023 3m read

第五十六章 开发Productions - ObjectScript Productions - 不常见的任务 - 在适配器类中包含凭据

在适配器类中包含凭据

要在适配器类中包含生产凭证,请在类定义中执行以下操作:

  • 包括名为 Credentials 的设置。
  • 定义一个名为 CredentialsSet() 的方法,该方法使用 Credentials 设置的值作为键来查找 Credentials 表中的用户名和密码。然后实例化一个包含用户名和密码的凭据对象。

覆盖Production凭证

虽然Production凭证系统集中管理并将登录数据保留在源代码之外,但有时需要编写代码以从其他来源获取凭证。例如,代码可能会从 Web 表单或 cookie 中检索用户名和密码,然后将它们与 HTTP 出站适配器一起使用以连接到其他站点。

处理此问题的方法是在业务服务或业务操作代码中,在调用任何适配器方法之前执行以下两项操作:

  • 提供实例化凭证对象并向其分配用户名和密码值的代码
  • 请勿随后设置适配器 Credentials 属性或调用适配器 CredentialsSet() 方法,否则值可能会被重置。
  If .Adapter.Credentials="" {
     Set .Adapter.%CredentialsObj=##class(Ens.Config.
0
0 92
文章 姚 鑫 · 七月 9, 2023 4m read

第五十三章 开发Productions - ObjectScript Productions - 不常见的任务 - 使用 Ens.Director 访问设置

使用 Ens.Director 访问设置

即使production未运行,类中的以下 Ens.Director 方法也允许检索生产设置:

GetAdapterSettings()

返回一个数组,其中包含所标识的配置项(业务服务或业务操作)的所有适配器设置的值。该数组由设置名称下标。可以使用 IRIS $ORDER 函数来访问数组的元素。此方法的第一个参数是一个字符串,其中包含由两个竖线 (||) 分隔的产品名称和配置项名称。返回值是状态值。如果状态值不是 $$$OK,则无法找到指定的生产名称 (myProd) 和配置项名称 (myOp) 组合。

 Set tSC=##class(Ens.Director).GetAdapterSettings("myProd||myOp",.tSettings)

GetAdapterSettingValue()

返回标识的配置项的命名适配器设置的值:业务服务或业务操作。第一个参数是一个字符串,其中包含由两个竖线 (||) 分隔的产品名称和配置项名称。第二个参数是配置设置的名称。第三个输出参数返回调用的状态值。例如:

 Set val=##class(Ens.Director).
0
0 114
文章 姚 鑫 · 七月 8, 2023 3m read

第五十二章 开发Productions - ObjectScript Productions - 不常见的任务 - 在目标是动态的情况下渲染连接

在目标是动态的情况下渲染连接

当用户选择业务主机时,管理门户会自动显示与给定业务主机之间的连接。例如:

为此,IRIS 读取业务主机的配置设置并使用它们。

但是,如果业务服务在运行时动态托管其目标, IRIS 将无法自动显示此类连接。在这种情况下,要显示此类连接,请实施 OnGetConnections() 回调方法。 IRIS 在呈现配置图时自动调用此方法(默认情况下不执行任何操作)。

OnGetConnections() 具有以下签名:

ClassMethod OnGetConnections(Output pArray As %String, item As Ens.Config.Item) [ CodeMode = generator ]

其中参数如下:

  • pArray — 一个多维数组,其下标是此业务服务向其发送消息的项目的配置名称。例如,要向名为 ABCDEF 的业务主机发送消息,您的代码可以按如下方式设置 pArray
 set pArray("ABC")=""
 set pArray("DEF")=""
  • item — Ens.Config.Item对象表示此业务服务。
0
0 118
文章 姚 鑫 · 七月 7, 2023 3m read

第五十一章 开发Productions - ObjectScript Productions - 不常见的任务

定义自定义实用函数

IRIS提供了一组可以从业务规则和DTL中调用的实用函数;这些在开发业务规则的Productions中使用的效用函数中有所描述。可以添加自己的功能,业务规则引擎和业务规则编辑器会自动适应您的扩展。

要添加新的效用函数:

  1. 创建一个新类,它是 Ens.Rule.FunctionSet 的子类。此类不得扩展任何其他超类,只能扩展 Ens.Rule.FunctionSet
  2. 对于希望定义的每个函数,将一个类方法添加到新函数集类中。不支持多态性,所以准确的说,你必须把这些类方法标记为final。可以在现有的 Ens.Util.FunctionSet 方法中查看这个(Ens.Util.FunctionSetEns.Rule.FunctionSet的超类)。
  3. 编译新类。新函数现在可用于规则表达式。要调用这些函数,请使用子类中的 ClassMethod 名称。与 Ens.Rule.FunctionSet 中定义的函数不同,用户定义的方法名称必须使用它们所属的类进行完全限定。如果通过从管理门户中的向导中选择名称来添加它们,则会自动发生这种情况。

例如,以下函数集类提供了用于业务规则的日期和时间函数。

0
0 125
文章 姚 鑫 · 七月 6, 2023 3m read

第五十章 开发Productions - ObjectScript Productions - 高效处理批量记录

高效处理批量记录

RecordMap 功能一次导入一条记录,但如果正在导入或导出大量记录,则可以通过使用 RecordMap Batch 获得显着的效率提升。 RecordMap Batch 功能处理同类记录并一次处理一批中的所有记录。可以选择在批次之前加上一个标题记录,然后跟一个尾部记录。

要创建 RecordMap 批处理,需要实现一个继承自中的 %PersistentEnsLib.RecordMap.Batch的类。 Batch 类包含处理解析和写出与特定批次关联的任何标头和尾部的方法。必须提供解析和编写标头的代码。对于简单的表头和表尾,可以使用类中的 EnsLib.RecordMap.SimpleBatch,它继承自 Batch 类,并提供处理简单表头和表尾的代码。如果需要处理更复杂的标头和尾数据,可以扩展这两个批处理实现中的任何一个。

批处理遵循用于其他production消息格式(如 X12)的方法。这与处理 RecordMap 批处理对象的内置业务操作特别相关:这些业务操作接受 Batch 对象或扩展 EnsLib.RecordMap.BaseRecordMap 对象,或 BatchRolloverRequest 类型的请求。

0
0 104
文章 姚 鑫 · 七月 5, 2023 3m read

第四十九章 开发Productions - ObjectScript Productions - 使用复杂记录映射器 - 复杂的记录映射类结构

复杂的记录映射类结构

有两个类以类似于描述记录映射的两个类的方式描述复杂的记录映射。描述复杂记录映射的两个类是:

  • 复杂记录映射,描述复杂记录的外部结构并实现复杂记录解析器和编写器。
  • 生成的复杂记录类定义了包含数据的对象的结构。该对象允许在数据转换和路由规则条件中引用数据。

一个复杂的记录映射业务服务读取并解析传入的数据并创建一条消息,该消息是生成的记录类的一个实例。业务流程可以读取、修改或生成生成的复杂记录类的实例。最后,复杂记录映射业务操作使用实例中的数据,使用复杂记录映射作为格式化模板写入输出数据。复杂记录映射类和生成的复杂记录类都具有描述数据的层次结构。复杂记录映射类和生成的复杂记录类具有并行结构。这与 RecordMap 类不同,其中生成的记录类可以具有不同的层次结构。

当创建一个新的复杂记录映射并将其保存在管理门户中时,此操作定义了一个类,用于在扩展 EnsLib.RecordMap.ComplexMap和在类中扩展 Ens.RequestO。为了定义生成的记录类,必须单击管理门户中的生成,这会调用 EnsLib.ComplexGenerator 类中的 Generate() 方法。

0
0 122
文章 姚 鑫 · 七月 1, 2023 4m read

第四十五章 开发Productions - ObjectScript Productions - 使用记录映射器 - 记录映射类结构

记录映射类结构

有两个类描述记录映射:

  • RecordMap 描述了记录的外部结构,实现了记录解析器和记录编写器。
  • 生成的记录类定义了包含数据的对象的结构。该对象允许在数据转换和路由规则条件中引用数据。

记录映射业务服务读取并解析传入数据并创建一条消息,该消息是生成的记录类的一个实例。业务流程可以读取、修改或生成生成的记录类的实例。最后,记录映射业务操作使用实例中的数据将 RecordMap 用作格式化模板来写入传出数据。 RecordMap 类和生成的记录类都具有描述数据的层次结构,但生成的对象结构不必与 RecordMap 结构相同。

当创建一个新的记录映射并将其保存在管理门户中时,此操作定义了一个扩展 RecordMap 类的类。为了定义生成的记录类,您必须在管理门户中单击“生成”,这会调用 EnsLib.RecordMap.Generator中的 GenerateObject()方法。仅编译 RecordMap 类定义不会为生成的记录类创建代码。必须使用管理门户或从终端或代码调用 Generator.GenerateObject() 方法。

RecordMap 由一系列字段和组合组成:

  • 字段定义具有指定类型的数据字段。
0
0 106
文章 姚 鑫 · 六月 29, 2023 3m read

第四十三章 开发Productions - ObjectScript Productions - 使用记录映射器 - 编辑记录映射字段和组合

编辑记录映射字段和组合

Record Mapper 左侧面板显示 Record Map 中定义的字段的摘要。如果您选择一个字段,右侧面板将访问字段属性。例如:

记录映射由一系列字段和组合组成。每个组合由一系列字段和组合组成。 Make CompositeMake Field 按钮在复合字段和数据字段之间切换。对于复合字段,只需指定名称和指示字段为必填项的标志。单击记录映射上的绿色加号图标以将字段或组合添加到顶层。单击组合的加号允许向其添加字段或组合。

在将字段添加到记录映射时,可以打开示例文件以查看其数据如何映射到您正在创建的记录。

对于定界记录映射,复合字段中的字段具有不同的分隔符。例如,在记录中,顶级字段由逗号分隔,但在组合中,字段由分号分隔。对于固定宽度的记录映射,复合字段有助于在概念上组织数据,但不会影响输入消息的处理。

当在 Record Mapper 中创建复合字段时,复合字段将默认名称设置为与复合结构匹配的限定名称。限定的字段名称确定生成的记录类中字段的结构。如果将字段名称修改为具有不同的限定名称,则记录映射中复合字段的级别独立于生成的记录类中字段的结构

对于每个数据字段,输入以下属性:

Name

字段名称。

0
0 161
文章 姚 鑫 · 六月 28, 2023 4m read

第四十二章 开发Productions - ObjectScript Productions - 使用记录映射器 - 通用控制字符

通用控制字符

在记录映射中,可以在多个位置使用文字控制字符和可打印字符。例如,可以指定制表符(常用控制字符)和逗号(可打印字符)作为分隔符。还可以将控制字符指定为填充字符或记录终止符之一。要在这些上下文之一中指定控制字符,必须为该字符指定十六进制转义序列。如果选择空格或制表符作为填充字符,或选择 CRLF(回车后跟换行符)、CRLF 作为 Record Mapper 中的记录终止符,管理门户会自动生成十六进制表示。如果指定另一个控制字符作为填充字符或记录终止符或任何控制字符作为分隔符,则必须在相应的表单域中输入十六进制表示。下表列出了常用控制字符的十六进制转义序列:

Character Hexadecimal representation
Tab \x09
Line feed \x0A
Carriage return \x0D
Space \x20

注意:如果在 RecordMap 中指定了记录终止符,则传入消息必须与记录终止符完全匹配。例如,如果指定 CRLF (\x0D\x0A),则传入消息记录必须与该序列匹配。

编辑记录映射属性

无论是从向导生成的映射开始输入新记录映射的属性,还是编辑现有映射,过程都是相同的。

0
0 151
文章 姚 鑫 · 六月 25, 2023 2m read

第三十九章 开发Productions - ObjectScript Productions - Defining Business Metrics - 以编程方式设置和获取值

以编程方式设置和获取值

在某些情况下,可能需要以编程方式访问指标属性。例如,可能希望业务流程直接读取或设置度量属性。为此,请在新选项卡中使用 Ens.BusinessMetricOpensGetMetric()SetMetric() 类方法。

使用 GetMetric() 方法

GetMetric() 类方法从业务指标缓存中读取指定指标属性的当前值。按如下方式调用此方法:

  Set value = ##class(Ens.BusinessMetric).GetMetric(metric,property)

其中 metric 是业务指标的名称(配置名称,而不是类名),property 是指标属性的名称。如果 GetMetric() 无法读取指定值,它会返回一个空字符串。

要从多维指标属性中读取值,有第三个可选参数,用于指定要读取属性的哪个子节点。例如:

  Set value(1) = ##class(Ens.BusinessMetric).GetMetric(metric,property,1)

使用 SetMetric() 方法

SetMetric() 类方法设置业务指标缓存中指定指标属性的值。

0
0 103
文章 姚 鑫 · 六月 24, 2023 2m read

第三十八章 开发Productions - ObjectScript Productions - Defining Business Metrics - 业务指标中的其他选项

业务指标中的其他选项

本节介绍业务指标类中的其他选项。

定义在仪表板中使用的操作

业务指标类可以定义操作,可以将这些操作公开为仪表板中的用户选项。一个操作可以执行客户端活动(例如过滤和刷新仪表板)和服务器端活动(例如调用您自己的 API)的组合。作用机制很一般。

要定义操作,请实施业务指标类的 %OnGetActionList()%OnDashboardAction() 方法。有关这些方法的信息,请参阅实施 商业智能中的定义自定义操作。

Implementing OnInit()

例如,还可以覆盖业务指标类的 OnInit() 回调以初始化任何属性。如果这样做,必须确保它显式调用其超类 BusinessMetric 提供的 OnInit() 方法,如下所示。如果不是,则相应的仪表板元素无法正常显示:

Method OnInit() As %Status
{
    // . . .
0
0 122
文章 姚 鑫 · 六月 21, 2023 2m read

第三十五章 开发Productions - ObjectScript Productions - Defining Business Metrics - 定义单实例业务指标

定义单实例业务指标

要定义单实例业务指标,请定义一个满足以下要求的类:

  • 它必须是 Ens.BusinessMetric的子类。

对于此类,ADAPTER 参数是 Ens.InboundAdapter,它提供了 CallInterval 设置。这确保定期调用业务指标。

  • 它必须定义一个或多个业务度量属性。简单属性和具有自动历史的属性的细节不同。
  • 它可以选择性地为属性参数指定值,例如,以控制值的范围。
  • 它必须为业务度量属性分配值。为此,它必须实施 OnCalculateMetrics() 方法。

定义简单的业务指标属性

要定义一个简单的业务指标属性,请将一个属性添加到业务指标类,如下所示:

Property MetricProperty As Ens.DataType.Metric;

此属性可以包含数字或字符串值。

其中 MetricProperty 是业务指标属性的名称。例如:

/// This metric tracks A/R totals
Property AccountsReceivable As Ens.DataType.Metric;

此属性可以包含数字或字符串值。

0
0 126
文章 姚 鑫 · 六月 18, 2023 6m read

第六十一章 镜像中断程序 - 计划故障转移到提升的 DR 异步

计划故障转移到提升的 DR 异步

如果在镜像中包含一个或多个 DR 异步以提供灾难恢复功能,则最好通过计划的故障转移到每个 DR 异步来定期测试此功能。要执行此测试,或者当出于任何其他原因(例如包含故障转移成员的数据中心计划停电)而想要故障转移到 DR 异步时,请使用以下过程:

  1. IRIS C 提升为故障转移成员;因为 IRIS A 可用,所以不会要求您选择故障转移伙伴。 IRIS C 成为备份, IRIS B(如果存在)降级为 DR 异步。

注意:如果镜像仅包含一个故障转移成员,则过程相同;不需要选择故障转移伙伴, IRIS C 成为备份,因此镜像现在有两个故障转移成员。

  1. IRIS C 变为活动状态时(请参阅备份状态和自动故障转移),在 IRIS A 上执行正常关闭。自动故障转移被触发,允许 IRIS C 接管为主。
  2. 在可能希望在 IRIS C 上执行任何测试后,重新启动 IRIS A,它会自动加入镜像作为备份。

或者,如果你想重启主服务器以保持同步而不自动成为备份,因为在真正的灾难中它不太可能可用,可以在重启之前将它降级为 DR 异步(通过它的 ISCAgent),然后准备好后将其提升为故障转移成员。有关执行此操作的信息,请参阅将备份降级为 DR 异步。

0
1 123
文章 姚 鑫 · 六月 17, 2023 4m read

第六十章 镜像中断程序 - 使用主 ISCAgent 的日志数据进行 DR 提升和手动故障转移

使用主 ISCAgent 的日志数据进行 DR 提升和手动故障转移

如果 IRIS A 的主机系统正在运行,但 IRIS 实例没有且无法重新启动,您可以使用以下过程在通过升级后使用来自 IRIS A 的最新日志数据更新升级的 IRIS C IRIS AISCAgent

  1. 推广 IRIS C,选择 IRIS A 作为故障转移伙伴。 IRIS C 被提升为故障转移成员,从 IRIS A 的代理获取最新的日志数据,并成为主要成员。
  2. 重新启动 IRIS A 上的 IRIS 实例,它作为备份重新加入镜像。
  3. IRIS A 重新加入镜像并变为活动状态后,可以使用使用升级的 DR 异步临时替换故障转移成员中描述的过程,将所有成员返回到它们以前的角色,首先是正常关闭 IRIS C ,然后在 IRIS B 的配置参数文件的 [MirrorMember] 部分中设置 ValidatedMember=0(请参阅配置参数文件参考中的 [MirrorMember]),将 IRIS B 重新启动为 DR 异步,将 IRIS B 提升为备份,并以 DR 异步方式重新启动 IRIS C
0
0 153
文章 姚 鑫 · 六月 16, 2023 4m read

第五十九章 镜像中断程序 - 灾难恢复程序

灾难恢复程序

如异步镜像成员中所述,灾难恢复 (DR) 异步成员维护镜像数据库的只读副本,从而可以在需要时将 DR 异步提升为故障转移成员。将 DR 异步成员提升为故障转移成员中描述了提升 DR 异步的过程。本节讨论三种可以使用 DR 异步提升的场景:

  • 在灾难期间手动故障转移到提升的 DR 异步
  • 计划故障转移到提升的 DR 异步
  • 使用提升的 DR 异步临时替换故障转移成员

在本节的过程中, IRIS A 是原始的主要故障转移成员, IRIS B 是原始备份,而 IRIS C 是要提升的 DR 异步。

在灾难期间手动故障转移到提升的 DR 异步

当镜像没有正常运行的故障转移成员时,可以手动故障转移到提升的 DR 异步。以下过程涵盖了可以选择此选项的场景:

  • 没有附加日志数据的 DR 提升和手动故障转移
  • 使用主 ISCAgent 的日志数据进行 DR 提升和手动故障转移
  • 使用来自日志文件的日志数据进行 DR 提升和手动故障转移

注意:如果无法确认主要故障转移成员 IRIS 实例确实已关闭,并且该实例有可能变得可用,请不要手动故障转移到另一个镜像成员。如果手动进行故障转移并且原始主节点变为可用,则两个故障转移成员将同时充当主节点。

0
1 154
文章 姚 鑫 · 六月 15, 2023 3m read

第五十八章 镜像中断程序 - 主要故障转移成员的计划外隔离

主要故障转移成员的计划外隔离

如自动故障转移机制中所述,当主节点同时与备份节点和仲裁节点失去联系时,它会进入无限期的故障状态并且不能再作为主节点运行。通常,发生这种情况时,备份会接管并成为主要的。当主服务器与备份服务器的连接恢复时,备份服务器强制关闭主服务器;或者,可以在恢复连接之前自行强制关闭主服务器。

但是,如果一个网络事件(或一系列网络事件)导致故障转移成员和仲裁器同时(或几乎同时)彼此失去联系,则可能没有主节点,因为备份无法接管并且主节点不再存在作为主要操作。这种情况显示为自动故障转移机制详细部分中仲裁模式下对丢失连接的镜像响应表中的最终方案。当主数据库变得孤立并且备份由于错误而无法接管时,可能会发生类似的情况。

当这些情况发生时,有以下选择:

  • 恢复故障转移成员之间的连接;当前一个备份与前一个主要联系时,成员进行协商,一个成为主要,另一个成为备份。
  • 在不恢复连接的情况下,如果可以在主服务器上打开终端窗口,请这样做并在主服务器上运行 ^MIRROR 例程(请参阅使用 ^MIRROR 例程)。该例程确认主实例处于不确定的故障状态,并为您提供两个选项:
    • 如果确认另一个故障转移成员已关闭(可能是因为您将其关闭),它从未成为主成员,并且它没有创建比主成员上的最新镜像日志文件晚的镜像日志文件,可以强制该成员恢复操作为主。
0
1 138
文章 姚 鑫 · 六月 14, 2023 4m read

第五十七章 镜像中断程序 - 在手动故障转移之前确定备份是否处于活动状态

在手动故障转移之前确定备份是否处于活动状态

假设有两个名为 IRIS AIRIS B 的故障转移成员。如果 ^MIRROR 例程确认备份 (IRIS B) 在与主 (IRIS A) 丢失联系时处于活动状态,因此具有最新的来自 IRIS A 的日志数据,可以使用单个过程手动进行故障转移。当连接因主要故障而丢失时,不会造成数据丢失的风险。但是,当发生多个故障时,活动备份可能没有来自主服务器的所有最新日志数据,因为主服务器在连接丢失后继续运行了一段时间。

使用以下过程确定备份是否处于活动状态:

  1. 确认 IRIS 实例 IRIS A 上的 ISCAgent 实际上已关闭(并确保它们在整个手动故障转移过程中保持关闭状态)。
  2. IRIS B 上,在终端的 %SYS 命名空间中运行 ^MIRROR 例程(请参阅使用 ^MIRROR 例程)。
0
1 133
文章 姚 鑫 · 六月 13, 2023 4m read

第五十六章 镜像中断程序 - 计划外停机程序

计划外停机程序

当一个故障转移成员意外失败时,适当的程序取决于哪个 实例失败,镜像所处的故障转移模式(参见自动故障转移机制详述),另一个故障转移成员实例的状态,两个故障转移成员的 ISCAgent 的可用性, 和镜像的设置。

  • 备份故障转移成员的计划外中断
  • 具有自动故障转移的主要故障转移成员的计划外中断
  • 未发生自动故障转移时主要故障转移成员的计划外中断
  • 主要故障转移成员的计划外隔离
  • 两个故障转移成员的计划外中断

在阅读和使用本节时,您能需要查看对各种中断情况的镜像响应,其中讨论了主服务器变得不可用时备份行为的详细信息。

备份故障转移成员的计划外中断

当备份故障转移成员的 实例或其主机系统发生故障时,主要继续正常运行,尽管某些应用程序可能会出现短暂的暂停(有关详细信息,请参阅备份中断的影响)。

当备份发生意外中断时,纠正导致故障的条件,然后重新启动备份实例或主机系统。当备份的 实例重新启动时,它会自动加入镜像作为备份。

注意:如果备份在代理控制模式下失败(请参阅自动故障转移规则)并且无法联系到备份的 ISCAgent,则主的 实例在重新启动后无法成为主实例,因为它无法确定它是否是最近的主实例.因此,如果出于任何原因需要在备份主机系统关闭时重新启动实例,则必须使用维护备份故障转移成员中描述的过程来执行此操作。

0
1 154
文章 姚 鑫 · 六月 11, 2023 4m read

第三十二章 开发Productions - ObjectScript Productions - 定义警报处理器 - 使用路由警报处理器

使用路由警报处理器

如果需要通过多种输出机制联系用户,警报处理器应该是一个业务流程,用于确定如何在消息中路由 Ens.AlertReques。在这种情况下,Productions必须为每个输出机制包含一个额外的业务操作,并且警报处理器将消息转发到这些业务操作。

将警报处理器定义为路由进程

要将警报处理器定义为路由流程,请创建一个可以在消息中接收 Ens.AlertRequest 的业务流程类。

业务流程将检查消息并将它们转发给不同的业务操作,具体取决于警报内容和包含的任何逻辑。

逻辑可能需要考虑以下因素:

  • 不同用户的不同要求
  • 根据一天中的时间不同的要求
  • 组织的问题解决政策和程序

可以在使用 EnsLib.MsgRouter.RoutingEngine类作为 Ens.Alert 路由进程。此类提供设置业务规则名称。如果将此设置指定为路由规则集的名称,则此业务主机会使用该规则集中的逻辑来转发它收到的所有消息。

定义业务操作

可以定义每个所需的业务操作,如使用简单电子邮件警报处理器或使用简单出站适配器警报处理器中所述。

将自定义代码添加到警报管理

警报管理允许将警报分配给用户、跟踪警报的状态以及管理解决警报的进度。

0
1 193
文章 姚 鑫 · 六月 9, 2023 2m read

第三十章 开发Productions - ObjectScript Productions - 定义业务操作 - 调用适配器方法

调用适配器方法

最常见的是,业务操作不包含用于与外部系统通信的逻辑。相反,业务操作使用处理此逻辑的出站适配器。一旦业务操作与出站适配器相关联,它就会调用适配器的方法来发送和接收数据。有关调用适配器方法的详细信息,请参阅从业务主机访问属性和方法。

向生产中的目标发送请求

尽管业务操作主要负责向特定的外部应用程序传递请求,但它也可以根据需要向其他业务操作或业务流程发送消息。要将消息发送到生产中的目标,请调用 SendRequestSync()SendRequestAsync()SendDeferredResponse()

Ens.BusinessOperation 定义了一个可以使用的附加方法:DeferResponse()

DeferResponse() 方法

此方法中返回一个 %Status,指示成功或失败。它提供了一个引用参数 token,它返回稍后调用 SendDeferredResponse() 所需的延迟响应传递令牌。例如:

   Set sc=.DeferResponse(.
0
0 123
文章 姚 鑫 · 六月 8, 2023 2m read

第二十九章 开发Productions - ObjectScript Productions - 定义业务操作 - 定义消息处理程序方法

定义消息处理程序方法

当创建业务操作类时,通常最大的任务是编写用于此适配器的消息处理程序,即接收生产消息的方法,然后调用适配器的方法以便与生产之外的目标进行通信。

每个消息处理程序方法都应具有以下签名:

Method Sample(pReq As RequestClass, Output pResp As ResponseClass) As %Status

这里Sample是方法名,RequestClass是请求消息类名,ResponseClass是响应消息类名。

通常,该方法应执行以下部分或全部操作:

  1. 可选地设置业务操作类的属性(在任何适当的时间)。请参阅业务运营属性。
  2. 检查输入对象。
  3. 创建响应类的实例。
  4. 调用适配器的适用方法。这些方法可通过业务操作的 Adapter 属性使用。例如:
    Set tSc=..Adapter.SendMail(email,.pf)

在这些步骤之后讨论此方法。

或者,要将消息发送到Productions中的目标,请参阅将消息发送到Productions中的目标。

  1. 检查响应。
  2. 使用响应中的信息创建响应消息(Ens.Response 在的实例),该方法将其作为输出返回。
  3. 确保设置输出参数 (pOutput
0
0 91
文章 姚 鑫 · 六月 6, 2023 5m read

第二十七章 开发Productions - ObjectScript Productions - 定义业务流程 - 关键原则

关键原则

在开发业务流程时,请考虑以下关键原则:

  • 有时希望使响应对象成为传入请求对象的修改版本,分阶段进行修改可能很有用。但是,不要修改传入的请求对象。而是将其复制到上下文变量(或者,对于自定义业务流程,将数据复制到局部变量)。然后修改副本。
  • 同步发送消息时要小心(只能在自定义业务流程中或 BPL 中的 中执行)。

当业务流程A同步调用业务流程B时,流程A不会继续,直到收到响应。如果进程 A 需要完成对其他进程 (B) 的调用才能完成自身,并且如果这些进程共享参与者作业池,则如果没有空闲的参与者作业来处理被调用的业务流程,则参与者池可能会陷入死锁( B).

发生这种情况是因为在被调用业务流程返回之前,调用业务流程无法完成并释放参与者作业,但被调用业务流程无法执行,因为没有空闲的参与者作业来执行它。

另请注意, IRIS 无法在真正的同步调用期间关闭。

最好使用 SendRequestAsync() 并在 OnResponse() 方法中处理响应消息。如果需要同步调用,可以通过配置被调用的业务流程(B)使用自己的作业池来避免这个问题。

  • 如果单一作业业务流程发出请求并等待响应,则该流程将失去 FIFO 功能。
0
0 113