2015-02-09 52 views
0

在mule esb中開發示例bookstare,並使用mysql作爲數據庫。我的數據庫有一個名爲'Stock'的表,其中有2個屬性(isbn和數量),用於我在表單上提供的註冊書籍。我想要的是檢查客戶要求的書籍數量,不要增加我的數據庫上存在的書籍(數量)來完成訂單。在會話變量中保存來自數據庫的值Mule esb

我有流量:

<flow name="Facturacion" doc:name="Facturacion"> 
    <composite-source doc:name="Composite Source"> 
     <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8086" doc:name="HTTP" path="Facturacion" transformer-refs="HttpToPedido"/> 
     <file:inbound-endpoint responseTimeout="10000" doc:name="File" moveToDirectory="tmp" path="tmp/pedidos"/> 
    </composite-source> 
    <component doc:name="Generar Pedido" class="org.mule.components.GenerarPedido"/> 
    <set-session-variable variableName="dataTemp" value="#[message.payload.cantidadPedida]" doc:name="Session Variable"/> 
    <db:select config-ref="MySQL_Configuration" doc:name="Database"> 
     <db:parameterized-query><![CDATA[SELECT cantidad FROM stock WHERE isbn = #[payload.isbn]]]></db:parameterized-query> 
    </db:select> 
    <collection-splitter doc:name="Collection Splitter"/> 
    <choice doc:name="Choice"> 
     <when expression="#[sessionVars['dataTemp'] &gt;= payload.cantidadPedida]"> 
      <vm:outbound-endpoint exchange-pattern="one-way" path="procesarPedido" doc:name="Procesar Pedido Disponible"/> 
     </when> 
     <otherwise> 
      <vm:outbound-endpoint exchange-pattern="one-way" path="rechazarStock" doc:name="Rechazar por falta en Stock"/> 
     </otherwise> 
    </choice> 
    <collection-aggregator failOnTimeout="true" doc:name="Collection Aggregator"/> 
    <set-payload value="#[payload];" doc:name="Set Payload"/> 
</flow> 

任何解決這個問題?我需要的是根據我的數據庫中的有效負載與我的「庫存表」中的值來比較本書數量的值。

謝謝!

回答

0

我不知道你想要達到什麼目的,但是要將數據庫查詢的結果存儲在會話變量中,所有你需要使用的是一個豐富的,你指定目標爲會話var:

 <enricher target="#[sessionVars.test]" doc:name="Message Enricher"> 
      <!-- database call --> 
     </enricher> 

如果這不是你所追求的,你可以透露更多關於你的用例的信息。

+0

感謝您的響應。但是我需要的是比較muy訂購數量(我從有效載荷中得到的價值)和我的數據庫的「stock」表中的值來接受訂單。 – 2015-02-10 11:50:54

0

如何使用過濾器?

以下應用:

<http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" /> 
<db:mysql-config name="MySQL_Configuration" url="jdbc:mysql://localhost:3306/esb?user=root&amp;amp;password=" /> 
<flow name="databasetestsFlow"> 
    <http:listener config-ref="HTTP_Listener_Configuration" path="/" /> 
    <db:select config-ref="MySQL_Configuration" > 
     <db:parameterized-query><![CDATA[select name from test where id=#[message.inboundProperties.'http.query.params'.id]]]></db:parameterized-query> 
    </db:select> 
    <expression-filter expression="#[payload.size()==1 &amp;&amp; payload[0].name==&quot;one&quot;]" /> 
    <set-payload value="PROCESSED" /> 
</flow> 

回報 「加工」 只有當ID爲1,例如:

curl http://localhost:8081\?id\=1 

您可以在過濾器表達式更改爲類似:

#[sessionVars['dataTemp'] &gt;= payload[0].cantidadPedida] 

您還可以通過使用將數據庫結果存儲在會話變量中3210屬性在db:select處理器,例如:

target="#[sessionVars.results]" 

HTH, 馬科斯

+0

在會話var我保存的是一個帶有「books」的集合,但是我需要一個迭代器逐一查看每本書以與來自有效載荷的信息進行比較 – 2015-02-11 09:25:39

+0

您可以實現一個組件,在其中將所有邏輯,或者使用嵌套的'for-each'組件遍歷會話變量,然後遍歷有效載荷。 HTH – clare 2015-02-11 10:25:48

+0

正如克萊爾說的,你可以使用'for-each'循環迭代會話變量。但是,在你的第一個流程中,你執行一個sql查詢來檢查isbn號碼,那個查詢返回幾本書?可能會更好地將當前有效負載存儲在變量中,並將查詢結果加載到有效負載中,以將其用作收集拆分器的輸入。 – MarcosNC 2015-02-11 22:17:42

0
<db:select config-ref="MySQL_Configuration" doc:name="Database"> 
    <db:parameterized-query><![CDATA[SELECT cantidad FROM stock WHERE isbn = #[payload.isbn]]]></db:parameterized-query> 
</db:select> 
<set-session-variable variableName="dataTemp" value="#[payload.cantidad]" doc:name="dataTemp"/>