Spring Batch তে Exception Handling একটি গুরুত্বপূর্ণ দিক, কারণ ব্যাচ প্রসেসিংয়ে ডেটা প্রক্রিয়া করার সময় বিভিন্ন ধরনের সমস্যা হতে পারে যেমন: ডেটা ফরম্যাটের ভুল, ইনপুট ফাইলের অভাব, ডেটাবেস কানেকশন ইস্যু ইত্যাদি। Spring Batch আপনাকে custom exception handling করার সুযোগ দেয়, যাতে আপনি এই ধরনের ত্রুটিগুলো ঠিকভাবে মোকাবিলা করতে পারেন এবং ব্যাচ প্রসেসিং চলাকালীন ব্যর্থতার জন্য কাস্টম সমাধান প্রদান করতে পারেন।
এখানে Custom Exception Handling এর একটি উদাহরণ দেওয়া হচ্ছে যেখানে Spring Batch কাজ করার সময় ItemProcessor বা ItemReader তে ত্রুটি সনাক্ত হলে কাস্টম এক্সেপশন তৈরি করা হবে এবং এর মাধ্যমে সেই ত্রুটি সঠিকভাবে হ্যান্ডেল করা হবে।
1. Custom Exception Class তৈরি করা
প্রথমে একটি কাস্টম এক্সেপশন ক্লাস তৈরি করতে হবে যা ব্যাচ প্রসেসিংয়ের সময় যে কোনো ত্রুটি ঘটলে তা কাস্টমাইজড তথ্য প্রদান করবে।
public class CustomBatchException extends RuntimeException {
public CustomBatchException(String message) {
super(message);
}
public CustomBatchException(String message, Throwable cause) {
super(message, cause);
}
}
এই CustomBatchException ক্লাসটি একটি কাস্টম RuntimeException যা ব্যাচ প্রসেসিংয়ের সময় ত্রুটি ঘটলে ব্যবহার করা হবে।
2. ItemProcessor বা ItemReader তে Custom Exception Handling
ধরা যাক, আমাদের একটি ব্যাচ প্রসেসিং কাজ আছে যেখানে কিছু ডেটা প্রক্রিয়া করার সময় যদি কোনো ত্রুটি ঘটে, তবে আমরা কাস্টম এক্সেপশন ব্যবহার করে সেই ত্রুটির সাথে ডিল করব।
Example: ItemProcessor তে Custom Exception Handling
public class MyItemProcessor implements ItemProcessor<MyItem, MyProcessedItem> {
@Override
public MyProcessedItem process(MyItem item) throws Exception {
try {
// কিছু প্রক্রিয়া
if (item.getValue() < 0) {
// যদি কোনো অস্বাভাবিক ডেটা পাওয়া যায়, তাহলে কাস্টম এক্সেপশন ছোড়া হবে
throw new CustomBatchException("Invalid value found in item: " + item);
}
// যদি সবকিছু ঠিক থাকে, তাহলে প্রক্রিয়া করা আইটেম রিটার্ন করা হবে
return new MyProcessedItem(item.getValue() * 2); // উদাহরণস্বরূপ মান বৃদ্ধি করা
} catch (Exception e) {
// এক্সেপশন হ্যান্ডলিং
throw new CustomBatchException("Error processing item: " + item, e);
}
}
}
এখানে, MyItemProcessor ক্লাসে আমরা চেক করছি যদি ইনপুট item.getValue() নেগেটিভ হয়, তাহলে একটি কাস্টম এক্সেপশন CustomBatchException ছোড়া হচ্ছে।
Example: ItemReader তে Custom Exception Handling
public class MyItemReader implements ItemReader<MyItem> {
@Override
public MyItem read() throws Exception {
try {
MyItem item = fetchItemFromDataSource(); // ডেটা সোর্স থেকে আইটেম পড়া
if (item == null) {
// যদি আইটেম না পাওয়া যায়, তাহলে কাস্টম এক্সেপশন ছোড়া হবে
throw new CustomBatchException("No valid item found in the data source.");
}
return item;
} catch (Exception e) {
throw new CustomBatchException("Error reading item from data source", e);
}
}
}
এখানে, MyItemReader ক্লাসে, আমরা ডেটা সোর্স থেকে একটি আইটেম পড়ছি, কিন্তু যদি কোনো আইটেম পাওয়া না যায় বা কোনো সমস্যা ঘটে, তখন কাস্টম এক্সেপশন ছোড়া হবে।
3. Step Listener ব্যবহার করে Exception Handling
Spring Batch-এ ItemProcessor, ItemReader বা অন্যান্য প্রসেসিং কম্পোনেন্টগুলোর মধ্যে ঘটে যাওয়া ত্রুটি মোকাবিলা করার জন্য Step Listener ব্যবহার করা যেতে পারে। StepExecutionListener একটি ইন্টারফেস যা beforeStep() এবং afterStep() মেথড দিয়ে Step-এর আগে এবং পরে কিছু কার্যক্রম করতে সাহায্য করে, এবং ত্রুটি ঘটলে এর মাধ্যমে কাস্টম এক্সেপশন হ্যান্ডলিং করা যায়।
@Component
public class CustomStepListener implements StepExecutionListener {
@Override
public void beforeStep(StepExecution stepExecution) {
// Step শুরু হওয়ার আগে কোনো কার্যকলাপ করা যেতে পারে
System.out.println("Starting step: " + stepExecution.getStepName());
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
// Step শেষ হওয়ার পরে ত্রুটি থাকলে কাস্টম এক্সেপশন হ্যান্ডলিং
if (stepExecution.getStatus() == BatchStatus.FAILED) {
Throwable exception = stepExecution.getFailureExceptions().get(0);
if (exception instanceof CustomBatchException) {
System.err.println("Custom Exception occurred: " + exception.getMessage());
}
}
return null;
}
}
এখানে, CustomStepListener ক্লাসে afterStep মেথডে, যদি Step এর execution ব্যর্থ হয় এবং কাস্টম এক্সেপশন ঘটে, তখন তা লোগ করা হচ্ছে।
4. Job Configuration এ Listener যোগ করা
এখন, আমরা Step বা Job কনফিগারেশনে Listener যোগ করতে পারি, যাতে Exception Handling সঠিকভাবে কাজ করে।
@Bean
public Job job(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory,
CustomStepListener listener) {
return jobBuilderFactory.get("myJob")
.start(step1())
.listener(listener) // Listener যোগ করা
.build();
}
@Bean
public Step step1(ItemReader<MyItem> reader, ItemProcessor<MyItem, MyProcessedItem> processor, ItemWriter<MyProcessedItem> writer) {
return stepBuilderFactory.get("step1")
.<MyItem, MyProcessedItem>chunk(10)
.reader(reader)
.processor(processor)
.writer(writer)
.build();
}
এখানে, CustomStepListener কে Step-এ যোগ করা হয়েছে, যা Step-এর শেষ হওয়ার পরে কাস্টম এক্সেপশন হ্যান্ডলিং করতে সাহায্য করবে।
সারাংশ
Spring Batch-এ Custom Exception Handling একটি গুরুত্বপূর্ণ প্রক্রিয়া যা ব্যাচ প্রসেসিংয়ের সময় ত্রুটি সনাক্ত এবং সঠিকভাবে মোকাবিলা করতে সাহায্য করে। আপনি কাস্টম এক্সেপশন তৈরি করে ব্যাচ প্রসেসিংয়ের মধ্যে বিভিন্ন কাজের জন্য ত্রুটি পরিচালনা করতে পারেন, যেমন ItemReader, ItemProcessor, এবং ItemWriter-এ ত্রুটি হ্যান্ডলিং। Step Listener এবং Job Listener ব্যবহার করে আপনি Step এবং Job এর কার্যক্রমের সময়ে ত্রুটি হ্যান্ডলিং করতে পারেন। এটি ব্যাচ প্রসেসিংয়ে দ্রুত এবং কার্যকরী ত্রুটি মোকাবিলা নিশ্চিত করে।
Read more