第二十三章 开发Productions - ObjectScript Productions - 定义消息

定义消息

消息正文可以是任何持久对象。

实际上,通常会创建 Ens.Util.RequestBodyMethodsEns.Util.ResponseBodyMethods 的子类并添加属性。这将创建标准消息正文。如果使用这些类,可以轻松访问各种内置功能,以查看来自管理门户的消息内容。这些功能可帮助开发人员和管理员检测正在运行的产品中的错误,尤其是当产品使用消息内容来确定应将消息发送到何处时。

一些电子文档——电子数据交换 (EDI) 格式,例如 X12——包含任意长和复杂的数据。在这种情况下,最好使用一个替代类,一个表示 IRIS® 虚拟文档的类。在这种情况下,消息正文没有一组属性来包含消息内容。有关详细信息,请参阅在作品中使用虚拟文档。

本书中的大多数示例都采用标准消息体,具有相对较少的消息属性。

创建一个简单的消息体类

要创建消息类(用作消息正文),请创建一个类:

  • 扩展 Ens.Util.RequestBodyMethodsEns.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;

}

USEEXTENTSETDEFAULTGLOBAL 类参数提供了其他方法来确保消息存储在它们自己的表中;有关详细信息,请参阅 %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 在清除操作期间如何处理该类的实例。该参数有两个可能的值:

  • 0IRIS 不会根据类别清除消息体,即使启用了清除消息体的选项也是如此。
  • 1 — 启用清除消息体选项时 IRIS 根据类别清除消息体。

ENSPURGE 参数影响管理门户的所有清除,但企业消息库的清除除外。同样,它会影响使用新选项卡类中 Ens.MessageHeaderPurge() 方法的编程清除。

例如,考虑 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

06-03 11:50