多个请求可以覆盖当前使用的流变量吗?

时间:2017-03-22 15:22:49

标签: mule mule-studio

我无法理解我是否在流量上下文中使用了正确的变量。

我有一个通过HTTP端点公开的流,在此流程中我存储有关传入请求的数据,然后继续使用包含流量/子流数据的流变量。

我的问题是,如果我同时有2个请求进入,它们是否会在流链中稍后覆盖流量变量导致问题?

我想避免请求1设置流变量,然后处理数据并继续引用已被请求2中的数据覆盖的流变量。

这是怎么回事?流入的每个流程是否彼此独立?

3 个答案:

答案 0 :(得分:1)

  

如果我有2个请求同时进来,他们基本上会是   在流程链中稍后覆盖流量变量导致问题

即可。变量存储在消息中。对于每个HTTP请求,都将创建一条新消息。

您可以使用以下应用程序轻松自行尝试:

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:scripting="http://www.mulesoft.org/schema/mule/scripting" xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking" 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/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd
http://www.mulesoft.org/schema/mule/scripting http://www.mulesoft.org/schema/mule/scripting/current/mule-scripting.xsd">
    <flow name="foo">
        <http:listener config-ref="user-httpListenerConfig" path="/{test}" doc:name="HTTP"/>
        <set-variable variableName="testVariable" value="#[message.inboundProperties['http.uri.params']['test']]" doc:name="testVariable"/>
        <foreach collection="#[[1,2,3,4,5,6,7,8,9,0]]" doc:name="For Each">
            <logger message="#[flowVars.testVariable]" level="INFO" doc:name="Logger"/>
            <scripting:component doc:name="Groovy">
                <scripting:script engine="Groovy">
                <![CDATA[Thread.sleep(1000)
return payload]]></scripting:script>
            </scripting:component>
        </foreach>
    </flow>
</mule>

这是AnypointStudio中这个应用程序的样子: enter image description here

只需在浏览器中通过一个标签调用http://localhost:8081/foo,然后在另一个标签中调用http://localhost:8081/bar即可。您会在日志中看到foobar交替显示。

答案 1 :(得分:0)

流变量是实例变量,每次为新请求创建它。因此,多个请求不能覆盖流变量,因为每个请求都有自己的实例变量。

答案 2 :(得分:0)

“我的问题是,如果我有2个请求同时进入,它们基本上会覆盖流量变量导致流量链中的问题吗?”
是的,每个新请求新流程实例都将正确创建,并且每个新请求都会初始化变量 每个请求彼此独立,除非您使用某种类型的存储(如Object Store)来保留请求所在的流量变量值。
使用像Object store这样的内存存储,你可以为每个新请求保留变量值,否则每个新请求都会在流中创建新的变量实例