Spring Batch একটি শক্তিশালী ফ্রেমওয়ার্ক যা বড় ডেটাসেটের ব্যাচ প্রসেসিংয়ের জন্য ব্যবহৃত হয়। তবে, যেহেতু ব্যাচ প্রক্রিয়াগুলিতে অনেক সময় ডেটা ট্রান্সফরমেশন, ডেটা রিডিং এবং রাইটিংয়ের মধ্যে ব্যতিক্রমী অবস্থা (exception) ঘটতে পারে, তাই Spring Batch এ Exception Handling খুবই গুরুত্বপূর্ণ।
Spring Batch এর মধ্যে বিভিন্ন ধরনের exception handling কৌশল রয়েছে, যা ব্যাচ প্রক্রিয়া চলাকালে ঘটতে থাকা ত্রুটিগুলো সঠিকভাবে মোকাবেলা করতে সাহায্য করে। সাধারণত, Step এবং Job এর মধ্যে exception handling এর কৌশলগুলি ব্যবহৃত হয়। Spring Batch এ exception handling-এর জন্য SkipPolicy, RetryPolicy, এবং Fault Tolerance (ত্রুটি সহনশীলতা) ব্যবহৃত হতে পারে।
Spring Batch Exception Handling: উদাহরণ সহ
১. SkipPolicy ব্যবহার করে Exception Handling
Spring Batch এ SkipPolicy ব্যবহার করা হয় যা ডেটা প্রসেসিংয়ের সময় কোনো নির্দিষ্ট exception ঘটলে সেই exception গুলি বাদ (skip) করার জন্য ব্যবহার করা হয়। এর মাধ্যমে আপনি নির্দিষ্ট exception গুলি অগ্রাহ্য করতে পারেন এবং অন্য আইটেমগুলো প্রসেস চালিয়ে যেতে পারেন।
SkipPolicy কনফিগারেশন:
- ItemProcessor তে exception handling এর জন্য
SkipPolicyপ্রয়োগ করা হয়। SkipPolicyব্যবহার করার জন্য Spring Batch Step কনফিগারেশনেfaultTolerant().skip()মেথড ব্যবহার করা হয়।
উদাহরণ:
ধরা যাক, একটি ItemProcessor রয়েছে যেখানে কিছু ডেটা প্রক্রিয়াকরণের সময় NumberFormatException বা NullPointerException হতে পারে। এই ক্ষেত্রে আমরা SkipPolicy ব্যবহার করব যা শুধুমাত্র নির্দিষ্ট exception গুলি skip করবে।
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.<Person, Person> chunk(10)
.reader(personReader())
.processor(personProcessor())
.writer(personWriter())
.faultTolerant()
.skip(NumberFormatException.class) // NumberFormatException ঘটলে, ঐ আইটেমটি স্কিপ হবে
.skipLimit(5) // সর্বাধিক 5টি আইটেম স্কিপ করা যাবে
.build();
}
@Bean
public ItemProcessor<Person, Person> personProcessor() {
return new ItemProcessor<Person, Person>() {
@Override
public Person process(Person person) throws Exception {
if (person.getAge() < 0) {
throw new NumberFormatException("Invalid age value: " + person.getAge()); // যদি বয়স নেতিবাচক হয়, ত্রুটি ঘটবে
}
return person;
}
};
}
ব্যাখ্যা:
skip(NumberFormatException.class): এই লাইনটি নির্দিষ্ট করে যেNumberFormatExceptionঘটলে ঐ আইটেমটি স্কিপ করা হবে এবং প্রসেসিং চালিয়ে যাওয়া হবে।skipLimit(5): সর্বাধিক 5টি আইটেম স্কিপ করা যাবে, এর বেশি হলে পুরো ব্যাচ প্রক্রিয়া ব্যর্থ হবে।
২. RetryPolicy ব্যবহার করে Exception Handling
RetryPolicy ব্যবহার করে আমরা কোনো নির্দিষ্ট exception ঘটলে সেই exception পুনরায় retry করতে পারি। Spring Batch এর @Retryable অ্যানোটেশন বা retry() মেথড ব্যবহার করে retry কৌশল প্রয়োগ করা হয়। এটি ত্রুটি ঘটলে একাধিক বার একটি নির্দিষ্ট কাজ করার জন্য ব্যবহৃত হয়।
RetryPolicy কনফিগারেশন:
@Bean
public Step step2() {
return stepBuilderFactory.get("step2")
.<Person, Person> chunk(10)
.reader(personReader())
.processor(personProcessor())
.writer(personWriter())
.faultTolerant()
.retry(Exception.class) // কোনো exception ঘটলে retry করা হবে
.retryLimit(3) // 3 বার retry হবে
.build();
}
ব্যাখ্যা:
retry(Exception.class): কোন exception ঘটলে এটি retry করবে।retryLimit(3): সর্বাধিক 3 বার retry করা হবে, এর পরে ব্যাচ প্রক্রিয়া ব্যর্থ হবে।
৩. Exception Handling in ItemWriter
Spring Batch এ ItemWriter এর মধ্যেও exception handling করা সম্ভব, যেখানে ডেটা রাইটিংয়ের সময় কোনো ত্রুটি ঘটলে সেটি ক্যাচ এবং প্রক্রিয়া করা হয়। উদাহরণস্বরূপ, যদি ফাইল লেখার সময় কোনো সমস্যা হয়, তবে exception handling ব্যবহার করে আমরা সেই সমস্যা মোকাবেলা করতে পারি।
উদাহরণ:
@Bean
public ItemWriter<Person> personWriter() {
return new ItemWriter<Person>() {
@Override
public void write(List<? extends Person> items) throws Exception {
try {
// Write items to the database or file
for (Person person : items) {
// Some operation, e.g., writing to a file
if (person.getName() == null) {
throw new Exception("Name is null"); // Example exception
}
System.out.println("Writing person: " + person.getName());
}
} catch (Exception e) {
// Log or handle exception as needed
System.out.println("Error writing items: " + e.getMessage());
throw e; // Rethrow exception if needed
}
}
};
}
এখানে, যদি person.getName() null থাকে, তবে একটি exception হবে এবং সেই exception ক্যাচ করে আমরা উপযুক্ত বার্তা লগ করতে পারব।
৪. Step Level Exception Handling
Spring Batch এ Step এর মধ্যে exception handling করা যায় যাতে পুরো Step চালানোর সময় কোনো ত্রুটি ঘটলে সেগুলো সঠিকভাবে মোকাবেলা করা যায়।
উদাহরণ:
@Bean
public Step step3() {
return stepBuilderFactory.get("step3")
.<Person, Person> chunk(10)
.reader(personReader())
.processor(personProcessor())
.writer(personWriter())
.listener(new StepExecutionListener() {
@Override
public void beforeStep(StepExecution stepExecution) {
// Step শুরু হওয়ার আগে কিছু কাজ করা যাবে
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
if (stepExecution.getExitStatus().equals(ExitStatus.FAILED)) {
// Error Handling: Step ব্যর্থ হলে
System.out.println("Step failed with error: " + stepExecution.getFailureExceptions());
}
return null;
}
})
.build();
}
এখানে, afterStep মেথডের মধ্যে আপনি Step এর ফলাফল চেক করতে পারেন এবং যদি Step ব্যর্থ হয়, তাহলে সেই error গুলো লগ করতে পারেন।
সারাংশ
Spring Batch এ exception handling খুবই গুরুত্বপূর্ণ, বিশেষ করে ব্যাচ প্রসেসিংয়ের সময় যখন ডেটা রিডিং, প্রসেসিং, বা রাইটিংয়ে ত্রুটি ঘটতে পারে। SkipPolicy এবং RetryPolicy এর মাধ্যমে আমরা নির্দিষ্ট exception গুলি skip করতে বা retry করতে পারি, যা ব্যাচ প্রক্রিয়ার নিরবচ্ছিন্ন চলমানতা নিশ্চিত করে। এছাড়া, ItemWriter এবং Step এর মধ্যে exception handling প্রক্রিয়াগুলি ব্যবহৃত হয়, যা ব্যাচ প্রক্রিয়ার বিভিন্ন ধাপে ত্রুটি মোকাবেলায় সহায়তা করে। Spring Batch এর exception handling কৌশলগুলো ব্যাচ প্রসেসিংয়ের কার্যকারিতা এবং নির্ভরযোগ্যতা বাড়াতে সাহায্য করে।
Read more