如果要将来自外部系统的消息记入 IBM® BPM 事件管理器,那么必须使用本主题中描述的消息结构。
可以使用 Java 消息服务 (JMS) 将消息记入事件管理器。请参阅维护和监控 IBM Business Process Manager Event Manager,以了解事件管理器是如何处理入局请求的。
记入事件管理器的消息必须包含事件名称(创建 Undercover Agent 时生成的消息事件标识),并且可以包含键/值对格式的参数名称和值。(主题为消息事件创建和配置 Undercover Agent 描述了应该用于消息事件名称的事件标识。)消息的结构必须为 XML,如下列示例中所示:
<eventmsg> <!-- 需要 process app 首字母缩写和事件名称:Snapshot 和 UCA 名称是可选的 --> <event processApp="[acronym]" snapshot="[snapshot_name]" ucaname="[UCA_name]">[event_name]</event> <!--可选:事件要在其中运行的队列的名称--> <queue>[queue name]</queue> <!--UCA 可能需要的任何参数-- <parameters> <parameter> <key>param1</key> <value><![CDATA[value1]]> </value> </parameter> </parameters> </eventmsg>
可以使用 Undercover Agent 自动对服务和 BPD 进行实例化,而无需 IBM BPM 参与者进行人机交互。在 IBM BPM BPD 中包含消息事件时,您必须向其分配一个 Undercover Agent 以使消息事件在运行时运行。事件管理器是 IBM Process Server 的一部分,可处理 Undercover Agent 的调度和排队。有关更多信息,请参阅Undercover Agent。
除了用户创建的复杂业务对象(变量类型)外,还可以使用下列复杂业务对象在运行时调用 Undercover Agent:
| 变量类型 | 语法 |
|---|---|
| 记录 | XMLDocument |
| 日期和时间 | XMLElement |
| 布尔值 | XMLNodeList |
| 映射 | ANY(缺省值) |
例如,要使用 XML 消息调用 Undercover Agent,假设运行时进程包含等待入局消息的消息事件。此消息包含输入参数,其值包括“客户名称”、“描述”和“年龄”。
首先创建服务,然后将该服务与 Undercover Agent 相关联(该服务描述在运行时调用 Undercover Agent 时会发生的事件)。其次发送消息,语法如下:
<eventmsg> <event processApp="[acronym]" snapshot="[snapshot_name]" ucaname="[UCA_name]">[event name]</event> <parameters> <parameter> <key>customerParam</key> <value> <Name>John</Name> <Description>John Description</Description> <Age>30</Age> </value> </parameter> </parameters> </eventmsg>
下列部分提供了如何传递 <value> 元素内容的示例。从事件 XML 格式转换为复杂类型是由 IBM BPM 引擎自动处理的。
使用 Any 类型来传递参数值时,必须使用对应元素的 type 属性来提供实际的 IBM BPM 类型。仅当 IBM BPM 知道准确的 type 或者类型为 String 时,才能省略 type 属性。属性值必须是现有的 IBM BPM 类型,或者对于 array,IBM BPM 类型与 [] 字符串在末尾并置。
所有结构化对象都作为 XML 结构传递,其中每个对象属性对应于一个 XML 元素。
例如:
变量类型:Customer - Name:String (John Doe) - Description:String (Single) - Age:Integer (30)
映射到:
XML: <value> <Name>John Doe</Name> <Description>Single</Description> <Age>30</Age> </value>
请谨记下列重要规则:
传递 Root 级别数组:每个对象数组项必须作为 <item> 元素的内容放入。例如:
<value> <item> <Name>John Doe</Name> <Description>Married</Description> <Age>30</Age> </item> <item> <Name>Jane Doe</Name> <Description>Married</Description> <Age>31</Age> </item> </value>
传递数组属性:对象数组中的每个对象都将使用与 XML 元素同名的对象属性转换为 XML。例如:
<value> <Name>John Doe</Name> <Description>Single</Description> <Age>30</Age> <Address> <Street>10506 Jollyville Rd</Street> <City>Austin</City> </Address> <Address> <Street>10507 Research Blvd</Street> <City>Austin</City> </Address> </value>
“记录”类型的序列化方式与“结构化”类型相同。但是,由于所有值的类型均视为 ANY,因此还必须传递类型信息(使用 type 属性),从而在反序列化期间对正确的对象进行实例化。
用于传递日期的格式为 yyyy/MM/dd HH:mm:ss.S z。
示例:
值转换为日历 Java 对象时,它会保留时区,并且不执行任何其他修改(如将其调整为服务器时区)。
“布尔值”类型的有效值为 true 或 false(不考虑大小写)。
示例:
<value>TRUE</value>
“映射”类型使用下列结构传递到 Undercover Agent:
<value> <entry> <key> … </key> <value> … </value> </entry> </value> For example: <value> <entry> <key>TX</key> <value>Texas</value> </entry> <entry> <key>CA</key> <value>California</value> </entry> </value>
由于在本例中所有值和键的类型都需要为 ANY,因此还必须传递类型信息,从而在反序列化期间对正确的对象进行实例化。如果对象的类型为 String,那么无需指定类型。
XML 文档作为 XML 转义字符串传递。
示例:
<value> <![CDATA[ <?xml version="1.0"?> <Customer> <Name>John Doe</Name> <Description>Married</Description> <Age>30</Age> </Customer> ]]> </value>
XML 元素作为 XML 转义字符串传递。
示例:
<value> <![CDATA[ <Customer> <Name>John Doe</Name> <Description>Married</Description> <Age>30</Age> </Customer> ]]> </value>
每个节点作为 XML 转义字符串传递。节点数组编码为一系列 <item> 元素。
示例:
<value> <item> <![CDATA[ <Customer> <Name>John Doe</Name> <Description>Married</Description> <Age>30</Age> </Customer> ]]> </item>| <item> <![CDATA[ <Customer> <Name>Jane Doe</Name> <Description>Married</Description> <Age>31</Age> </Customer> ]]> </item> </value>
Undercover Agent 的输入参数类型声明为 ANY 时,必须将有关实际类型的信息作为 XML 一部分传递。
示例:
使用一个输入参数 Name 和类型 ANY 来定义进程。数据以 XML 格式编码时,实际类型必须作为 type 属性的值提供。如果未传递类型,将假定类型为 String。
<value type="String"> John Doe </value>