Mule多事务和多资源配置

时间:2016-07-19 06:26:11

标签: transactions mule

我要求批量订单执行以下操作:

  • 按多个订单拆分订单
    1. 对订单执行自定义转换
    2. 保存批次订单有效内容
    3. 保存单个订单详细信息+其他3个数据库插入已完成
    4. 对每个订单执行丰富
    5. 将个人订单发送到下游队列以进行进一步处理

该过程的基本部分是,如果4个数据库插入失败,则不应将订单发送到队列以进行进一步处理。很明显,这是一个多资源事务,但是如何使用队列的多事务以及数据库插入来完成此配置?在尝试创建多事务配置时,我发现foreach不能用作多事务元素的子元素。对于如何执行这样的配置,我将不胜感激。

  <transformer component.. for splitting orders
  <foreach collection="#[message.payload]" doc:name="For Each Order"
            rootMessageVariableName="Original">
            <component... for enrichment
            <jms:outbound-endpoint queue="orders.queue"
                exchange-pattern="request-response" connector-                      ref="amqConnector"
                doc:name="JMS - Send to Order Queue"/>
        </foreach>
                <db:insert config-ref="DBConfig" doc:name="Insert_Order_l">
                   <db:parameterized-query.....
                <db:insert>
                <db:insert config-ref="DBConfig"..
                <db:insert config-ref="DBConfig"

1 个答案:

答案 0 :(得分:0)

您可以将所有DB和JMS端点包装在 Transactional 范围内。像这样:

<db:generic-config name="Generic_Database_Configuration" url="blah"  doc:name="Generic Database Configuration"/>
<jms:connector name="JMS" validateConnections="true" doc:name="JMS"/>
<jms:activemq-connector name="Active_MQ" username="blah" password="blah" brokerURL="tcp://localhost:61616" validateConnections="true" doc:name="Active MQ"/>
<file:connector name="File" autoDelete="true" streaming="true" validateConnections="true" doc:name="File"/>
<flow name="blahFlow">
    <file:inbound-endpoint responseTimeout="10000" doc:name="File" connector-ref="File" path="blah"/>
    <foreach doc:name="For Each">
        <transactional action="ALWAYS_BEGIN" doc:name="Transactional">
            <db:insert config-ref="Generic_Database_Configuration" doc:name="Database">
                <db:parameterized-query/>
            </db:insert>
            <db:insert config-ref="Generic_Database_Configuration" doc:name="Database">
                <db:parameterized-query/>
            </db:insert>
            <db:insert config-ref="Generic_Database_Configuration" doc:name="Database">
                <db:parameterized-query/>
            </db:insert>

            <jms:outbound-endpoint doc:name="JMS" connector-ref="Active_MQ" queue="blah">
                <jms:transaction action="JOIN_IF_POSSIBLE"/>
            </jms:outbound-endpoint>
        </transactional>
    </foreach>
</flow>