MULE 消息增强Message Enricher简单使用例子

工具版本
mule-standalone3.9.0
Anypoint-Studio6.4.0

写在前面
本例子使用Message Enricher元素对消息内容进行”增强”(改变),在Enricher使用中,比较容器模糊的是元素配置中关于sourcetarget指的究竟是什么东西,且该两处内容一般使用MEL表达式进行设置,理解出错则表达式难以编写。
Message Enricher配置初始界面
这些都离不开对Message Enricher的理解,下图解释了Enricher的流程,图源来自图源出处

图中,Basic Message经过Enricher时,与Resource进行了交互,使得经过Enricher处理后变为了Enriched Message,且明显可见多出的橙色部分正是增强的内容。而这增强的东西一般是Resource中附加的。

Message Enricher最重要的特性是不会影响原始payload的内容,且要记住Message Enricher属于SCOPE类型的元素,不能单独使用

在例子中主要分为Main FlowMessageEnricherFlow,后者供前者调用,充当Resource的角色,Main Flow中设置了一个original payloadtarget 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="#['&#25105;&#26159;&#21407;&#22987;payload&#20869;&#23481;']" doc:name="original payload"/>
        <set-variable variableName="targetVar" value="#['&#25105;&#26159;&#30446;&#26631;&#21464;&#37327;']" 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的文章,该文章例子使用到企业版元素

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值