2017-02-03 53 views
1

我正在努力弄清楚如何使用工作室來解決這個問題,並認爲可能對SO的好用戶有所幫助可能會有所幫助。同步插入數據庫並選擇Web服務

我有一個簡單的web服務,它接受來自客戶端的請求。此請求將執行插入數據庫表的操作,將此數據庫有效地用作消息隊列。單獨的進程會定期輪詢此表,對消息執行附加處理,然後將結果寫入輸出表。數據庫插入和隨後的選擇將通過一個correlationId進行鏈接,我可以將其傳遞,以確保獲得已發送消息的結果。不幸的是,這個將與之整合的軟件需要這種模式才能正常工作。

這裏所需要的工作流程:

的HttpRequest - >插入記錄到表 - >等待(?或poll /重試/等),直到記錄由一個單獨的進程寫入到另一個表(帶同樣的correlationId) - >從這個其他表格返回數據返回httpRequest

這裏是一個樣本流,儘可能接近我已經能夠得到這個。奇怪的是,這個流程確實返回了一個有效載荷,但它似乎總是「1」。我不能完全看到如何使這個流重試數據庫查詢,直到存在一行,然後返回結果行。

我應該如何同步2個數據庫調用?這可能是騾子內部可能有不同的組件組合嗎?

謝謝。

<flow name="mainFlow"> 
    <http:listener config-ref="HTTP_Listener_Configuration" path="hello" doc:name="HTTP"/> 
    <cxf:jaxws-service doc:name="CXF" configuration-ref="CXF_Configuration" serviceClass="kansas.MuleTestServiceImpl"/> 
    <db:insert config-ref="Oracle_Configuration" doc:name="Database"> 
     <db:parameterized-query><![CDATA[insert into tblRequest (id, correlationId) values(#[payload], #[message.correlationId])]]></db:parameterized-query> 
    </db:insert> 
    <until-successful objectStore-ref="MyObjectStore" maxRetries="5" millisBetweenRetries="2000" doc:name="Until Successful" > <!-- failureExpression="???" --> 
     <db:select config-ref="Oracle_Configuration" doc:name="Database"> 
      <db:parameterized-query><![CDATA[select correlationId,msgResponse from tblResponse where correlationId = #[message.correlationId]]]></db:parameterized-query> 
     </db:select> 
    </until-successful> 
    <logger level="INFO" doc:name="Logger" message="#[payload]"/> <!-- why is payload always = 1? --> 
</flow> 

enter image description here

回答

0

騾子是偉大的工具,但它使你的生活太容易了。有時候你很容易忘記簡單的事情。

在你的情況下,你忘記了有效載荷是一個對象,它是最後一個組件的結果。只需一輛手推車就可以將流量想象爲軌道。無論您在最後一站加載什麼,都會傳送到下一個站。然後處理重複。最初傳送到電臺的內容並不重要。重要的是你加載。

在你的情況下,首先數據庫組件具有來自CXF的原始有效載荷並將某些內容存儲在數據庫中。它返回1的INSERT語句的結果 - 插入一行。所以我們的有效載荷能夠提供新的貨物 - 1.

但是您需要來自CXF的原始有效載荷。在哪兒?它消失了 - 我們只有一條流,一條小徑,一輛車。

在這種情況下該做什麼?將所需信息保留在購物車中,但不要放在其他地方。例如在流量變量中。將原始有效負載存儲在某個變量中,然後在需要時再恢復它。像這樣

<flow name="mainFlow"> 
    <http:listener config-ref="HTTP_Listener_Configuration" path="hello" doc:name="HTTP"/> 
    <cxf:jaxws-service doc:name="CXF" configuration-ref="CXF_Configuration" serviceClass="kansas.MuleTestServiceImpl"/> 
     <set-variable variableName="storedPaylod" value="#[payload]" doc:name="Store original payload"/> 
    <db:insert config-ref="Oracle_Configuration" doc:name="Database"> 
     <db:parameterized-query><![CDATA[insert into tblRequest (id, correlationId) values(#[payload], #[message.correlationId])]]></db:parameterized-query> 
    </db:insert> 
     <set-payload value="#[flowVars.storedPaylod]" doc:name="Restore Payload"/> 
    <until-successful objectStore-ref="MyObjectStore" maxRetries="5" millisBetweenRetries="2000" doc:name="Until Successful" > <!-- failureExpression="???" --> 
     <db:select config-ref="Oracle_Configuration" doc:name="Database"> 
      <db:parameterized-query><![CDATA[select correlationId,msgResponse from tblResponse where correlationId = #[message.correlationId]]]></db:parameterized-query> 
     </db:select> 
    </until-successful> 
    <logger level="INFO" doc:name="Logger" message="#[payload]"/> <!-- why is payload always = 1? --> 
</flow> 

enter image description here

好主意將是檢查第一數據庫組件真返回1 - 記錄插入。做到這一點,在錯誤上產生警報,然後恢復原始有效負載並繼續流動。

+0

感謝你爲這個。這個比喻肯定有很大的幫助,並且可以讓我解決一些與此有關的問題。我想我可能在解釋我遇到的問題方面做得不好。我的主要問題是「同步2個數據庫調用」基本上,「直到成功」組件(或者可能是一個不同的組件)必須等到一個單獨的進程插入一條記錄,並且生成的插入應該成爲有效負載。 – Beta033

+1

在這種情況下,您應該輪詢應該檢查插入記錄的其他週期性過程。那麼你應該做依賴插入。試圖插入希望它會工作,但主要是期望異常不是好主意。 「或許」這個新插入也許可能會鎖定好一個,你將會處於死鎖狀態。 – Alex

+0

感謝亞歷克斯,主要是我想要做的是關聯放在數據庫中的請求消息,然後讓請求者等待,直到從數據庫中查詢消息。 – Beta033

0

避免數據庫插入後使用Message Enricher處理器來消除有效負載實際值的最佳解決方案。

試試下面這段代碼:

<flow name="mainFlow"> 
    <http:listener config-ref="HTTP_Listener_Configuration" path="hello" doc:name="HTTP"/> 
    <cxf:jaxws-service configuration-ref="CXF_Configuration" serviceClass="kansas.MuleTestServiceImpl" doc:name="CXF"/> 
    <enricher source="#[payload]" target="#[flowVars.insertResponse]" doc:name="Message Enricher"> 
     <db:insert config-ref="Oracle_Configuration" doc:name="Database"> 
      <db:parameterized-query><![CDATA[insert into tblRequest (id, correlationId) values(#[payload], #[message.correlationId])]]></db:parameterized-query> 
     </db:insert> 
    </enricher> 
    <flow-ref name="dbSelectSubFlow" doc:name="dbSelectSubFlow"/> 

    <logger message="#[payload]" level="INFO" doc:name="Logger"/> 
</flow> 
<sub-flow name="dbSelectSubFlow"> 
    <until-successful objectStore-ref="MyObjectStore" maxRetries="5" millisBetweenRetries="2000" doc:name="Until Successful"> 
     <db:select config-ref="Oracle_Configuration" doc:name="Database"> 
      <db:parameterized-query><![CDATA[select correlationId,msgResponse from tblResponse where correlationId = #[message.correlationId]]]></db:parameterized-query> 
     </db:select> 
    </until-successful> 
</sub-flow> 
+0

我遇到的問題實際上並沒有用有效載荷來殺死這個值。我遇到的問題是關聯數據庫插入和選擇。 – Beta033

相關問題