我试图了解当我混合交换模式时会发生什么。
如果我使用单向出站端点调用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的其他方式永远不会打印。有人能解释一下这里到底发生了什么吗?
答案 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