2017-10-17 1 views
0

Ich habe einen eingehenden JMS-Endpunkt, der das Thema abonniert. Sobald ein Nachrichtentransformator vorhanden ist, teilt er die Nutzdaten in eine Liste von Datensätzen auf und fügt sie dann mit Batch-Commit in die Datenbank ein. Wenn beim Einfügen in die Datenbank ein Fehler auftritt, möchte ich die gesamte Nutzlast auf JMS zurücksetzen. Wie erreiche ich das mit Transaktionen?mule: Transaktionen in der Stapelverarbeitung

<batch:job name="lockboxBatch" max-failed-records="-1"> 
     <batch:input> 
      <jms:inbound-endpoint topic="lockbox" connector-ref="Active_MQ1" doc:name="JMS"> 
      </jms:inbound-endpoint> 
      <custom-transformer class="transformers.PaymentsTransformer" doc:name="Java"/> 
      <logger level="INFO" doc:name="Logger"/> 
     </batch:input> 
     <batch:process-records> 
      <batch:step name="Batch_Step"> 
       <expression-component doc:name="Expression"><![CDATA[payload[2].batchAmount='hghghfghfhgf']]></expression-component> 
       <batch:commit size="4" doc:name="Batch Commit"> 
        <db:insert config-ref="Oracle_Configuration" doc:name="Database" bulkMode="true" > 
         <db:parameterized-query><![CDATA[INSERT INTO TIB_INT_AR_PAYMENT_IFACE (TRANSMISSION_REQUEST_ID,DESTINATION_ACCOUNT,ORIGINATION,TRANSMISSION_RECORD_COUNT,TRANSMISSION_AMOUNT,LOCKBOX_NUMBER,LOCKBOX_BATCH_COUNT,LOCKBOX_RECORD_COUNT,LOCKBOX_AMOUNT,BATCH_NAME,BATCH_AMOUNT,BATCH_RECORD_COUNT,ITEM_NUMBER,CURRENCY_CODE,REMITTANCE_AMOUNT,TRANSIT_ROUTING_NUMBER,ACCOUNT,CHECK_NUMBER,CUSTOMER_NUMBER,OVERFLOW_INDICATOR,OVERFLOW_SEQUENCE,INVOICE1,AMOUNT_APPLIED1) VALUES (#[payload.?transmissiosnRequestID],#[payload.?destinastionAccount],#[payload.?origination],#[payload.?transmissionSrecordCount],#[payload.?transmisssionAmount],#[payload.lockboxNumber],#[payload.lockboxBatchCount],#[payload.lockboxRecordCount],#[payload.lockboxAmount],#[payload.batchName],#[payload.batchAmount],#[payload.batchRecordCount],#[payload.itemNumber],#[payload.currencyCode],#[payload.remittanceAmount],#[payload.transitRoutingNumber],#[payload.account],#[payload.checkNumber],#[payload.customerNumber],#[payload.overflowIndicator],#[payload.overflowSequence],#[payload.invoice1],#[payload.amountApplied1])]]></db:parameterized-query> 
        </db:insert> 
       </batch:commit> 
      </batch:step> 
      <batch:step name="Batch_Step1" accept-policy="ONLY_FAILURES"> 
      <set-payload value="#[getStepExceptions()]" doc:name="Set Payload"/> 
       <foreach collection="#[payload.values()]" doc:name="For Each"> 
        <jms:outbound-endpoint queue="Invalid_Transmission" connector-ref="Active_MQ" doc:name="JMS"/> 
       </foreach> 
      </batch:step> 


     </batch:process-records> 
     <batch:on-complete> 
      <logger message="Completed the insert" level="INFO" doc:name="Logger"/> 
     </batch:on-complete> 
    </batch:job> 

Antwort

0

Sie können zwei Dinge versuchen.

1.Make max-failed-records = "0", dies wird im Falle eines Fehlers im Batch-Schritt zurückgesetzt.

2. Schließen Sie den DB-Connector innerhalb des Transaktionsbereichs ab, und bearbeiten Sie das Ausnahmeszenario nach Bedarf.

<transactional action="ALWAYS_BEGIN" doc:name="Transactional"> 
    <db:insert...>........</db:insert> 
</transactional> 

Bitte beachten Sie unten aktualisierten Code, können Sie Änderungen an Ihre Anforderungen anpassen.

<batch:job name="lockboxBatch" max-failed-records="0"> 
    <batch:input> 
     <jms:inbound-endpoint topic="lockbox" connector-ref="Active_MQ1" doc:name="JMS"> 
     </jms:inbound-endpoint> 
     <custom-transformer class="transformers.PaymentsTransformer" doc:name="Java"/> 
     <logger level="INFO" doc:name="Logger"/> 
    </batch:input> 
    <batch:process-records> 
     <batch:step name="Batch_Step"> 
      <expression-component doc:name="Expression"><![CDATA[payload[2].batchAmount='hghghfghfhgf']]></expression-component> 
      <batch:commit size="4" doc:name="Batch Commit"> 
        <transactional action="ALWAYS_BEGIN" doc:name="Transactional"> 
         <db:insert config-ref="Oracle_Configuration" bulkMode="true" doc:name="Database"> 
          <db:parameterized-query><![CDATA[INSERT INTO TIB_INT_AR_PAYMENT_IFACE (TRANSMISSION_REQUEST_ID,DESTINATION_ACCOUNT,ORIGINATION,TRANSMISSION_RECORD_COUNT,TRANSMISSION_AMOUNT,LOCKBOX_NUMBER,LOCKBOX_BATCH_COUNT,LOCKBOX_RECORD_COUNT,LOCKBOX_AMOUNT,BATCH_NAME,BATCH_AMOUNT,BATCH_RECORD_COUNT,ITEM_NUMBER,CURRENCY_CODE,REMITTANCE_AMOUNT,TRANSIT_ROUTING_NUMBER,ACCOUNT,CHECK_NUMBER,CUSTOMER_NUMBER,OVERFLOW_INDICATOR,OVERFLOW_SEQUENCE,INVOICE1,AMOUNT_APPLIED1) VALUES (#[payload.?transmissiosnRequestID],#[payload.?destinastionAccount],#[payload.?origination],#[payload.?transmissionSrecordCount],#[payload.?transmisssionAmount],#[payload.lockboxNumber],#[payload.lockboxBatchCount],#[payload.lockboxRecordCount],#[payload.lockboxAmount],#[payload.batchName],#[payload.batchAmount],#[payload.batchRecordCount],#[payload.itemNumber],#[payload.currencyCode],#[payload.remittanceAmount],#[payload.transitRoutingNumber],#[payload.account],#[payload.checkNumber],#[payload.customerNumber],#[payload.overflowIndicator],#[payload.overflowSequence],#[payload.invoice1],#[payload.amountApplied1])]]></db:parameterized-query> 
         </db:insert> 
        </transactional> 

      </batch:commit> 
     </batch:step> 
     <batch:step name="Batch_Step1" accept-policy="ONLY_FAILURES"> 
     <set-payload value="#[getStepExceptions()]" doc:name="Set Payload"/> 
      <foreach collection="#[payload.values()]" doc:name="For Each"> 
       <jms:outbound-endpoint queue="Invalid_Transmission" connector-ref="Active_MQ" doc:name="JMS"/> 
      </foreach> 
     </batch:step> 


    </batch:process-records> 
    <batch:on-complete> 
     <logger message="Completed the insert" level="INFO" doc:name="Logger"/> 
    </batch:on-complete> 
</batch:job> 
+0

Vielen Dank für Ihre Antwort. Wenn ich den db-Konnektor in den transaktionalen Bereich einfüge und wenn ein Fehler auftritt, wird versucht, ein Rollback durchzuführen und es erneut zu versuchen (es erneut an eingehende JMS zu senden) oder es wird einfach zurückgesetzt und als Fehlerdatensatz an den nächsten Schritt gesendet. – MRavindran

Verwandte Themen