我正在努力弄清楚如何使用工作室來解決這個問題,並認爲可能對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>
感謝你爲這個。這個比喻肯定有很大的幫助,並且可以讓我解決一些與此有關的問題。我想我可能在解釋我遇到的問題方面做得不好。我的主要問題是「同步2個數據庫調用」基本上,「直到成功」組件(或者可能是一個不同的組件)必須等到一個單獨的進程插入一條記錄,並且生成的插入應該成爲有效負載。 – Beta033
在這種情況下,您應該輪詢應該檢查插入記錄的其他週期性過程。那麼你應該做依賴插入。試圖插入希望它會工作,但主要是期望異常不是好主意。 「或許」這個新插入也許可能會鎖定好一個,你將會處於死鎖狀態。 – Alex
感謝亞歷克斯,主要是我想要做的是關聯放在數據庫中的請求消息,然後讓請求者等待,直到從數據庫中查詢消息。 – Beta033