Mule消息转换
Mule消息转换
为了更好的理解Mule消息处理器的运作,可以对处理前后的消息进行查看。转换器对消息负载进行转换,即可以是数据结构的转换也可以是数据格式的转换:从JSON到Java对象,Map到CSV或者Java对象到XML。观察前后的变化有助于理解Mule是如何对消息内容进行操的作:变更,删除或者添加,以便在流程图中进一步对消息进行处理。
本文用到了Mule消息结构一文中的应用示例相类似的应用,用来验看消息通过流程图中的消息转换组件(DataWeave)时的表现。在Anypoint Studio中以调试模式运行该程序,通过可视化调试器来查看断点处的节点消息中的内在结构。
背景
本文通过在Mule的图形界面Anypoint Studio中运行的示例程序来对细节进行说明。其中会结合XML配置以及Studio的界面截图。阅读本文前请确保你已熟悉了Mule和Anypoint Studio的界面,并且已经阅读了Mule消息结构一文,已理解了Mule消息的概念。
通过示例理解Mule消息
为了理解Mule消息,本文使用了将CSV文件转换成Salesforce联系人数据的示例程序。
简言之,文件节点从输入目录中每隔10秒轮询新的文件。当发现新的文件,会读取其中内容并将其传给消息转换器组件,该组件使用DataWeave代码对消息负载进行转换。该组件在将CSV的内容格式化成集合的同时将CSV文件中的字段(譬如FirstName,LastName等等)映射成Salesforce所需的字段。每个组映射都会用箭头连接线显示对应关系,来帮助用户可视化的理解映射的逻辑。在将文件中的内容转换到Salesforce可以接收的集合对象后,通过Salesforce连接器推送到你的Salesforce账号中。通过连接器的配置来指定"操作"为"创建
"、"s对象类型"为"联系人
",以指示连接器将数据上传到Salesforce,创建新的联系人。

消息转换前
正如在Mule消息结构文中所述,消息包含了两个重要的部分
-
消息头部,其中包含有属性
-
消息的负载,包含了Mule要处理的数据
Mue消息对象,包含着Mue消息,也可能包含变量。下面列出了上例中的消息的头部,负载和变量在消息进入转换组件之前的状态
为了查看消息的头部和负载信息,我们在应用的消息处理器中设置断点,然后在Studio的调试模式运行应用。Studio的可视化调试器显示消息的头部信息,而位于设计界面的下部的Mule调试器Console则会显示消息的负载信息。
更多关于如何查看消息内容的说明:可视化调试器
消息头部
下图的Mule消息显示的是存在于消息头部中的数据(比如元数据)。这个例子中,可以看到消息的身份信息,还可以看到是否带有附件(若带有附件会以数组形式呈现)。
注意Name为Message Processor
,Value为Transform Message
的这一项。Message Processor 项代表着当前消息在flow中的下一个消息处理器。

消息负载
下图中payload是包含了消息的负载,或者说包含了Mule应用处理的数据。在消息通过Transform Message组件之前,负载包含了CSV文件,Name是currentFile
,Type是java.io.File

属性
可视化调试器 在消息进入Transform Message组件时候,还会显示消息中的所有传入和传出数据。传入属性是与负载相关的元数据,包括文件名、时间戳以及进入的节点(例子里是MULE_ORIGINATING_ENDPOINT)。传入属性是只读的,并且无法通过应用中的消息处理器添加删除或复制。

类似的,传出属性显示了有关于负载的信息,但是可以被应用中的消息处理器删除或复制。

变量
可视化调试器 显示了进入Transform Message组件消息的所有的变量或者session变量。流程图中文件节点在消息中设置了两个变量,一个是指示Transform Message组件处理后的文件的移动位置,另一个是指示轮询目录请求新数据的时间间隔。

没有被设置的Session变量

消息转换后
这个应用中的Transform Message组件的任务是将CSV文件中的内容转换成Salesforce能够处理的Java对象。并且会将文件中不同字段的值转换到对应的Salesforce中的属性,比如将Name字段抓暖到Salesforce的contract属性。下面的图中会显示消息在经过该组件后的内容。
消息头部
消息头部的内容没有变化

消息负载
消息的负载发生了巨大的变化!变成了来自CSV文件的联系人信息,以一个包含map元素的array list的形式存在。每一个map代表了CSV中的一行,展开map元素可以看到包含每行记录对于值的键值对。


属性
Mule消息处理器不能对传入属性进行添加,删除或其他操作。所以传入属性没有发生变化。

组件也没有对消息的传出属性做出任何的修改。

变量
Transform Message组件没有对变量和session变量做改动


更多示例
在消息中设置一个变量
流程图中的变量转换器在消息中设置了一个minPrice变量,其值是消息的负载。还记得界面的中Message Processor指的是flow中下一个处理组件吧?
<flow>
...
<set-variable doc:name="Variable" value="#[payload]" variableName="minPrice"/>
...
</flow>
进入属性转换器前

进入属性转换器后

设置消息中的属性
流程图中的属性转换器在消息中设置了size属性,其值是small。(原文有错误)
进入属性转换器前

进入属性转换器后

设置消息的负载
<flow>
...
<set-payload doc:name="change payload" value="Hello, World."/>
...
</flow>
Flow中的负载转换器将消息的负载替换成了字符串:"Hello, World."(原文代码片段missing)
进入属性转换器前

进入属性转换器后

学习使用MEL表达式可以查看同flow或其他flow中设置的消息属性和变量。
查看Mule消息结构一文中的头部设置和使用属性与变量