স্প্রিং ব্যাচ (Spring Batch) এর ItemReader হল একটি মৌলিক কম্পোনেন্ট যা ডেটা পড়ার জন্য ব্যবহৃত হয়। এটি ব্যাচ প্রসেসিংয়ের প্রথম ধাপ, যেখানে ডেটা এক্সটের্নাল সোর্স (যেমন ডেটাবেস, ফাইল, বা অন্য কোনো সোর্স) থেকে পড়া হয় এবং পরবর্তী ধাপের জন্য প্রক্রিয়া করার জন্য সরবরাহ করা হয়। ItemReader স্প্রিং ব্যাচের Step অংশ হিসেবে কাজ করে এবং ডেটার পরবর্তী ধাপে পাঠানো বা প্রসেসিংয়ের জন্য উপস্থাপন করে।
এখানে, আমরা স্প্রিং ব্যাচে ItemReader কনফিগারেশনের উদাহরণ দেখব। এই উদাহরণে, আমরা ফাইল থেকে ডেটা পড়ার জন্য ItemReader কনফিগার করব। আমরা সাধারণত FlatFileItemReader ব্যবহার করি যেটি ফাইল থেকে ডেটা পড়ে।
স্প্রিং ব্যাচের ItemReader কনফিগারেশন
ItemReader কনফিগারেশনে কিছু জনপ্রিয় ItemReader ক্লাস রয়েছে যেমন:
FlatFileItemReader: সাধারণত CSV বা টেক্সট ফাইল থেকে ডেটা পড়ার জন্য ব্যবহৃত হয়।JdbcCursorItemReader: ডেটাবেস থেকে ডেটা পড়ার জন্য ব্যবহৃত হয়।JpaPagingItemReader: JPA (Java Persistence API) ব্যবহার করে ডেটাবেস থেকে ডেটা পড়ার জন্য ব্যবহৃত হয়।
এখানে একটি উদাহরণ দেওয়া হবে যেখানে আমরা একটি CSV ফাইল থেকে ডেটা পড়ার জন্য FlatFileItemReader ব্যবহার করব।
১. প্রয়োজনীয় ডিপেনডেন্সি
প্রথমে স্প্রিং ব্যাচ এবং ফাইল রিডার ব্যবহার করার জন্য প্রয়োজনীয় ডিপেনডেন্সি pom.xml ফাইলে যোগ করুন:
<dependencies>
<!-- Spring Boot Starter Batch -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<!-- Spring Boot Starter Data JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- MySQL JDBC Driver -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- CSV processing libraries -->
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-core</artifactId>
</dependency>
</dependencies>
২. ItemReader কনফিগারেশন - FlatFileItemReader
Step 1: User Data Model তৈরি করা
আমরা একটি User ডেটা মডেল তৈরি করব, যেটি CSV ফাইল থেকে পড়া হবে।
public class User {
private String name;
private String email;
private int age;
// Getters and Setters
}
Step 2: ItemReader কনফিগারেশন
এখন, আমরা একটি FlatFileItemReader কনফিগার করব, যেটি CSV ফাইল থেকে User অবজেক্টের ডেটা পড়বে।
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
import org.springframework.batch.item.file.transform.LineTokenizer;
import org.springframework.batch.item.file.mapping.FieldSetMapper;
@Bean
public FlatFileItemReader<User> itemReader() {
FlatFileItemReader<User> reader = new FlatFileItemReader<>();
reader.setResource(new ClassPathResource("users.csv")); // CSV ফাইলের লোকেশন
// LineTokenizer কনফিগারেশন
LineTokenizer lineTokenizer = new DelimitedLineTokenizer();
lineTokenizer.setNames("name", "email", "age"); // CSV ফাইলের কলাম নাম
// FieldSetMapper কনফিগারেশন
FieldSetMapper<User> fieldSetMapper = new BeanWrapperFieldSetMapper<>();
fieldSetMapper.setTargetType(User.class);
reader.setLineTokenizer(lineTokenizer);
reader.setFieldSetMapper(fieldSetMapper);
return reader;
}
এখানে:
FlatFileItemReader: ফাইল থেকে ডেটা পড়ার জন্য ব্যবহৃত হয়।DelimitedLineTokenizer: এটি CSV ফাইলের কলাম গুলিকে আলাদা করে (যেমন কমা দিয়ে) টোকেনাইজ করে।BeanWrapperFieldSetMapper: এটি CSV ফাইলের ডেটাকেUserঅবজেক্টে ম্যাপ করে।
Step 3: ফাইলের কাঠামো
উপরে দেওয়া FlatFileItemReader কনফিগারেশন অনুসারে, আমরা একটি users.csv ফাইল তৈরি করতে পারি যার কাঠামো হবে:
name,email,age
John Doe,john@example.com,30
Jane Smith,jane@example.com,25
Bob Johnson,bob@example.com,40
৩. ItemProcessor এবং ItemWriter কনফিগারেশন
স্প্রিং ব্যাচে সাধারণত ItemProcessor এবং ItemWriter ব্যবহার করে ডেটা প্রক্রিয়া এবং লেখা হয়। এখানে, আমরা একটি ItemProcessor কনফিগার করব যা নামের প্রথম অক্ষরকে বড় করবে এবং একটি ItemWriter কনফিগার করব যা কনসোলে ডেটা লেখবে।
ItemProcessor
import org.springframework.batch.item.ItemProcessor;
public class UserItemProcessor implements ItemProcessor<User, User> {
@Override
public User process(User user) throws Exception {
user.setName(user.getName().toUpperCase()); // Name কে বড় অক্ষরে পরিণত করা
return user;
}
}
ItemWriter
import org.springframework.batch.item.ItemWriter;
import java.util.List;
public class UserItemWriter implements ItemWriter<User> {
@Override
public void write(List<? extends User> items) throws Exception {
for (User user : items) {
System.out.println("Writing user: " + user.getName() + ", " + user.getEmail());
}
}
}
৪. Batch Job কনফিগারেশন
এখন, আমরা একটি Batch Job কনফিগার করব, যা ItemReader, ItemProcessor, এবং ItemWriter ব্যবহার করবে।
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.Job;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.<User, User>chunk(2) // Batch process in chunks of 2
.reader(itemReader()) // ItemReader
.processor(new UserItemProcessor()) // ItemProcessor
.writer(new UserItemWriter()) // ItemWriter
.build();
}
@Bean
public Job job() {
return jobBuilderFactory.get("job")
.start(step1())
.build();
}
}
এখানে:
chunk(2): আমরা ব্যাচে ২টি রেকর্ডে কাজ করব।ItemReader,ItemProcessor, এবংItemWriter-এর ইনস্ট্যান্স তৈরি করা হয়েছে।
৫. Application রান করা
স্প্রিং বুট অ্যাপ্লিকেশন চালানোর জন্য মূল ক্লাস তৈরি করা:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.batch.core.launch.JobParameters;
@SpringBootApplication
public class BatchApplication {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job job;
public static void main(String[] args) {
SpringApplication.run(BatchApplication.class, args);
}
@PostConstruct
public void runBatchJob() throws Exception {
jobLauncher.run(job, new JobParameters());
}
}
এখানে:
jobLauncher.run(job, new JobParameters())ব্যাচ জব চালাবে।
সারাংশ
স্প্রিং ব্যাচে ItemReader কনফিগারেশন ডেটা পড়ার জন্য অত্যন্ত গুরুত্বপূর্ণ। আমরা এখানে FlatFileItemReader ব্যবহার করে একটি CSV ফাইল থেকে ডেটা পড়ার উদাহরণ দেখেছি, যেখানে ItemProcessor এবং ItemWriter ব্যবহার করে ডেটা প্রক্রিয়া এবং লেখা হয়েছে। স্প্রিং ব্যাচের এই কনফিগারেশনগুলো সহজেই বৃহৎ পরিমাণ ডেটা প্রসেস করতে সহায়তা করে এবং ব্যাচ প্রসেসিংকে স্কেলেবল এবং কার্যকরী করে তোলে।
Read more