স্প্রিং ব্যাচ (Spring Batch) একটি শক্তিশালী ফ্রেমওয়ার্ক যা ব্যাচ প্রসেসিংয়ের জন্য ব্যবহৃত হয়। এর মাধ্যমে আপনি বৃহৎ পরিমাণ ডেটা প্রক্রিয়া করতে পারেন। ব্যাচ প্রসেসিংয়ের একটি গুরুত্বপূর্ণ অংশ হল ItemReader। ItemReader হলো একটি অবজেক্ট যা ইনপুট ডেটা থেকে একটি বা একাধিক আইটেম পড়তে ব্যবহৃত হয়। স্প্রিং ব্যাচে Custom ItemReader তৈরি করার মাধ্যমে আপনি আপনার বিশেষ প্রয়োজন অনুযায়ী ডেটা রিডার কাস্টমাইজ করতে পারেন। যেমন, আপনি একটি ফাইল, ডেটাবেস, অথবা অন্য কোনো ডেটা সোর্স থেকে ডেটা পড়তে পারেন।
এই টিউটোরিয়ালে আমরা দেখব কীভাবে Custom ItemReader তৈরি করা যায় এবং তা ব্যাচ প্রসেসিংয়ের অংশ হিসেবে ব্যবহার করা যায়।
ItemReader এর ভূমিকা
ItemReader একটি ইন্টারফেস যা সাধারণত স্প্রিং ব্যাচে ব্যবহৃত হয়, যার মাধ্যমে ডেটা একটি সোর্স থেকে পড়া হয়। ItemReader এর প্রধান কাজ হলো ইনপুট সোর্স (যেমন ফাইল, ডেটাবেস, বা অন্য কোনো ডেটা সোর্স) থেকে একটি আইটেম (বা একাধিক আইটেম) রিড করা। এর দুটি প্রধান মেথড রয়েছে:
- read(): এটি একটি আইটেম পড়ে এবং তা রিটার্ন করে। যদি আর কোনো আইটেম না থাকে তবে এটি
nullরিটার্ন করে। - close(): এটি আইটেম রিডারের রিসোর্স ক্লোজ করে। যেমন, ফাইল ক্লোজ করা বা ডেটাবেস সংযোগ বন্ধ করা।
Custom ItemReader তৈরি করা
স্প্রিং ব্যাচে Custom ItemReader তৈরি করতে হলে, আপনাকে ItemReader ইন্টারফেস ইমপ্লিমেন্ট করতে হবে এবং তার মধ্যে ডেটা রিড করার লজিক প্রয়োগ করতে হবে।
১. Custom ItemReader ক্লাস তৈরি করা
ধরা যাক, আপনি একটি CSV ফাইল থেকে ডেটা পড়তে চান। এর জন্য আপনি একটি কাস্টম ItemReader তৈরি করবেন।
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class CustomFileItemReader implements ItemReader<MyData> {
private BufferedReader reader;
private String currentLine;
// Constructor for file path
public CustomFileItemReader(String filePath) throws IOException {
this.reader = new BufferedReader(new FileReader(filePath));
}
@Override
public MyData read() throws Exception {
// Read the next line from the file
currentLine = reader.readLine();
if (currentLine == null) {
return null; // No more data, return null to indicate end of data
}
// Process the current line (parsing it into MyData object)
MyData myData = processLine(currentLine);
return myData;
}
private MyData processLine(String line) {
// Parse the line into MyData object (For example, CSV)
String[] data = line.split(",");
MyData myData = new MyData();
myData.setField1(data[0]);
myData.setField2(data[1]);
return myData;
}
@Override
public void close() throws Exception {
// Close the reader when finished
reader.close();
}
}
এখানে, CustomFileItemReader একটি CSV ফাইল থেকে ডেটা পড়ে এবং তা MyData অবজেক্টে রূপান্তরিত করে। read() মেথডটি একটি লাইন পড়ে এবং processLine() মেথডে তা প্রসেস করে একটি MyData অবজেক্ট রিটার্ন করে। যখন আর কোনো লাইন থাকবে না, তখন এটি null রিটার্ন করবে যা ব্যাচ প্রসেসিংয়ের জন্য একটি ইন্ডিকেটর।
২. MyData ক্লাস তৈরি করা
public class MyData {
private String field1;
private String field2;
// Getters and Setters
public String getField1() {
return field1;
}
public void setField1(String field1) {
this.field1 = field1;
}
public String getField2() {
return field2;
}
public void setField2(String field2) {
this.field2 = field2;
}
}
MyData একটি সিম্পল POJO ক্লাস, যেখানে field1 এবং field2 নামক দুটি ফিল্ড আছে। এই ফিল্ডগুলি আপনার ডেটা সোর্সের (যেমন CSV ফাইল) কলাম হিসেবে ব্যবহার হবে।
৩. Spring Batch Job Configuration
এখন, আপনি স্প্রিং ব্যাচের Job কনফিগারেশন ফাইলে এই CustomItemReader ব্যবহার করতে পারেন। ধরুন, আমাদের একটি ব্যাচ জব তৈরি করতে হবে যেখানে CustomItemReader ব্যবহার করা হবে।
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.Job;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BatchConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Job job() {
return jobBuilderFactory.get("job")
.start(step1())
.build();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.<MyData, MyData>chunk(10)
.reader(customItemReader()) // Custom ItemReader
.processor(new MyDataProcessor()) // Optional: Custom Processor (if needed)
.writer(new MyDataWriter()) // Optional: Custom Writer (if needed)
.build();
}
@Bean
public CustomFileItemReader customItemReader() throws Exception {
return new CustomFileItemReader("path/to/your/file.csv"); // Provide file path
}
}
এখানে, Job এবং Step কনফিগারেশন করা হয়েছে। step1() এ CustomFileItemReader কে ব্যবহার করা হয়েছে, যা একটি কাস্টম ItemReader। chunk(10) ব্যবহার করা হয়েছে, যা ব্যাচের জন্য প্রতি ১০টি আইটেমে কাজ করবে।
৪. ItemProcessor এবং ItemWriter (যদি প্রয়োজন হয়)
আপনি যদি ডেটা প্রসেস এবং লেখার জন্য কাস্টম লজিক ব্যবহার করতে চান, তাহলে আপনি ItemProcessor এবং ItemWriter তৈরি করতে পারেন।
Custom ItemProcessor:
import org.springframework.batch.item.ItemProcessor;
public class MyDataProcessor implements ItemProcessor<MyData, MyData> {
@Override
public MyData process(MyData item) throws Exception {
// Process data before writing it (if needed)
item.setField1(item.getField1().toUpperCase()); // Example transformation
return item;
}
}
Custom ItemWriter:
import org.springframework.batch.item.ItemWriter;
import java.util.List;
public class MyDataWriter implements ItemWriter<MyData> {
@Override
public void write(List<? extends MyData> items) throws Exception {
for (MyData item : items) {
// Write each item (for example, print or store in a DB)
System.out.println("Writing item: " + item.getField1());
}
}
}
সারাংশ
স্প্রিং ব্যাচে Custom ItemReader তৈরি করার মাধ্যমে আপনি আপনার বিশেষ প্রয়োজনে ডেটা সোর্স থেকে ডেটা রিড করার লজিক কাস্টমাইজ করতে পারেন। আপনি যেমন CSV ফাইল, ডেটাবেস, বা অন্য কোনো ডেটা সোর্স থেকে ডেটা পড়তে পারেন। এর মাধ্যমে, ব্যাচ প্রোসেসিংয়ের কার্যকরীতা এবং ফ্লেক্সিবিলিটি বৃদ্ধি পায়। ItemReader ইন্টারফেস ইমপ্লিমেন্ট করে এবং স্প্রিং ব্যাচের বিভিন্ন স্টেপে তা ব্যবহার করে আপনি সহজেই ব্যাচ প্রসেসিংয়ের এক্সিকিউশন নিয়ন্ত্রণ করতে পারেন।
Read more