骡子 - 混合交换模式

时间:2014-03-26 13:27:29

标签: mule

我试图了解当我混合交换模式时会发生什么。

如果我使用单向出站端点调用vm请求 - 响应入站端点,则没有错误,但看起来似乎流程从未运行,例如:

    <flow name="main" doc:name="main" processingStrategy="asynchronous">
        <poll frequency="60000">
            <set-payload value="main"></set-payload>
        </poll>
        <set-variable value="xxx" variableName="var1"></set-variable>
        <logger level="ERROR" message="MAIN1 #[flowVars.var1]" />

        <vm:outbound-endpoint address="vm://vm" />
        <logger level="ERROR" message="MAIN2 #[flowVars.var1]" />
    </flow>


    <flow name="p1">
        <vm:inbound-endpoint address="vm://vm" exchange-pattern="request-response" />
        <logger level="ERROR" message="PRIVATE #[flowVars.var1]" />
    </flow>
</mule>

此配置记录以下内容,但从不打印“PRIVATE xxx”。

ERROR 2014-03-26 13:22:35,794 [[test] .main.stage1.01] org.mule.api.processor.LoggerMessageProcessor:MAIN1 xxx ERROR 2014-03-26 13:22:35,812 [[test] .main.stage1.01] org.mule.api.processor.LoggerMessageProcessor:MAIN2 xxx INFO 2014-03-26 13:22:35,816 [[test] .connector.VM.mule.default.dispatcher.01] org.mule.lifecycle.AbstractLifecycleManager:Initialising:'connector.VM.mule.default.dispatcher.784920740 ”。对象是:VMMessageDispatcher INFO 2014-03-26 13:22:35,817 [[test] .connector.VM.mule.default.dispatcher.01] org.mule.lifecycle.AbstractLifecycleManager:Starting:'connector.VM.mule.default.dispatcher.784920740 ”。对象是:VMMessageDispatcher

如果我混合它们,MAIN2 xxx的其他方式永远不会打印。有人能解释一下这里到底发生了什么吗?

2 个答案:

答案 0 :(得分:1)

Mule docs声明如下:

  

请求 - 响应:

     

使用请求 - 响应端点时,消息是   直接从出站虚拟机端点传送到入站虚拟机   正在侦听同一路径的端点。此交付阻止   并发生在同一个线程中。如果没有入站请求 - 响应   然后,在同一个Mule应用程序中监听此路径的vm端点   从出站端点调度消息将失败。

     

单向:

     

使用单向端点时,会将消息传递给   通过队列对应的入站端点。这个交付是   无阻塞。如果同一个Mule中没有入站单向端点   应用程序在这条路径上侦听,然后,虽然调度了   消息将成功,消息将保留在队列中。通过   默认情况下,此队列在内存中,但也可以进行配置   一个持久队列,它将使用文件系统作为其持久性   机构。

http://www.mulesoft.org/documentation/display/current/VM+Transport+Reference

我猜想请求 - 响应出站的情况只是等待响应,因为消息被调度和接收与文档相反。

答案 1 :(得分:0)

我不是故意粗鲁,但以这种方式混合交换模式是没有意义的。我相信人们永远不应该做这样的事情。实际上,最好在vm端点上全局配置交换模式,这样就可以获得一致的端点,并且不会出错。

<vm:endpoint name="vm-endp" path="vm-endp" exchange-pattern="request-response" />

<flow name="main" doc:name="main" processingStrategy="asynchronous">
    <http:inbound-endpoint exchange-pattern="one-way" name="http-endpoint" host="localhost" port="2003" path="mule" doc:name="HTTP"/>
    <set-variable variableName="var1"  value="xxx"  doc:name="XXX" />
    <logger level="INFO" message="MAIN1 #[flowVars.var1]" />
    <set-payload value="#[flowVars.var1]" />
    <vm:outbound-endpoint ref="vm-endp" />
    <logger level="INFO" message="MAIN2 #[flowVars.var1]" />
    <logger level="INFO" message="PAYLOAD #[message.payloadAs(java.lang.String)]" />
</flow>

<!-- flowVars are FLOW VARIABLES, hence they're not accessible from multiple flows -->

<flow name="flow">
    <vm:inbound-endpoint ref="vm-endp" />
    <logger level="INFO" message="PRIVATE #[flowVars.var1]" />
    <append-string-transformer message=" added to the payload" />
</flow>

应输出:

INFO [[VMtest].main.stage1.01] org.mule.api.processor.LoggerMessageProcessor: MAIN1 xxx
INFO [[VMtest].main.stage1.01] org.mule.lifecycle.AbstractLifecycleManager: Initialising: 'connector.VM.mule.default.dispatcher.1221995064'. Object is: VMMessageDispatcher
INFO [[VMtest].main.stage1.01] org.mule.lifecycle.AbstractLifecycleManager: Starting: 'connector.VM.mule.default.dispatcher.1221995064'. Object is: VMMessageDispatcher
INFO [[VMtest].main.stage1.01] org.mule.api.processor.LoggerMessageProcessor: PRIVATE null
INFO [[VMtest].main.stage1.01] org.mule.api.processor.LoggerMessageProcessor: MAIN2 xxx
INFO [[VMtest].main.stage1.01] org.mule.api.processor.LoggerMessageProcessor: PAYLOAD xxx added to the payload