I have JMS inbound endpoint which subscribes to the topic. once there is a message transformer splits the payload into list of records and then insert into database using batch-commit. If there is any error while inserting into the database I want roll back the entire payload to JMS. How to achieve this using transactions?
<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>
You can try two things.
1.Make max-failed-records="0" ,this will rollback in case of any failure in batch step.
2.Encomapss the DB connector inside transaction scope,and handle the exception scenario as required.
<transactional action="ALWAYS_BEGIN" doc:name="Transactional">
<db:insert...>........</db:insert>
</transactional>
Please consider below updated code,you can make changes to suit your requirements.
<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>
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.