工具 | 版本 |
---|---|
mule-standalone | 3.9.0 |
Anypoint-Studio | 6.4.0 |
写在前面
本例子使用Message Enricher
元素对消息内容进行”增强”(改变),在Enricher使用中,比较容器模糊的是元素配置中关于source
和target
指的究竟是什么东西,且该两处内容一般使用MEL表达式进行设置,理解出错则表达式难以编写。
这些都离不开对Message Enricher
的理解,下图解释了Enricher的流程,图源来自图源出处。
图中,Basic Message
经过Enricher时,与Resource进行了交互,使得经过Enricher处理后变为了Enriched Message
,且明显可见多出的橙色部分正是增强的内容。而这增强的东西一般是Resource中附加的。
Message Enricher最重要的特性是不会影响原始payload的内容,且要记住Message Enricher属于SCOPE类型的元素,不能单独使用
在例子中主要分为Main Flow
和MessageEnricherFlow
,后者供前者调用,充当Resource
的角色,Main Flow中设置了一个original payload
和target variable
,两者均有初始值,用logger记录两者增强前的内容,随后经过Message Enricher
,通过Flow Reference
调用子流MessageEnricherFlow,增强后的内容再次使用logger记录,并使用set payload
在页面上输出流中payload和target variable的值。子流MessageEnricherFlow主要从数据库查询一条记录,并转为json格式,增强的内容就是从该记录中取出附加到目标target variable
中。
Flow结构图
xml文档
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:db="http://www.mulesoft.org/schema/mule/db" xmlns:json="http://www.mulesoft.org/schema/mule/json"
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.mulesoft.org/schema/mule/db http://www.mulesoft.org/schema/mule/db/current/mule-db.xsd
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/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd">
<http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/>
<db:oracle-config name="MY_LOCAL_DB" host="localhost" port="1521" instance="orcl" user="hr" password="hr" doc:name="Oracle Configuration"/>
<flow name="MainFlow">
<http:listener config-ref="HTTP_Listener_Configuration" path="/" doc:name="HTTP"/>
<set-payload value="#['我是原始payload内容']" doc:name="original payload"/>
<set-variable variableName="targetVar" value="#['我是目标变量']" doc:name="target variable"/>
<logger message="#[flowVars.targetVar]" level="INFO" doc:name="Logger"/>
<enricher source="#[json:[0]/FIRST_NAME]" target="#[flowVars.targetVar]" doc:name="Message Enricher">
<flow-ref name="MessageEnricherFlow" doc:name="Flow Reference"/>
</enricher>
<logger message="#[flowVars.targetVar]" level="INFO" doc:name="Logger"/>
<set-payload value="#[payload + '\n' +flowVars.targetVar]" doc:name="Set Payload"/>
</flow>
<sub-flow name="MessageEnricherFlow">
<db:select config-ref="MY_LOCAL_DB" doc:name="Database">
<db:parameterized-query><![CDATA[SELECT * FROM employees WHERE employee_id=101]]></db:parameterized-query>
</db:select>
<json:object-to-json-transformer doc:name="Object to JSON"/>
</sub-flow>
</mule>
数据库查询的记录
运行效果http://localhost:8081/
原始payload和target variable未增强前的内容
两者对比可以看出,使用Message Enricher
处理后,original payload
没有任何改变,而target variable
则由一句话变为数据库记录的FIRST_NAME值。
Message Enricher配置图
可以看到Source的表达式#[json:[0]/FIRST_NAME]
用于获取数据库json数据中第一个记录的FIRST_NAME,Target的表达式正是流变量targetVar,关键就是这里Source从子流MessageEnricherFlow中将json内容获取FRIST_NAME增强到流变量targetVar
,子流扮演者Resource(即配置中source)
的角色。
个人理解:消息增强往往用于不想改变payload内容,但是又想对消息MuleMessage中某部分进行改变时使用的。(如有不对请评论指正)
表达式写不对往往出现错误
:
Execution of the expression "{xxxx}=__object_for_enrichment" failed.
(org.mule.api.expression.ExpressionRuntimeException).
参考资料
:
官方文档
外国大神anirban37的Best Answer
关于scope类型的官方解释
较为详尽例子解释Enricher的文章,该文章例子使用到企业版元素