【问题标题】:Group database records using ESB mule使用 ESB mule 对数据库记录进行分组
【发布时间】:2019-12-21 21:15:59
【问题描述】:

我有 mule 流,它从如下所示的数据库表中选择几条记录。

StudentID   Subject     Mark 
1           Maths        98  
2           Literature   62
1           Science      56  
1           Anatomy      63
3           Zoology      38
2           Algebra      63

这里我需要根据 studentID 对记录进行分组,并需要发送以进行进一步处理。因此,我在数据库节点之后立即放置了拆分器组件。但是在 MEL 表达式中我们如何对记录进行分组呢?

有没有其他最好的方法来做这个 ESB 骡子?

更新 - 我需要根据 StudentID(分组依据)拆分消息。我找到了groovy can do grouping。但是我们是否可以使用 groovy 拆分消息。

【问题讨论】:

  • 你能发布你想要的输出吗
  • 您可以使用 enterprise $$ 数据波还是只使用社区版?

标签: groovy mule esb mule-el splitter


【解决方案1】:

我将创建一个 Java 对象并实现可调用对象。使用此方法更改有效负载。然后我将使用第二个数据库组件并在第二个查询中使用有效负载对象 (MEL)。

此对象将数据从数据库组件输出流转换为混合对象,该对象用于显示带有嵌入的子数据数组的 JSON。

https://github.com/dlwhitehurst/modusbox-orders/blob/master/src/main/java/org/dlw/transport/OrdersTransformSingleton.java

查看可调用方法的返回值,看看如何自己“转换”数据。

这是 mule 配置中的 sn-p 实例化所需的 Java 组件。

    <spring:beans>
  <spring:bean id="ordersTransform" name="OrdersTransformSingleton"
    class="org.dlw.transport.OrdersTransformSingleton" scope="singleton">
  </spring:bean>
  <spring:bean id="jdbcDataSource" class="org.enhydra.jdbc.standard.StandardDataSource" destroy-method="shutdown">
    <spring:property name="driverName" value="com.mysql.jdbc.Driver"/>
    <spring:property name="url" value="${database.url}"/>
  </spring:bean>      
</spring:beans>   

对象在流程中这样使用...

    <flow name="get:/orders:api-config">
    <set-payload value="[&#xD;&#xA;  {&#xD;&#xA;    &quot;orderId&quot;: 1233,&#xD;&#xA;    &quot;placementDate&quot;: &quot;2016-06-02&quot;,&#xD;&#xA;    &quot;customerName&quot;: &quot;Sally Hansen&quot;,&#xD;&#xA;     &quot;orderItems&quot;:[&#xD;&#xA;       {&#xD;&#xA;         &quot;orderItemId&quot;: 1323,&#xD;&#xA;         &quot;orderId&quot;: 438577,&#xD;&#xA;         &quot;itemId&quot;: 23058,&#xD;&#xA;         &quot;itemName&quot;: &quot;Salt&quot;,&#xD;&#xA;         &quot;itemCount&quot;: 3,&#xD;&#xA;         &quot;qtyItemCost&quot;: &quot;$2.76&quot;&#xD;&#xA;       },&#xD;&#xA;       {&#xD;&#xA;         &quot;orderItemId&quot;: 1323,&#xD;&#xA;         &quot;orderId&quot;: 438577,&#xD;&#xA;         &quot;itemId&quot;: 23058,&#xD;&#xA;         &quot;itemName&quot;: &quot;Pepper&quot;,&#xD;&#xA;         &quot;itemCount&quot;: 3,&#xD;&#xA;         &quot;qtyItemCost&quot;: &quot;$8.79&quot;&#xD;&#xA;       }&#xD;&#xA;     ]  &#xD;&#xA;  },&#xD;&#xA;  {&#xD;&#xA;    &quot;orderId&quot;: 1233,&#xD;&#xA;    &quot;placementDate&quot;: &quot;2016-06-02&quot;,&#xD;&#xA;    &quot;customerName&quot;: &quot;Billy Wilson&quot;,&#xD;&#xA;     &quot;orderItems&quot;:[&#xD;&#xA;       {&#xD;&#xA;         &quot;orderItemId&quot;: 1323,&#xD;&#xA;         &quot;orderId&quot;: 438577,&#xD;&#xA;         &quot;itemId&quot;: 23058,&#xD;&#xA;         &quot;itemName&quot;: &quot;Wheat Flour&quot;,&#xD;&#xA;         &quot;itemCount&quot;: 3,&#xD;&#xA;         &quot;qtyItemCost&quot;: &quot;$10.12&quot;&#xD;&#xA;       },&#xD;&#xA;       {&#xD;&#xA;         &quot;orderItemId&quot;: 1323,&#xD;&#xA;         &quot;orderId&quot;: 438577,&#xD;&#xA;         &quot;itemId&quot;: 23058,&#xD;&#xA;         &quot;itemName&quot;: &quot;Tomato Paste&quot;,&#xD;&#xA;         &quot;itemCount&quot;: 3,&#xD;&#xA;         &quot;qtyItemCost&quot;: &quot;$9.21&quot;&#xD;&#xA;       }&#xD;&#xA;     ]  &#xD;&#xA;  }&#xD;&#xA;]" doc:name="Set Payload"/>
    <db:select config-ref="MySQL_Configuration" doc:name="Database">
        <db:parameterized-query><![CDATA[SELECT a.orderId, a.customerName, a.placementDate, b.orderItemId, b.itemId, c.itemName, b.itemCount, c.itemCost FROM modusbox.orders a, modusbox.orderitems b, modusbox.items c WHERE a.orderId = b.orderId AND b.itemId = c.itemId]]></db:parameterized-query>
    </db:select>
    <component doc:name="Java">
        <spring-object bean="OrdersTransformSingleton" />
    </component>
    <json:object-to-json-transformer doc:name="Object to JSON"/>
    <logger level="INFO" doc:name="Logger"/>
</flow>

【讨论】:

    【解决方案2】:

    更好地放置 dataweave 组件并使用“groupBy”逻辑。

    https://docs.mulesoft.com/mule-user-guide/v/3.7/dataweave-reference-documentation#group-by

    【讨论】:

    【解决方案3】:

    DataWeave 是 groupBy 的正确选择。如果您没有选择 DataWeave(使用社区版),您可以使用 groovy 脚本引擎快速获胜。

    应该是groupBy属性mail的列表

    [
          {
            "mail": "smith@example.com",
            "name": "lastname",
            "value": "Smith"
          },
          {
            "mail": "smith@example.com",
            "name": "firstname",
            "value": "John"
          },
          {
            "mail": "doe@example.com",
            "name": "lastname",
            "value": "Doe"
          },
          {
            "mail": "doe@example.com",
            "name": "firstname",
            "value": "Lisa"
          }
    ]
    

    Mule 脚本组件

    <scripting:component>
        <scripting:script engine="groovy">
            <![CDATA[flowVars['recipients'].groupBy{it.mail}]]>
        </scripting:script>
    </scripting:component>
    

    groupBy mail的结果

    {
        "smith@example.com": [
            {
            "mail": "smith@example.com",
            "name": "lastname",
            "value": "Smith"
            },
            {
            "mail": "smith@example.com",
            "name": "firstname",
            "value": "John"
            }
        ],
        "doe@example.com": [
            {
            "mail": "doe@example.com",
            "name": "lastname",
            "value": "Doe"
            },
            {
            "mail": "doe@example.com",
            "name": "firstname",
            "value": "Lisa"
            }
        ]
    }
    

    适用于 Mule 3.8.1 CE。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多