2015-02-09 50 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"/>