2012-12-19 23 views
0

因此,我試圖根據使用Choice Flow Control的數據庫中的字段路由發票。這工作正常,但不使用集合聚合器,但是我想使用聚合器將事務分組爲單個電子郵件。但是,當我添加集合聚合器時,路由將全部混淆。例如,在我上次測試運行中,LHF_INVOICE_METHOD ='INACTV'和IS_ZERO_OR_NEGATIVE ='1'的發票被路由到「貨運」(它在沒有收集彙總的情況下正確地路由到「非活動」)。我認爲收集彙總者正在使路線彼此交叉。我將我的MULE_CORRELATION_ID設置爲包含LHF_INVOICE_METHOD和IS_ZERO_OR_NEGATIVE,以便集合聚合器擁有自己的關聯ID。Mule中的多個收集聚合器導致路線混合起來

<flow name="InvoiceWorkflow" doc:name="InvoiceWorkflow" processingStrategy= "synchronous"> 
    <jdbc:inbound-endpoint queryKey="GetUnprocessedInvoices" queryTimeout="10000" pollingFrequency= "1000" connector-ref ="Database" doc:name="Get invoice run" > 
     <jdbc:query key="GetUnprocessedInvoices" value="SELECT  COMPANY_CODE, DIVISION, INVOICE_NUMBER,&#13;&#10;LHF_INVOICE_METHOD, STATUS_FLAG,&#13;&#10;SYSTEM_DATE, USERNAME, RUN_NUMBER, ROWID, IS_ZERO_OR_NEGATIVE,&#13;&#10;LHF_INVOICE_METHOD || RUN_NUMBER || IS_ZERO_OR_NEGATIVE AS CORRELATION_ID,&#13;&#10;LHF_INVOICE_METHOD || RUN_NUMBER || IS_ZERO_OR_NEGATIVE || '2' AS CORRELATION_ID_2&#13;&#10;FROM    FIN.LHF_INVOICE_WORKFLOW &#13;&#10; WHERE   (STATUS_FLAG = 'N')"/> 
    </jdbc:inbound-endpoint> 
    <jdbc:outbound-endpoint exchange-pattern="one-way" queryKey="insert_invoice_run" queryTimeout= "10000" connector-ref="SPTSQL01_APPS_custom_app_data" doc:name= "Load to custom_app_data"> 
     <jdbc:query key="insert_invoice_run" value="INSERT INTO lhf_ros_invoice_workflow ([COMPANY_CODE] ,[DIVISION] ,[INVOICE_NUMBER] ,[LHF_INVOICE_METHOD] ,[STATUS_FLAG] ,[SYSTEM_DATE] ,[USERNAME] ,[RUN_NUMBER] ,[IS_ZERO_OR_NEGATIVE]) VALUES (#[map-payload:COMPANY_CODE] ,#[map-payload:DIVISION] ,#[map-payload:INVOICE_NUMBER] ,#[map-payload:LHF_INVOICE_METHOD], #[map-payload:STATUS_FLAG] ,#[map-payload:SYSTEM_DATE] ,#[map-payload:USERNAME] ,#[map-payload:RUN_NUMBER] ,#[map-payload:IS_ZERO_OR_NEGATIVE])"/> 
    </jdbc:outbound-endpoint> 
    <jdbc:outbound-endpoint exchange-pattern="one-way" queryKey="MarkAsProcessed" queryTimeout= "10000" connector-ref="DatabaseMuleLogin" doc:name= "Mark Processed in Ross" > 
     <jdbc:query key="MarkAsProcessed" value="UPDATE  FIN.LHF_INVOICE_WORKFLOW SET     STATUS_FLAG = 'P' WHERE  (ROWID = #[map-payload:ROWID])"/> 
    </jdbc:outbound-endpoint> 
    <message-properties-transformer doc:name="Message Properties"> 
     <add-message-property key="MULE_CORRELATION_GROUP_SIZE" value="1000"/> 
     <add-message-property key="MULE_CORRELATION_ID" value="#[message.payload.CORRELATION_ID]"/> 
    </message-properties-transformer> 
    <choice doc:name="Choice" > 
     <when expression="#[message.payload.LHF_INVOICE_METHOD == 'INACTV']"> 
      <processor-chain> 
       <collection-aggregator failOnTimeout="false" doc:name="Inactive" timeout="2000"/> 
       <smtp:outbound-endpoint responseTimeout="10000" doc:name="Inactive" from="[email protected]" subject="[Invoice Workflow] Inactive 1" to="[email protected]" host="mail.example.com"/> 
       <jdbc:outbound-endpoint exchange-pattern="one-way" queryKey="MARK_COMPLETE" queryTimeout="-1" connector-ref="SPTSQL01_APPS_custom_app_data" doc:name="Mark Complete"/> 
      </processor-chain> 
     </when> 
     <when expression="#[message.payload.IS_ZERO_OR_NEGATIVE=='1']"> 
      <processor-chain> 
       <collection-aggregator timeout="3000" failOnTimeout="false" doc:name="Zero"/> 
       <smtp:outbound-endpoint to= "[email protected]" from="[email protected]" subject="[Invoice Workflow] Zero Dollar " responseTimeout= "10000" doc:name="Zero Dollar" host="mail.example.com"/> 
       <jdbc:outbound-endpoint exchange-pattern="one-way" queryKey="MARK_COMPLETE" queryTimeout="-1" connector-ref="SPTSQL01_APPS_custom_app_data" doc:name="Mark Complete"/> 
      </processor-chain> 
     </when> 
     <when expression="#[message.payload.LHF_INVOICE_METHOD=='TRUCK']"> 
      <processor-chain> 
       <collection-aggregator timeout="4000" failOnTimeout="false" doc:name="Truck"/> 
       <smtp:outbound-endpoint to= "[email protected]" from="[email protected]" subject="[Invoice Workflow] Trucking" responseTimeout= "10000" doc:name="Trucking" host="mail.example.com"/> 
       <jdbc:outbound-endpoint exchange-pattern="one-way" queryKey="MARK_COMPLETE" queryTimeout="-1" connector-ref="SPTSQL01_APPS_custom_app_data" doc:name="Mark Complete"/> 
      </processor-chain> 
     </when> 
     <otherwise> 
      <processor-chain> 
       <smtp:outbound-endpoint host="mail.example.com" to="[email protected]" from="[email protected]" subject="[Invoice Workflow] RSForms Email" responseTimeout="10000" doc:name="RSForms"/> 
       <message-properties-transformer overwrite="true" doc:name="Message Properties"> 
        <add-message-property key="MULE_CORRELATION_ID" value="#[message.payload.CORRELATION_ID_2]"/> 
       </message-properties-transformer> 
       <choice doc:name="Choice"> 
        <when expression="#[message.payload.LHF_INVOICE_METHOD == 'SPEC']"> 
         <processor-chain> 
          <collection-aggregator timeout="5000" failOnTimeout="false" doc:name="Special"/> 
          <smtp:outbound-endpoint host="mail.example.com" to="[email protected]" from="[email protected]" subject="[Invoice Workflow] Special Handling" responseTimeout="10000" doc:name="Special"/> 
          <jdbc:outbound-endpoint exchange-pattern="one-way" queryKey="MARK_COMPLETE" queryTimeout="-1" connector-ref="SPTSQL01_APPS_custom_app_data" doc:name="Mark Complete"/> 
         </processor-chain> 
        </when> 
        <when expression="#[message.payload.LHF_INVOICE_METHOD == 'EMAIL']"> 
         <processor-chain> 
          <collection-aggregator timeout="6000" failOnTimeout="false" doc:name="Do Nothing"/> 
          <smtp:outbound-endpoint host="mail.example.com" to="[email protected]" from="[email protected]" subject="[Invoice Workflow] Do nothing" responseTimeout="10000" doc:name="Do Nothing"/> 
          <jdbc:outbound-endpoint exchange-pattern="one-way" queryKey="MARK_COMPLETE" queryTimeout="-1" connector-ref="SPTSQL01_APPS_custom_app_data" doc:name="Mark Complete"/> 
         </processor-chain> 
        </when> 
        <when expression="#[message.payload.LHF_INVOICE_METHOD == 'MAILUS']"> 
         <processor-chain> 
          <collection-aggregator timeout="7000" failOnTimeout="false" doc:name="US Mail"/> 
          <smtp:outbound-endpoint host="mail.example.com" to="[email protected]" from="[email protected]" subject="[Invoice Workflow] US Mail" responseTimeout="10000" doc:name="US Mail"/> 
          <jdbc:outbound-endpoint exchange-pattern="one-way" queryKey="MARK_COMPLETE" queryTimeout="-1" connector-ref="SPTSQL01_APPS_custom_app_data" doc:name="Mark Complete"/> 
         </processor-chain> 
        </when> 
        <when expression="#[message.payload.LHF_INVOICE_METHOD == 'MAILCN']"> 
         <processor-chain> 
          <collection-aggregator timeout="8000" failOnTimeout="false" doc:name="Intl Mail"/> 
          <smtp:outbound-endpoint host="mail.example.com" to="[email protected]" from="[email protected]" subject="[Invoice Workflow] Intl Mail" responseTimeout="10000" doc:name="Intl Mail"/> 
          <jdbc:outbound-endpoint exchange-pattern="one-way" queryKey="MARK_COMPLETE" queryTimeout="-1" connector-ref="SPTSQL01_APPS_custom_app_data" doc:name="Mark Complete"/> 
         </processor-chain> 
        </when> 
        <when expression="#[message.payload.LHF_INVOICE_METHOD == 'EDI']"> 
         <processor-chain> 
          <collection-aggregator timeout="9000" failOnTimeout="false" doc:name="EDI"/> 
          <smtp:outbound-endpoint host="mail.example.com" to="[email protected]" from="[email protected]" subject="[Invoice Workflow] EDI" responseTimeout="10000" doc:name="EDI"/> 
          <jdbc:outbound-endpoint exchange-pattern="one-way" queryKey="MARK_COMPLETE" queryTimeout="-1" connector-ref="SPTSQL01_APPS_custom_app_data" doc:name="Mark Complete"/> 
         </processor-chain> 
        </when> 
        <otherwise> 
         <processor-chain> 
          <collection-aggregator timeout="10000" failOnTimeout="false" doc:name="Exceptions"/> 
          <smtp:outbound-endpoint host="mail.example.com" to="[email protected]" from="[email protected]" subject="[Invoice Workflow] Exceptions" responseTimeout="10000" doc:name="Exceptions"/> 
          <jdbc:outbound-endpoint exchange-pattern="one-way" queryKey="MARK_COMPLETE" queryTimeout="-1" connector-ref="SPTSQL01_APPS_custom_app_data" doc:name="Mark Complete"/> 
         </processor-chain> 
        </otherwise> 
       </choice> 
      </processor-chain> 
     </otherwise> 
    </choice> 
</flow > 

我在每個WHEN分支之後在聚合器和事務轉移到合適的分支之前在聚合之前添加了記錄器。這裏是實際數據,據我所知,Mule Correlation ID對每個聚合器都是唯一的。這是通過與發生了什麼,我所期待的發送一些實際的數據:

之前聚合(正確)

記錄器無效

{INVOICE_NUMBER = 408908,SYSTEM_DATE = 2012-12- 19 16:36:50.0,DIVISION = 1,LHF_INVOICE_METHOD = INACTV,RUN_NUMBER = 4862651810,ROWID =oracle.[email protected],COMPANY_CODE = 1,STATUS_FLAG = N,USERNAME = BBRYAN,CORRELATION_ID = INACTV48626518101,CORRELATION_ID_2 = INACTV486265181012,IS_ZERO_OR_NEGATIVE = 1}

{INVOICE_NUMBER = 406749,SYSTEM_DATE = 2012-12-19 16:36:50.0,DIVISION = 1,LHF_INVOICE_METHOD = INACTV,RUN_NUMBER = 4862651810,ROWID [email protected],COMPANY_CODE = 1,STATUS_FLAG = N, USERNAME = BBRYAN,CORRELATION_ID = INACTV48626518101,CORRELATION_ID_2 = INACTV486265181012,IS_ZERO_OR_NEGATIVE = 1}

{INVOICE_NUMBER = 408691,SYSTEM_DATE = 2012年12月19日16:36:50.0,DIVISION = 1,LHF_INVOICE_METHOD = INACTV,RUN_NUMBER = 4862651810, [email protected],COMPANY_CODE = 1,STATUS_FLAG = N,USERNAME = BBRYAN,CORRELATION_ID = INACTV48626518100,CORRELATION_ID_2 = INACTV486265181002,IS_ZERO_OR_NEGATIVE = 0}

記錄儀零或負

{INVOICE_NUMBER = 409061,SYSTEM_DATE = 2012-12-19 16:36:50.0,DIVISION = 1,LHF_INVOICE_METHOD = MAILUS,RUN_NUMBER = 4862651810,ROWID [email protected],COMPANY_CODE = 1,STATUS_FLAG = N ,USERNAME = BBRYAN,CORRELATION_ID = MAILUS48626518101,CORRELATION_ID_2 = MAILUS486265181012,IS_ZERO_OR_NEGATIVE = 1}

{INVOICE_NUMBER = 410968,SYSTEM_DATE = 2012年12月19日16:36:50.0,DIVISION = 1,LHF_INVOICE_METHOD = EDI,RUN_NUMBER = 4862651810 ,[email protected],COMPANY_CODE = 1,STATUS_FLAG = N,USERNAME = BBRYAN,CORRELATION_ID = EDI48626518101,CORRELATION_ID_2 = EDI486265181012,IS_ZERO_OR_NEGATIVE = 1}

AFTER聚合

無效1:(這兩個去糾正路線)

[{INVOICE_NUMBER = 408908,SYSTEM_DATE =二〇一二年十二月一十九日16:36:50.0,DIVISION = 1,LHF_INVOICE_METHOD = INACTV,RUN_NUMBER = 4862651810,ROWID = oracle.sql。ROWID @ 5a72f4f7,COMPANY_CODE = 1,STATUS_FLAG = N,USERNAME = BBRYAN,CORRELATION_ID = INACTV48626518101,CORRELATION_ID_2 = INACTV486265181012,IS_ZERO_OR_NEGATIVE = 1},

{INVOICE_NUMBER = 406749,SYSTEM_DATE = 2012年12月19日16:36:50.0 ,DIVISION = 1,LHF_INVOICE_METHOD = INACTV,RUN_NUMBER = 4862651810,[email protected],COMPANY_CODE = 1,STATUS_FLAG = N,USERNAME = BBRYAN,CORRELATION_ID = INACTV48626518101,CORRELATION_ID_2 = INACTV486265181012,IS_ZERO_OR_NEGATIVE = 1}]

零元:(這是正確的)

[{INVOICE_NUMBER = 409061,SYSTEM_DATE = 2012年12月19日16:36:50.0,DIVISION = 1,LHF_INVOICE_ METHOD = MAILUS,RUN_NUMBER = 4862651810,[email protected],COMPANY_CODE = 1,STATUS_FLAG = N,USERNAME = BBRYAN,CORRELATION_ID = MAILUS48626518101,CORRELATION_ID_2 = MAILUS486265181012,IS_ZERO_OR_NEGATIVE = 1}]

運輸工具: (這應該去零美元)

[{INVOICE_NUMBER = 410968,SYSTEM_DATE = 2012年12月19日16:36:50.0,DIVISION = 1,LHF_INVOICE_METHOD = EDI,RUN_NUMBER = 4862651810,ROWID = oracle.sql .ROWID @ 7a9b36be,COMPANY_CODE = 1,STATUS_FLAG = N,USERNAME = BBRYAN,CORRELATION_ID = EDI48626518101,CORRELATION_ID_2 = EDI486265181012,IS_ZERO_OR_NEGATIVE = 1}]

特殊處理:(應該去爲 「無效1」)

[{INVOICE_NUMBER = 408691,SYSTEM_DATE =二〇一二年十二月一十九日16:36:50.0,DIVISION = 1,LHF_INVOICE_METHOD = INACTV,RUN_NUMBER = 4862651810, [email protected],COMPANY_CODE = 1,STATUS_FLAG = N,USERNAME = BBRYAN,CORRELATION_ID = INACTV48626518100,CORRELATION_ID_2 = INACTV486265181002,IS_ZERO_OR_NEGATIVE = 0}]

回答

2

路由不會被影響,而是消息到達正確的collection-aggregator,但得到聚集在錯誤的組,因此結束交付由另一個collection-aggregator超時。

這是因爲所有的聚合器都使用默認的共享消息存儲,這使得Mule可以將消息完全混合在一起。此默認行爲是錯誤的IMO,但要解決此問題,請在每個聚合器上配置一個唯一storePrefix

例如:

<when expression="#[message.payload.LHF_INVOICE_METHOD == 'INACTV']"> 
    <processor-chain> 
     <collection-aggregator storePrefix="inactive" failOnTimeout="false" doc:name="Inactive" timeout="2000"/> 
     <smtp:outbound-endpoint responseTimeout="10000" doc:name="Inactive" from="[email protected]" subject="[Invoice Workflow] Inactive 1" to="[email protected]" host="mail.example.com"/> 
     <jdbc:outbound-endpoint exchange-pattern="one-way" queryKey="MARK_COMPLETE" queryTimeout="-1" connector-ref="SPTSQL01_APPS_custom_app_data" doc:name="Mark Complete"/> 
    </processor-chain> 
</when> 

等等等等。

+0

我已更新該問題。謝謝。 –

+0

這是一個很好的信息,看來我的理論崩潰了:$我需要設置一個簡單的測試來重現問題,而不用所有的JDBC東西來診斷。請耐心等待。 –

+0

感謝您的研究! –