How to override Spring Batch CompositeItemWriter manage transaction for delegate writers in case of exception arises?

后端 未结 3 482
醉梦人生
醉梦人生 2020-12-17 02:53

I am extending this How does Spring Batch CompositeItemWriter manage transaction for delegate writers? question here:

In my case I\'ve a below CompositeItemWrit

3条回答
  •  一向
    一向 (楼主)
    2020-12-17 03:31

    I can't see a way you could align spring-batch's single transaction for writing the whole chunk as atomic vs your idea of keeping the atomicity to individual writers as long as you want skiplistener.

    I am not sure if this is possible but may be you will be able to test it quickly. This is how the message carries the exception in some integration frameworks like camel from one processor to error handling flow.

    • You item reader should return a EmployeeWrapper which contains employee record and has a field to store Exception.

    • your CompositeItemWriter receives List and composite writer has 5 writers instead of 4. And the 5th writer will do what your SkipListener would have done.

        List> employee = new ArrayList<>();
        employee.add(employeeWriter());
        employee.add(departmentWriter());
        employee.add(stockWriter());
        employee.add(purchaseWriter());
        employee.add(errorRecordWriter());
    
    • Your first 4 individual writers never throw exception, instead mark it as processed but add the caught exception as attribute of EmployeeWrapper.

    • Your 5th errorRecordWriter receives all the records, check any record that has exception attribute added and writes them to error table. Incase it failed to write error record, you can throw the exception and all 5 writers will be retried.

    • Regarding how you would know which record is error record when the batch update fails. It seems when an error occur in chunk, spring rollbacks the chunk and start retrying it record by record in that chunk so it knows which record is the problematic. So you can do the same thing in your individual writers. I.e catch the batch update exception and then retry them one by one to separate the error records

提交回复
热议问题