2014-03-26 105 views
1

我想了解什麼是當我混合交換模式。騾 - 混合交換模式

如果我調用了那些路出站端點虛擬機請求 - 響應入站終點,沒有錯誤,但好像流從未例如運行出現:

<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:初始化:'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從來沒有打印。有人能解釋這裏發生了什麼嗎?

回答

1

騾文檔聲明如下:

請求 - 響應:

當使用請求 - 響應端點,消息是 直接從出站VM端點傳遞到正在監聽的入站VM 端點在同一條路上。此交貨阻止了 併發生在同一個線程中。如果在監聽該路徑的相同Mule應用程序中沒有入站請求 - 響應 vm端點,則從出站端點調度消息將失敗。

單向:

當使用單向端點,消息通過一個隊列傳遞到 相應的入站端點。這種交付是非阻塞的 。如果在該路徑上監聽的相同Mule 應用程序中沒有入站單向端點,則儘管分派 消息將成功,但該消息仍將保留在隊列中。默認情況下,該隊列在內存中,但也可以配置一個持久隊列,該隊列將使用文件系統作爲其持久性 機制。

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

我猜想與請求 - 響應出站的情況下,只需保持等待響應,因爲消息被分派並獲得違背了文檔。

0

我的意思不是粗魯,但這樣混合echange模式沒有意義。我相信一個人不應該這樣做。實際上,最好在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