第二十三章 开发Productions - ObjectScri
第二十三章 开发Productions - ObjectScript Productions - 定义消息
定义消息
消息正文可以是任何持久对象。
实际上,通常会创建 Ens.Util.RequestBodyMethods
或 Ens.Util.ResponseBodyMethods
的子类并添加属性。这将创建标准消息正文。如果使用这些类,可以轻松访问各种内置功能,以查看来自管理门户的消息内容。这些功能可帮助开发人员和管理员检测正在运行的产品中的错误,尤其是当产品使用消息内容来确定应将消息发送到何处时。
一些电子文档——电子数据交换 (EDI
) 格式,例如 X12
——包含任意长和复杂的数据。在这种情况下,最好使用一个替代类,一个表示 IRIS®
虚拟文档的类。在这种情况下,消息正文没有一组属性来包含消息内容。有关详细信息,请参阅在作品中使用虚拟文档。
本书中的大多数示例都采用标准消息体,具有相对较少的消息属性。
创建一个简单的消息体类
要创建消息类(用作消息正文),请创建一个类:
- 扩展
Ens.Util.RequestBodyMethods
或Ens.Util.ResponseBodyMethods
。 - 包含表示要在消息中携带的数据元素所需的属性。
下面显示了一个简单的例子:
Class Demo.Loan.Msg.CreditRatingResponse Extends Ens.Util.ResponseBodyMethods
{
Property TaxID As %String;
Property CreditRating As %Integer;
}
该类还可以包含方法。例如:
Class Demo.Loan.Msg.Application Extends Ens.Util.RequestBodyMethods
{
Property Amount As %Integer;
Property Name As %String;
Property TaxID As %String;
Property Nationality As %String;
Property BusinessOperationType As %String;
Property Destination As %String;
Method RecordNumber() As %String
{
If ..%Id()="" Do ..%Save()
Quit ..%Id()
}
Method GetRecordNumberText(pFormatAsHTML As %Boolean = 0) As %String
{
Set tCRLF=$s(pFormatAsHTML:"<br>",1:$c(13,10))
Set tText=""
Set tText=tText_"Your loan application has been received,"_tCRLF
Set tText=tText_"and is being processed."_tCRLF
Set tText=tText_"Your record number is "_..RecordNumber()_"."_tCRLF
Set tText=tText_"You'll receive a reply from FindRate"_tCRLF
Set tText=tText_"within 2 business days."_tCRLF
Set tText=tText_"Thank you for applying with FindRate."_tCRLF
Quit tText
}
}
另一种选择是创建自定义消息类,但是当您这样做时,定义类很重要,这样消息只存储在它们自己的表中,这样消息搜索就可以快速进行。为此,请在使用 %Persistent
作为主要超类,然后使用 Ens.
或中使用 Ens.Response
,具体取决于这是请求消息还是响应消息。例如:
Class Demo.Loan.Msg.CreditRatingResponse Extends (%Persistent, Ens.Response)
{
Property TaxID As %String;
Property CreditRating As %Integer;
}
(USEEXTENTSET
和 DEFAULTGLOBAL
类参数提供了其他方法来确保消息存储在它们自己的表中;有关详细信息,请参阅 %Persistent
的类参考。)
另一种选择是简单地创建一个基于持久类的类,并且可以选择将 %XML.Adaptor
作为另一个超类包含中。 (%XML.Adaptor
支持在管理门户中以 XML
形式显示消息。)
创建复杂的消息正文类
在前面的示例中,消息正文类仅包含简单的属性。在某些情况下,可能需要定义使用其他类的属性。如果是这样,应该仔细考虑清除消息体时要做什么(如管理产品中所述)。
当清除消息体时, IRIS
只会删除特定的消息体对象。例如,考虑以下消息类:
Class Demo.MyApp.Messages.Person Extends Ens.Util.RequestBodyMethods
{
Property Name As %String;
Property MRN As %String;
Property BirthDate As %Date;
Property Address As Demo.MyApp.Messages.Address;
}
地址类如下:
Class Demo.MyApp.Messages.Address Extends %Persistent
{
Property StreetAddress As %String;
Property City As %String;
Property State As %String;
Property ZIP As %String;
}
在这种情况下,如果清除消息体, IRIS
会删除 MyApp.Messages.Person
的实例,但不会删除 MyApp.Messages.Address
的实例。
如果消息正文类使用其他类作为属性,并且如果应用程序要求也清除任何引用的对象,请使用以下方法之一:
确保引用的类是串行的。例如,重新定义 Address
类如下:
Class MyApp.Messages.Address Extends %SerialObject
{
...
}
在这种情况下,Address
类的数据存储为Person
类的一部分(因此同时自动清除)。
- 将属性定义为合适的关系。请参阅定义和使用类中的关系。
- 向消息类添加删除触发器或
%OnDelete()
方法,以便此类删除引用类中的适当记录。 - 可选择将
%XML.Adaptor
作为超类包含在,以便在管理门户中显示在引用类中定义的属性。
设置消息清除行为
定义消息主体类时,可以包含 ENSPURGE
参数以指定 IRIS
在清除操作期间如何处理该类的实例。该参数有两个可能的值:
-
0
—IRIS
不会根据类别清除消息体,即使启用了清除消息体的选项也是如此。 -
1
— 启用清除消息体选项时IRIS
根据类别清除消息体。
ENSPURGE
参数影响管理门户的所有清除,但企业消息库的清除除外。同样,它会影响使用新选项卡类中 Ens.MessageHeader
的 Purge()
方法的编程清除。
例如,考虑 Sample.Person
持久数据库类:
Class Sample.Person Extends (%Persistent, %Populate, %XML.Adaptor)
{
Property Name As %String(POPSPEC = "Name()") [ Required ];
Property SSN As %String(PATTERN = "3N1""-""2N1""-""4N") [ Required ];
Property DOB As %Date(POPSPEC = "Date()");
...
}
如果将生产配置为 Sample.Person
对象发送到更新患者信息的业务操作,则保留这些对象可能很重要。为确保系统不会清除 Sample.Person
消息正文类的任何实例,可以将 ENSPURGE
参数添加到类定义中,如下所示:
Class Sample.Person Extends (%Persistent, %Populate, %XML.Adaptor)
{
Parameter ENSPURGE As %Boolean = 0;
Property Name As %String(POPSPEC = "Name()") [ Required ];
Property SSN As %String(PATTERN = "3N1""-""2N1""-""4N") [ Required ];
Property DOB As %Date(POPSPEC = "Date()");
...
}
在随后的清除过程中,系统仅删除基于 Sample.Person
消息正文类的消息标头。消息体本质上是孤立的,只能以编程方式删除。有关详细信息,请参阅清除生产数据。
ENSPURGE
参数是可继承的,不是必需的。默认值为 1
。