65.9K
CodeProject 正在变化。 阅读更多。
Home

MuleSoft 变量示例

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2017 年 2 月 7 日

CPOL

13分钟阅读

viewsIcon

22554

downloadIcon

143

MuleSoft 为开发人员提供了良好的文档结构,以了解其变量和属性的类型。但正如我们所知,阅读和理解概念固然好,但没有什么比亲自动手,在实验室练习中进行实践更能让你掌握。从经验中学习

Complete Solution Diagram

引言

MuleSoft 为开发人员提供了良好的文档结构,以了解其变量和属性的类型。但正如我们所知,阅读和理解概念固然好,但没有什么比亲自动手,在实验室练习中进行实践更能让你掌握。从经验中学习是让知识和概念牢牢印在脑海中的方法。本文将通过一个分步练习,介绍如何在 MuleSoft 中创建/设置某些变量和属性,以及它们在 MuleSoft 应用程序中的存在范围。

背景

有一些背景文章可以帮助读者更深入地理解正在讨论的基本概念。只需点击下面的超链接,您将进入 MuleSoft 关于变量和消息属性的文档。您需要安装 Anypoint Studio 才能进行此实验室练习。

实验室练习

示例源代码已附加到本文顶部。我将逐步讲解所使用的设置和代码,以便您了解代码执行的机制。

所有可供用户设置变量或属性的元素

如果您转到 Anypoint Studio 的右侧窗格,您会看到一个名为“Mule Palette”的停靠窗口。如果您在上述停靠窗口的文本框中键入“set”一词,您将看到以下选定的 mule 元素。

setMulePallete

从上到下,这些元素将在下面进行阐述

设置负载元素

此元素修改 mule 消息的负载,mule 消息的负载是正在传输的基本数据。下图显示了一个红圈,突出显示了正在修改的 mule 消息部分。

MuleMessagePayload

负载是传递给不同端点以供消费的数据。Mule 允许我们通过“设置负载元素”来设置、修改、添加和丰富消息的负载。

设置属性元素

“设置属性元素”允许用户设置 mule 消息的出站属性。重要的是要理解,mule 消息的所有入站属性都是不可变的,因此开发人员只能设置出站属性。源 mule 流程中的出站属性在传递到另一个 mule 流程时会成为入站属性。如果程序员在将消息传递到不同流程时没有显式地将属性从入站复制到出站,那么属性的值最终会在传输过程中丢失。下图显示了一个红圈,突出显示了 mule 消息属性中可写的部分。与负载不同,入站和出站消息属性是描述负载的数据,而不是在不同端点之间传递的负载本身。它们用于告知端点如何期望消息负载,它们用于描述负载。

MuleMessageOutbound

设置记录变量元素

记录变量用于批处理流程,关于它们的讨论超出了本文的范围。您可以通过以下链接阅读更多关于记录变量的信息。

设置会话变量元素

事情变得非常棘手。会话变量是在穿越传输时仍会保持其值的变量,但并非所有类型的会话都支持穿越传输的范围。在接下来的实验中,用户将了解允许穿越传输的会话类型以及不允许的会话类型。设置会话变量后,程序员可以通过以下“Mule 表达式语言”(MEL) 访问它们。

//
// sessionVar is the object that is accessible by MEL to allow programtical access to declared session variables
//
#[sessionVars.flow1SessionVariable="Some Value to be passed around transport"] 
...

设置变量元素

“设置变量元素”隐含地表示程序员正在尝试在执行期间设置一个流变量。您可以将流变量看作是函数或方法中的局部变量,一旦执行离开函数或方法,局部变量就无法再访问。设置流变量后,程序员可以通过以下“Mule 表达式语言”(MEL) 访问它们。

//
// flowVar is the object that is accessible by MEL to allow programtical access to declared flow variables
//
#[flowVar.flow1SessionVariable="Some Value to be passed around a flow"] 
...

创建流程 1

下图描绘了流程 1 的完整结构。

Complete Structure of Flow 1

我将从左到右逐一讲解流程中的每个组件,因为从左到右是运行时实际的程序执行顺序。下图显示了 flow1 中第一个组件的设置。

flow1SettingOutboundProp

图 Flow 1 Element 1

此“Mule 元素”中有 3 个操作:“设置属性”用于设置具有名称和值的新属性,“删除属性”用于从 mule 消息中删除具有特定名称的出站属性,而“复制属性”用于将入站属性(具有不可变值)复制到可变的出站属性。“Figure Flow 1 Element 1”显示我创建了一个名为“from”的新出站属性,并将其值设置为“PostedBYFlow1”。

flow1SettingFlowVar

图 Flow 1 Element 2

“Figure Flow 1 Element 2”中描绘的“Mule 元素”中有 2 个操作:名为“设置变量”用于设置具有名称和值的新流变量,“删除变量”用于从 mule 消息中删除具有特定名称的流变量。“Figure Flow 1 Element 2”显示我创建了一个名为“localVariableFlow1”的新流变量,并将其值设置为“Flow1 Local Variable”。

flow1SettingSessionVar

图 Flow 1 Element 3

图 Flow 1 Element 3 中描绘的第三个“Mule 元素”中有 2 个操作:“设置会话变量”用于设置具有名称和值的新会话变量,“删除会话变量”用于从 mule 消息中删除具有特定名称的会话变量。“Figure Flow 1 Element 3”显示我创建了一个名为“flow1SessionVariable”的新会话变量,并将其值设置为“flow1 Session variable”。

Flow1Logger

图 Flow 1 Element 4

“Figure Flow 1 Element 4”描绘了一个 Logger Mule Element。顾名思义,它用于创建日志数据。在这里,我们将把日志数据输出到 Anypoint 控制台。消息文本框包含 MEL(Mule 表达式语言),用于显示前面 mule 元素中设置的值。以下代码片段是输入到 Message 文本框中的值。

#["\n"] Logging from flow1: flow1: #["\n"] inboundProperties.from=#[message.inboundProperties.from]  #["\n"] Payload=#[message.payloadAs(java.lang.String)] #["\n"] outboundProperties.from=#[message.outboundProperties.from] #["\n"] flowVars.localVariableFlow1=#[flowVars.localVariableFlow1] #["\n"] sessionVars.flow1SessionVariable=#[sessionVars.flow1SessionVariable] #["\n"] 

MEL 代码片段将产生以下示例控制台输出消息。

INFO  2017-02-07 22:37:16,854 [[variabledemo].HTTP_Listener_Configuration.worker.01] org.mule.api.processor.LoggerMessageProcessor: 

 Logging from flow1: flow1: 

 inboundProperties.from=PostedBYKian  

 Payload={"name":"samplePayload"} 

 outboundProperties.from=PostedBYFlow1 

 flowVars.localVariableFlow1=Flow1 Local Variable 

 sessionVars.flow1SessionVariable=flow1 Session variable

flow1Elem5

图 Flow 1 Element 5

“Figure Flow 1 Element 5”描绘了一个到 VM 端点 的调用。选择请求-响应单选按钮,以便 flow1 在 VM 端点的实现返回控制之前会等待,然后再继续其程序执行。如果程序员选择单向,则“flow1”不会等待 VM 端点的响应,而是以异步模式继续其执行。在“Queue Path”文本框中输入“flow3”,该信息将在创建“flow3”时使用。保留所有其他设置的默认值。

Flow 1 的元素 6 是“Figure Flow 1 Element 4”的精确副本,它是一个日志元素,具有与元素 4 相同的输出和相同的设置。放置日志元素的原因是为了检查在跨 VM 传输调用返回到“flow1”后,哪些属性和变量仍然可访问。

flow1Elem7

图 Flow 1 Element 7

“Figure Flow 1 Element 7”描绘了一个到 HTTP 端点 的调用。默认情况下,这类端点是请求-响应的,这意味着 flow1 会在 HTTP 端点的实现返回控制之前等待,然后再继续其程序执行。在“Path”文本框中输入“flow2”,并选择“Method”为“POST”,该信息将在构造“flow2”时使用。保留所有其他设置的默认值。

Flow 1 的元素 8 是“Figure Flow 1 Element 4”的精确副本,它是一个日志元素,具有与元素 4 相同的输出和相同的设置。放置日志元素的原因是为了检查在穿越 VM 传输和 HTTP 传输后,哪些属性和变量仍然可访问。

flow1Elem9

图 Flow 1 Element 9

“Figure Flow 1 Element 9”描绘了一个 Logger Mule Element。它与“Figure Flow 1 Element 4”相同,唯一的区别是它记录了“flow2”的变量和属性。以下代码片段是输入到 Message 文本框中的值。

#["\n"] Logging from flow 1 after control is returned from VM and HTTP endpoint: flow2: #["\n"] inboundProperties.from=#[message.inboundProperties.from]  #["\n"] Payload=#[message.payloadAs(java.lang.String)] #["\n"] outboundProperties.from=#[message.outboundProperties.from] #["\n"] flowVars.localVariableFlow2=#[flowVars.localVariableFlow2] #["\n"] sessionVars.flow2SessionVariable=#[sessionVars.flow2SessionVariable] #["\n"] 

MEL 代码片段将产生以下示例控制台输出消息。

INFO  2017-02-07 23:18:50,385 [[variabledemo].HTTP_Listener_Configuration.worker.01] org.mule.api.processor.LoggerMessageProcessor: 

 Logging from flow 1 after control is returned from VM and HTTP endpoint: flow2: 

 inboundProperties.from=PostedBYFlow2  

 Payload=<!--?xml version='1.0' encoding='windows-1252'?--> 

<name>samplePayload</name> 

 outboundProperties.from=null 

 flowVars.localVariableFlow2=null 

 sessionVars.flow2SessionVariable=null

Flow 1 的元素 10 是“Figure Flow 1 Element 5”的精确副本,它是一个 VM 端点元素,具有与 flow 1 元素 5 相同的设置。之所以将其放置在执行控制穿越 HTTP 传输之后,是为了让我们能够看到 mule 消息的入站和出站属性的行为,以及在它们穿越多个不同传输后的情况。

创建流程 2

下图描绘了流程 2 的完整结构。

Complete Structure of Flow 2

“Flow 2 element number 1”是一个 HTTP 接收端点。“quot;Figure Flow 2 Element 1" 显示了上述 mule 元素的设置。Path 设置为“flow2”(就像在 flow1 中一样,Path 将设置为“flow1”)

flow2Elem1

图 Flow 2 Element 1

不要在“Allowed method”文本框中设置任何内容,以免限制 HTTP 接收端点的操作。

flow2Elem2

图 Flow 2 Element 2

“Flow 2 element number 2”是一个出站属性设置器,与“Figure Flow 1 Element 1”相同。只不过这里它用于设置“flow2”的出站属性。您永远无法设置或修改传递到 flow2 的 mule 消息的入站属性。在此练习中,入站属性为“from”,因此此元素实质上是为 flow2 mule 消息设置了一个名为“from”的新出站属性。

flow2Elem3

图 Flow 2 Element 3

“Flow 2 element number 3”是一个流变量设置器,与“Figure Flow 1 Element 2”相同。只不过这里它用于设置“flow2”的局部变量。这里的局部流变量名为“localVariableFlow2”。您可以使用与“Figure Flow 1 Element 2”中指定的相同 MEL 来访问它。

flow2Elem4

图 Flow 2 Element 4

“Flow 2 element number 4”是一个会话变量设置器,与“Figure Flow 1 Element 3”相同。只不过这里它用于设置“flow2”的会话变量。这里的会话变量名为“flow2SessionVariable”。您可以使用与“Figure Flow 1 Element 3”中指定的相同 MEL 来访问它。

“Flow 2 element number 5”是“flow1”中相同日志元素的副本。它被放置在 flow 中,用于打印 flow1 的属性和变量,以便我们能够看到属性和变量在穿越 HTTP 传输到 flow2 后在 flow1 中的命运。

flow2Elem6

图 Flow 2 Element 6

“Flow 2 element number 6”是一个 Data Weave 转换 mule 元素,突出显示的黄色文本是转换脚本。它本质上是将 json 负载转换为 XML 负载,如果您想知道的话,是的,我们只需要 3 行代码就可以完成转换。

“Flow 2 element number 7”是“flow1”中相同日志元素的副本。它被放置在 flow 中,用于打印 flow2 的属性和变量。这样做是为了让我们能够看到正在创建的 flow2 变量的值,同时也用于测试 flow2 会话变量是否在控制权交还给 flow1 时穿越传输。

创建流程 3

下图描绘了流程 3 的完整结构。

Complete Structure of Flow 3

“Flow 3”描绘了 VM 端点的实现,元素 2 和 3 是 flow1 中创建的日志元素的副本。

flow3elem1

图 Flow 3 Element 1

“Flow 3 element number 1”是 flow1 中引用的出站 VM 端点的实现。Path 文本框必须设置为“flow3”,这样它才能处理 flow1 发送的消息。

运行时执行流程

这是有趣的部分。这是 MuleSoft 向您展示不同属性和变量在运行时如何表现的部分。它向您展示了哪些变量可以穿越传输,哪些不能,所以让我们深入研究。遵循列出的步骤测试创建的 mule 应用程序。我们将使用 postman 将 JSON 消息发布到 flow1

测试步骤

  1. 启动 mule 应用程序。
  2. 选择 Header 选项卡,在 postman 中输入突出显示的文本。

    postman

    图 Postman Input
  3. 选择 Body 选项卡,在 postman 中输入突出显示的文本。

    postman2

    图 Postman Input 2
  4. 在 postman 中单击发送按钮,然后执行完成。观察返回值,mule 应用程序已将 json 负载转换为 XML 负载并将其返回给 postman。

    postman3

    图 Postman Output
  5. 从 Anypoint studio 收集日志。

执行日志分析

1. flow 1 中所有新属性和变量的第一个日志。

在 flow1 中

 Logging from flow1: flow1: 

 inboundProperties.from=PostedBYKian 
 
 Payload={"name":"samplePayload"} 

 outboundProperties.from=PostedBYFlow1 

 flowVars.localVariableFlow1=Flow1 Local Variable 

 sessionVars.flow1SessionVariable=flow1 Session variable

2. 打印 flow1flow2 的变量和属性,但请注意 flow2 尚未被调用,因此打印的入站属性属于传递到 flow3(由 flow1)的同一 mule 消息,并且如前文所述,flow 1 中设置的出站属性现在已转换为 flow3 的入站属性。这里值得注意的是,在 flow1 中创建的“flow1SessionVariable”并没有与其 mule 消息一起传递给 flow3这是会话变量穿越 VM 传输的一个例子。

在 flow3 中

 Logging from flow 3 : flow1: 

 inboundProperties.from=PostedBYFlow1  

 Payload={"name":"samplePayload"} 

 outboundProperties.from=null 

 flowVars.localVariableFlow1=null 

 sessionVars.flow1SessionVariable=flow1 Session variable 


 
 Logging from flow 3: flow2: 

 inboundProperties.from=PostedBYFlow1  

 Payload={"name":"samplePayload"} 

 outboundProperties.from=null 

 flowVars.localVariableFlow2=null 

 sessionVars.flow2SessionVariable=null

3. flow3 完成执行后,控制权已返回到 flow 1。请注意,“from”属性已丢失,因为它在 flow3 中未被复制。消息负载保持不变。Flow1 的会话和局部变量在从 flow3 返回执行控制后仍然保留其值。

在 flow1 中

 Logging from flow1 after return from Flow 3: flow1: 

 inboundProperties.from=null  

 Payload={"name":"samplePayload"} 

 outboundProperties.from=null 

 flowVars.localVariableFlow1=Flow1 Local Variable 

 sessionVars.flow1SessionVariable=flow1 Session variable

4. flow1 现在调用由 flow2 实现的 HTTP 端点。请注意,“from”入站属性在 flow1 的 mule 消息中已不再可用,因为它在从 flow3 翻译过程中丢失了。另一点值得注意的是,在 flow1 中设置的会话变量无法跨越到 flow2这意味着会话变量只能跨越某些传输,而不是所有传输。在这种情况下,它无法跨越 HTTP 传输

在 flow2 中

 Logging from flow 2 : flow1: 

 inboundProperties.from=null  

 Payload={"name":"samplePayload"} 

 outboundProperties.from=PostedBYFlow2 

 flowVars.localVariableFlow1=null 

 sessionVars.flow1SessionVariable=null 


 
 Logging from flow 2: flow2: 

 inboundProperties.from=null 
 
 Payload=<?xml version='1.0' encoding='windows-1252'?> <name>samplePayload</name> 

 outboundProperties.from=PostedBYFlow2 

 flowVars.localVariableFlow2=Flow2 Local Variable 

 sessionVars.flow2SessionVariable=flow2 Session variable

5. 在 flow2 完成运行后,运行时执行控制流已返回到 flow1Flow2 的出站属性到达 flow1 时并未成为入站属性。Flow1 的会话和局部变量仍然可访问,但 flow2 的会话变量无法跨越传输到达 flow1

在 flow1 中

 Logging from flow1 after control return from VM and HTTP end points: flow1: 

 inboundProperties.from=PostedBYFlow2  

  Payload=<?xml version='1.0' encoding='windows-1252'?> <name>samplePayload</name> 

 outboundProperties.from=null 

 flowVars.localVariableFlow1=Flow1 Local Variable 

 sessionVars.flow1SessionVariable=flow1 Session variable 


 
 Logging from flow 1 after control is returned from VM and HTTP endpoint: flow2: 

 inboundProperties.from=PostedBYFlow2  

 Payload=<?xml version='1.0' encoding='windows-1252'?> <name>samplePayload</name> 

 outboundProperties.from=null 

 flowVars.localVariableFlow2=null 

 sessionVars.flow2SessionVariable=null

6. 最后,flow1 中的最后一步是再次调用 flow3,以查看 flow1flow2 的会话变量。只有来自 flow1 的会话变量才会被传递到 flow3

在 flow3 中

 Logging from flow 3 : flow1: 

 inboundProperties.from=null  

 Payload=<?xml version='1.0' encoding='windows-1252'?> <name>samplePayload</name> 

 outboundProperties.from=null 

 flowVars.localVariableFlow1=null 

 sessionVars.flow1SessionVariable=flow1 Session variable 


 
 Logging from flow 3: flow2: 

 inboundProperties.from=null  

 Payload=<?xml version='1.0' encoding='windows-1252'?> <name>samplePayload</name> 

 outboundProperties.from=null 

 flowVars.localVariableFlow2=null 

 sessionVars.flow2SessionVariable=null

结论

从这个实验室练习中,我们可以得出以下几点结论。

  • 会话变量 - 仅能穿越某些传输,但并非所有传输。在此实验中,我们已证明会话变量能够穿越 VM 传输,但无法穿越 HTTP 传输。
  • 流变量 - 类似于函数和方法中创建的变量,一旦执行超出范围,就无法再访问。
  • 出站属性 - 能够穿越传输,但程序员必须记住,如果他们希望在不同传输之间保留属性值,则必须将其从入站属性复制到出站属性。
© . All rights reserved.