将消息记入 IBM Business Process Manager 事件管理器

如果要将来自外部系统的消息记入 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>
如果消息中未包含 Snapshot 名称,那么事件管理器会使用目标 Process Server 上启动消息事件的缺省 Snapshot。对于中间消息事件,如果消息中未包含 Snapshot 名称,那么所有活动 Snapshot 都会接收事件。要了解有关活动和缺省 Snapshot 的更多信息,请参阅为安装的 Snapshot 配置运行时设置
注: 如果 <value> 元素的值包含 XML 元素或类似内容,那么需要合并 CDATA 标记中的值,如上例中所示。有关传递每个复杂业务对象(变量类型)参数值的信息,请参阅下列部分。

将复杂变量类型传递给 Undercover Agent

可以使用 Undercover Agent 自动对服务和 BPD 进行实例化,而无需 IBM BPM 参与者进行人机交互。在 IBM BPM BPD 中包含消息事件时,您必须向其分配一个 Undercover Agent 以使消息事件在运行时运行。事件管理器是 IBM Process Server 的一部分,可处理 Undercover Agent 的调度和排队。有关更多信息,请参阅Undercover Agent

除了用户创建的复杂业务对象(变量类型)外,还可以使用下列复杂业务对象在运行时调用 Undercover Agent:

表 1. 可用于在运行时调用 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 类型,或者对于 arrayIBM BPM 类型与 [] 字符串在末尾并置。

传递 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>

请谨记下列重要规则:

传递记录类型

“记录”类型的序列化方式与“结构化”类型相同。但是,由于所有值的类型均视为 ANY,因此还必须传递类型信息(使用 type 属性),从而在反序列化期间对正确的对象进行实例化。

传递日期/时间类型

用于传递日期的格式为 yyyy/MM/dd HH:mm:ss.S z

示例:

值转换为日历 Java 对象时,它会保留时区,并且不执行任何其他修改(如将其调整为服务器时区)。

传递布尔值类型

“布尔值”类型的有效值为 truefalse(不考虑大小写)。

示例:

<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,那么无需指定类型。

传递 XMLDocument 类型

XML 文档作为 XML 转义字符串传递。

示例:

<value> <![CDATA[ <?xml version="1.0"?> <Customer> <Name>John Doe</Name> <Description>Married</Description> <Age>30</Age> </Customer> ]]> </value>

传递 XMLElement 类型

XML 元素作为 XML 转义字符串传递。

示例:

<value> <![CDATA[ <Customer> <Name>John Doe</Name> <Description>Married</Description> <Age>30</Age> </Customer> ]]> </value>

传递 XMLNodeList 类型

每个节点作为 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>

传递 ANY 类型

Undercover Agent 的输入参数类型声明为 ANY 时,必须将有关实际类型的信息作为 XML 一部分传递。

示例:

使用一个输入参数 Name 和类型 ANY 来定义进程。数据以 XML 格式编码时,实际类型必须作为 type 属性的值提供。如果未传递类型,将假定类型为 String

<value type="String"> John Doe </value>