EnjoyingSoft之Mule ESB实施案例开发分享:使用Message Enricher组件

我们在实施Mule ESB的很多案例中,都使用了MuleESB的Message Enricher组件。使用Message Enricher组件最常见的情况就是,在不影响原始的Mule Message或者Payload的情况下,使用其他信息丰富或者扩充Mule Message。Enricher,这个英文单词就是充实,丰富的意思。

如果目标系统需要的信息多于源系统可提供的信息,则需要使用Message Enricher。它通过调用外部系统或者对原始的Mule Message 进行一些转换,并将其结果保存到某个变量中,变量的范围可以是session, outbound, or invocation等。Message Enricher组件的转换并不会影响原始的Mule Message或者Payload。Message Enricher组件中的Set-property操作,可以通过MEL表达式从Mule Message或者Payload中提取信息,并对这些信息进行计算或者转换,并将计算或者转换的结果,保存到变量中。

使用场景

Message Enricher组件用来执行交互,例如调用外部资源(如Outbound Endpoint等)并将结果返回到主流程。外部资源返回的附加信息可以添加到现有Mule Message或者Payload中。

Message Enricher组件使用当前的Mule Message去执行特定任务,但不会改变原始的Mule Message。Message Enricher最适用于您不想丢失现有的Mule Messsage或者Payload的情况。

举例:在项目的Mule Flow中,您需要在Flow中间使用HTTP请求组件调用外部服务,并从HTTP外部服务获得响应,这个时候你会发现当前的Payload已经变成了外部服务的响应。如果你不想改变原始Mule Message中的Payload,那么我们可以将 HTTP请求组件包装在Message Enricher中,它将调用外部服务,并将外部服务的响应存储到变量中,并且不会修改现有的Payload。

Message Enricher组件如何工作?

下面是Message Enricher组件的工作流程。

  • Enricher组件将原始Mule Message的副本发送到其内部的Processor进行处理。
  • 原始的Mule Message等待Processor执行。
  • Processor执行完成,执行返回的结果是一条Mule Message。
  • 执行结果(Mule Message)的一部分被添加到原始的Mule Message中。
  • 被扩充后的原始Mule Message继续由下一个组件继续执行。

Mule Message被丰富(或者说是修改)的方式是通过使用Mule表达式配置Source(源)-> Target(目标)的映射。Mule表达式用于从内部Processor执行返回的结果中选择要提取的值,并定义将此值插入到目标中的位置。默认的Source(源)是Processor执行返回的结果中的Payload。

Message Enricher示例

让我们来看看如何在Mule应用程序中使用Mule Message Enricher组件。在这个示例中,我们通过REST客户端进行HTTP调用,HTTP Request是一段JSON,JSON中包含员工的ID和员工的角色数据。我们的目标是在源JSON数据中添加员工的姓名,并返回给REST客户端。为此,我们将调用数据库以获取有关员工的姓名信息,并将其添加到源JSON中以发送回用户。

Mule UI Config:

XML Config:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:dw="http://www.mulesoft.org/schema/mule/ee/dw" xmlns:db="http://www.mulesoft.org/schema/mule/db" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
xmlns:spring="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/db http://www.mulesoft.org/schema/mule/db/current/mule-db.xsd
http://www.mulesoft.org/schema/mule/ee/dw http://www.mulesoft.org/schema/mule/ee/dw/current/dw.xsd">

<flow name="message-enricher-flow">
<http:listener config-ref="HTTP_Listener_Configuration" path="/enricher" doc:name="HTTP"/>
<object-to-byte-array-transformer doc:name="Object to Byte Array"/>
<enricher source="#[payload[0].customerName]" target="#[flowVars.customerName]" doc:name="Message Enricher">
<db:select config-ref="MySQL_Configuration" doc:name="Database">
<db:parameterized-query><![CDATA[select customerName from customers where customerNo= #[json:id]]]></db:parameterized-query>
</db:select>
</enricher>
<dw:transform-message doc:name="Transform Message">
<dw:set-payload><![CDATA[%dw 1.0
%output application/json
---
{
"id" : payload.id,
"name" : flowVars.customerName,
"Role": payload.role
}]]></dw:set-payload>
</dw:transform-message>
</flow>
</mule>

使用Postman执行Rest请求:

可以看到请求的Json字符如下:

1
2
3
4
{
"id": "C0001",
"role": "Application Developer"
}

而响应的Json字符如下,通过Message Enricher组件,结合数据库的查询,对数据做了扩充。

1
2
3
4
5
{
"id": "C0001",
"name": "Tencent",
"Role": "Application Developer"
}

访问EnjoyingSoft 网站,获取更多Mule ESB实施案例技术分享。

欢迎转载,但必须保留原文和此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。