Spring Batch ফ্রেমওয়ার্কে, ItemReader হল একটি ইন্টারফেস যা ডেটা রিড করার জন্য ব্যবহৃত হয়। এটি একটি গুরুত্বপূর্ণ উপাদান কারণ এটি ব্যাচ প্রসেসিংয়ের প্রথম ধাপ, যেখানে ডেটা কোন উৎস (যেমন ডেটাবেস, ফাইল, কিউ, ইত্যাদি) থেকে রিড করা হয়। ItemReader-এর মাধ্যমে Spring Batch ডেটাকে রিড করে এবং পরবর্তী ItemProcessor বা ItemWriter এর জন্য প্রস্তুত করে।
ItemReader একটি ইন্টারফেস যা ডেটা উৎস থেকে এক এক করে ডেটা নিয়ে আসে। এটি স্প্রিং ব্যাচের Chunk-Oriented Processing পদ্ধতির সাথে কাজ করে, যেখানে একবারে একাধিক ডেটা আইটেম (items) রিড এবং প্রক্রিয়া করা হয়। প্রতিটি রিড আইটেম পরবর্তী স্টেপে পাঠানো হয়, যেগুলি প্রসেসিং বা রাইটিংয়ের জন্য প্রস্তুত থাকে।
ItemReader সাধারণত read()
মেথড ইমপ্লিমেন্ট করে, যা একটি একক ডেটা আইটেম রিটার্ন করে।
Spring Batch বেশ কিছু ভিন্ন ধরনের ItemReader প্রদান করে, যেগুলির মাধ্যমে বিভিন্ন উৎস থেকে ডেটা রিড করা যেতে পারে। যেমন:
ধরা যাক, আমাদের একটি CSV ফাইল আছে যেটি থেকে ডেটা রিড করতে হবে। এখানে FlatFileItemReader ব্যবহার করে কিভাবে CSV ফাইল থেকে ডেটা রিড করা যায় তা দেখানো হচ্ছে।
ফাইলের মধ্যে ডেটা থাকতে পারে যেমন:
firstName,lastName
John,Doe
Jane,Doe
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
import org.springframework.batch.item.file.transform.DefaultLineTokenizer;
import org.springframework.batch.item.file.transform.LineTokenizer;
import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder;
@Bean
public FlatFileItemReader<User> userItemReader() {
return new FlatFileItemReaderBuilder<User>()
.name("userItemReader")
.resource(new ClassPathResource("users.csv"))
.delimited()
.names(new String[]{"firstName", "lastName"})
.targetType(User.class)
.build();
}
User
ক্লাসে ডেটা ম্যাপ হবে।public class User {
private String firstName;
private String lastName;
// Getters and Setters
}
এখানে, CSV ফাইলের firstName
এবং lastName
কলামগুলো User
অবজেক্টের ফিল্ডের সাথে ম্যাপ হয়ে যাবে।
JdbcCursorItemReader ডেটাবেস থেকে ডেটা রিড করার জন্য ব্যবহৃত হয়। এটি একটি JDBC cursor ব্যবহার করে ডেটাবেজ থেকে ডেটা একে একে রিড করে।
import org.springframework.batch.item.database.JdbcCursorItemReader;
import org.springframework.jdbc.core.RowMapper;
import javax.sql.DataSource;
@Bean
public JdbcCursorItemReader<User> userItemReader(DataSource dataSource) {
JdbcCursorItemReader<User> reader = new JdbcCursorItemReader<>();
reader.setDataSource(dataSource);
reader.setSql("SELECT first_name, last_name FROM users");
reader.setRowMapper(new UserRowMapper());
return reader;
}
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserRowMapper implements RowMapper<User> {
@Override
public User mapRow(ResultSet resultSet, int rowNum) throws SQLException {
User user = new User();
user.setFirstName(resultSet.getString("first_name"));
user.setLastName(resultSet.getString("last_name"));
return user;
}
}
User
ক্লাস) রূপান্তরিত করে।Error Handling: ItemReader এর মাধ্যমে রিড করা ডেটা কখনও null বা ভুল হতে পারে, সেক্ষেত্রে প্রপার ত্রুটি হ্যান্ডলিং প্রয়োজন। আপনি skip policy ব্যবহার করে ভুল ডেটা স্কিপ করতে পারেন।
উদাহরণ:
reader.setSkippedLinesCallback((line) -> {
// Handle skipped lines
});
Spring Batch ItemReader ফ্রেমওয়ার্কের একটি গুরুত্বপূর্ণ উপাদান, যা বিভিন্ন উৎস (ফাইল, ডেটাবেস, কিউ ইত্যাদি) থেকে ডেটা রিড করার জন্য ব্যবহৃত হয়। Spring Batch বিভিন্ন ধরনের ItemReader প্রদান করে, যেমন FlatFileItemReader, JdbcCursorItemReader, JpaPagingItemReader ইত্যাদি, যেগুলি বিভিন্ন উৎস থেকে ডেটা রিড করতে সক্ষম। ItemReader এর মাধ্যমে আপনি বড় পরিমাণ ডেটা স্কেলেবলি এবং কার্যকরভাবে রিড করতে পারেন, এবং পরবর্তী ItemProcessor বা ItemWriter এর জন্য প্রক্রিয়াজাত ডেটা প্রস্তুত করতে পারেন।
ItemReader হল Spring Batch এর একটি গুরুত্বপূর্ণ উপাদান, যা একটি Step এর মধ্যে ডেটা রিডিং (পড়া) কাজ করে। এটি মূলত একটি কাস্টম অবজেক্ট যা ডেটা সোর্স থেকে ডেটা পড়তে ব্যবহৃত হয়। Spring Batch এর মধ্যে, ItemReader
ব্যবহার করা হয় ডেটা এক্সট্র্যাকশন (Extract) করার জন্য, যেমন ডেটাবেস, ফাইল, ওয়েব সার্ভিস, বা অন্য কোনো সোর্স থেকে ডেটা রিড করা।
ItemReader এমন একটি কনট্রাক্ট ইন্টারফেস, যার মাধ্যমে আপনি ডেটা সোর্স (যেমন ফাইল, ডেটাবেস, এক্সটার্নাল API ইত্যাদি) থেকে ডেটা পড়তে পারবেন। সাধারণত, ItemReader
কাস্টম ইমপ্লিমেন্টেশন সরবরাহ করতে পারে যা বিভিন্ন ফরম্যাটে বা সোর্স থেকে ডেটা প্রক্রিয়া করে।
Spring Batch এ বেশ কিছু ডিফল্ট ItemReader ইমপ্লিমেন্টেশন রয়েছে, তবে আপনি চাইলে কাস্টম ItemReader ইমপ্লিমেন্টেশনও তৈরি করতে পারেন। কিছু প্রচলিত ItemReader প্রকার হলো:
ItemReader এর প্রয়োজনীয়তা নানা কারণে গুরুত্বপূর্ণ, বিশেষত Spring Batch এর মতো ব্যাচ প্রসেসিং ফ্রেমওয়ার্কে। এখানে তার প্রধান কিছু কারণ তুলে ধরা হলো:
ItemReader Spring Batch-এ ডেটা সোর্স থেকে ডেটা পড়ার জন্য একটি স্ট্যান্ডার্ড ইন্টারফেস সরবরাহ করে। এটি ডেটার রিডিং প্রক্রিয়াকে সরল এবং সুবিধাজনক করে তোলে।
ItemReader ব্যবহার করে, আপনি যে কোনো ধরনের ডেটা সোর্স বা ফরম্যাট থেকে ডেটা পড়তে পারেন। এটি একটি শক্তিশালী এবং ফ্লেক্সিবল মেকানিজম যা কোনো নির্দিষ্ট ডেটা সোর্সের উপর নির্ভর করে না। উদাহরণস্বরূপ, আপনি যদি CSV ফাইল থেকে ডেটা পড়েন, তাহলে FlatFileItemReader ব্যবহার করবেন, আর যদি ডেটাবেস থেকে ডেটা পড়েন, তাহলে JdbcCursorItemReader ব্যবহার করবেন।
ItemReader একবারে একাধিক রেকর্ড পড়তে পারে এবং তারপরে ডেটা রাইট করার জন্য একটি chunk-এ প্রক্রিয়া করতে সহায়তা করে (Chunk-Oriented Processing)। এটি একটি ভাল পারফরম্যান্স প্রদান করে, বিশেষত বড় ডেটাসেটের জন্য।
ItemReader শুধুমাত্র প্রয়োজনীয় ডেটা রিড করে এবং একে একে প্রক্রিয়া করে, ফলে মেমোরির ব্যবহার অপ্টিমাইজ হয়। এটি chunk-oriented প্রসেসিং ধারণা অনুসরণ করে, যেখানে রিড করা ডেটা কিছু পরিমাণে chunk করে প্রসেস করা হয় এবং মেমরি ব্যবহারের ওপর চাপ কমানো হয়।
ItemReader ডেটার মধ্যে consistency বজায় রাখার জন্য ব্যবহৃত হয়। আপনি যদি large-scale batch processing করে থাকেন, তখন ডেটার integrity নিশ্চিত করার জন্য 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 org.springframework.core.io.ClassPathResource;
@Bean
public FlatFileItemReader<User> reader() {
FlatFileItemReader<User> reader = new FlatFileItemReader<>();
reader.setResource(new ClassPathResource("users.csv"));
reader.setLineMapper(new DefaultLineMapper<User>() {{
setLineTokenizer(new DelimitedLineTokenizer() {{
setNames("id", "name", "email");
}});
setFieldSetMapper(new BeanWrapperFieldSetMapper<User>() {{
setTargetType(User.class);
}});
}});
return reader;
}
এখানে FlatFileItemReader
ব্যবহার করে CSV ফাইল থেকে ডেটা রিড করা হচ্ছে। DelimitedLineTokenizer
দিয়ে CSV ফাইলের কলামগুলো আলাদা করা হচ্ছে এবং BeanWrapperFieldSetMapper
এর মাধ্যমে ডেটাকে User
অবজেক্টে ম্যাপ করা হচ্ছে।
import org.springframework.batch.item.database.JdbcCursorItemReader;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
@Bean
public JdbcCursorItemReader<User> reader() {
JdbcCursorItemReader<User> reader = new JdbcCursorItemReader<>();
reader.setDataSource(dataSource);
reader.setSql("SELECT id, name, email FROM users");
reader.setRowMapper(new BeanPropertyRowMapper<>(User.class));
return reader;
}
এখানে JdbcCursorItemReader
ব্যবহার করে ডেটাবেস থেকে users
টেবিলের ডেটা রিড করা হচ্ছে। setSql
দিয়ে SQL কোয়েরি নির্ধারণ করা হচ্ছে এবং RowMapper
দিয়ে ডেটা User
অবজেক্টে ম্যাপ করা হচ্ছে।
ItemReader Spring Batch-এ একটি গুরুত্বপূর্ণ কম্পোনেন্ট যা ডেটা সোর্স থেকে ডেটা রিড করার জন্য ব্যবহৃত হয়। এটি Spring Batch এর chunk-oriented processing এর মাধ্যমে বড় ডেটাসেট প্রক্রিয়া করার জন্য পারফরম্যান্স অপ্টিমাইজেশন এবং মেমরি ব্যবহারের দিকে মনোযোগ দেয়। বিভিন্ন ধরনের ItemReader (যেমন, FlatFileItemReader
, JdbcCursorItemReader
) দিয়ে আপনি বিভিন্ন সোর্স থেকে ডেটা পড়তে পারেন। এটি ডেটার integrity বজায় রাখে এবং বড় ডেটা সেটের ক্ষেত্রে খুবই কার্যকরী।
স্প্রিং ব্যাচ (Spring Batch) একটি শক্তিশালী ফ্রেমওয়ার্ক যা ব্যাচ প্রসেসিংয়ের জন্য ব্যবহৃত হয়, এবং এটি বিভিন্ন ধরনের ItemReader সরবরাহ করে ডাটা রিড করার জন্য। এই ItemReader গুলি বিভিন্ন ধরনের ডাটা সোর্স থেকে ডাটা পড়তে সহায়তা করে, যেমন ফাইল, ডাটাবেস, বা JPA (Java Persistence API) এর মাধ্যমে।
আজ আমরা আলোচনা করব FlatFileItemReader, JdbcCursorItemReader, এবং JpaPagingItemReader এর ব্যবহারের উপর।
FlatFileItemReader একটি স্প্রিং ব্যাচ ক্লাস যা সাধারণত টেক্সট ফাইল বা CSV ফাইল থেকে ডাটা রিড করতে ব্যবহৃত হয়। এটি ফাইলের প্রতিটি রেকর্ডকে একটি একক আইটেম হিসেবে রিড করে এবং তাকে প্রসেসিং স্টেপে পাঠায়। FlatFileItemReader সাধারণত ফাইল প্রক্রিয়াকরণে ব্যবহৃত হয় যেখানে ডাটা লাইন বাই লাইন বা ডেলিমিটার দ্বারা আলাদা করা থাকে।
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
@Bean
public FlatFileItemReader<Employee> reader() {
FlatFileItemReader<Employee> reader = new FlatFileItemReader<>();
reader.setResource(new ClassPathResource("employee.csv"));
// Tokenizer configuration
DelimitedLineTokenizer lineTokenizer = new DelimitedLineTokenizer();
lineTokenizer.setNames(new String[]{"id", "firstName", "lastName", "email"});
// FieldSetMapper to map each line to an object
BeanWrapperFieldSetMapper<Employee> fieldSetMapper = new BeanWrapperFieldSetMapper<>();
fieldSetMapper.setTargetType(Employee.class);
reader.setLineTokenizer(lineTokenizer);
reader.setFieldSetMapper(fieldSetMapper);
return reader;
}
employee.csv
) থেকে ডাটা রিড করতে ব্যবহৃত হচ্ছে।Employee
ক্লাসের অবজেক্টে ম্যাপ করা হয়।এটি সিপিএফ (CSV ফাইল) বা যে কোনও ডেলিমিটারযুক্ত ফাইল থেকে ডাটা রিড করার জন্য ব্যবহৃত হয়।
JdbcCursorItemReader একটি স্প্রিং ব্যাচ ক্লাস যা ডাটাবেস থেকে ডাটা রিড করতে ব্যবহৃত হয়। এটি JDBC ব্যবহার করে ডাটাবেস কুয়েরি রেজাল্ট সেট থেকে ডাটা রিড করে এবং একটি নির্দিষ্ট অবজেক্টে ম্যাপ করে পাঠায়। এটি লেজি লোডিং পদ্ধতিতে কাজ করে, যার মানে হল যে এটি একে একে ডাটাবেস রেকর্ড রিড করে এবং মেমরিতে লোড করে।
import org.springframework.batch.item.database.JdbcCursorItemReader;
import javax.sql.DataSource;
@Bean
public JdbcCursorItemReader<Employee> reader(DataSource dataSource) {
JdbcCursorItemReader<Employee> reader = new JdbcCursorItemReader<>();
reader.setDataSource(dataSource);
reader.setSql("SELECT id, first_name, last_name, email FROM employee");
reader.setRowMapper(new EmployeeRowMapper());
return reader;
}
SELECT
) দিয়ে ডাটাবেস থেকে ডাটা রিড করে।EmployeeRowMapper
ক্লাসে ম্যাপ করা হয়। এই ক্লাসটি RowMapper
ইন্টারফেস ইমপ্লিমেন্ট করে, যা SQL রেজাল্ট সেট থেকে রেকর্ড ম্যাপ করার কাজ করে।এই পাঠকটি ডাটাবেসের মধ্যে বড় পরিমাণ ডাটা রিড করার জন্য আদর্শ, কারণ এটি লেজি লোডিং ব্যবহার করে এবং মেমরি ব্যবহার কম রাখে।
JpaPagingItemReader স্প্রিং ব্যাচে একটি ক্লাস যা JPA (Java Persistence API) ব্যবহার করে পেজিনেশন ভিত্তিক ডাটা রিডিংয়ের জন্য ব্যবহৃত হয়। এটি পেজ বাই পেজ ডাটা রিড করতে পারে, যার মাধ্যমে ডাটাবেস থেকে বড় পরিমাণ ডাটা টুকরো টুকরো করে রিড করা হয় এবং মেমরি ব্যবহারের পরিমাণ কমানো হয়।
import org.springframework.batch.item.data.JpaPagingItemReader;
import javax.persistence.EntityManagerFactory;
import org.springframework.data.domain.PageRequest;
@Bean
public JpaPagingItemReader<Employee> reader(EntityManagerFactory entityManagerFactory) {
JpaPagingItemReader<Employee> reader = new JpaPagingItemReader<>();
reader.setQueryString("SELECT e FROM Employee e");
reader.setEntityManagerFactory(entityManagerFactory);
reader.setPageSize(100); // 100 রেকর্ড প্রতি পেজে
return reader;
}
setQueryString()
পদ্ধতির মাধ্যমে একটি JPQL কুয়েরি ব্যবহার করা হয় ডাটা রিড করার জন্য, এবং setPageSize()
পদ্ধতির মাধ্যমে প্রতিটি পেজের আকার নির্ধারণ করা হয়।এই পাঠকটি বড় ডাটাবেসের ডাটা পেজ বাই পেজ রিড করতে ব্যবহৃত হয়, যা ব্যাচ প্রসেসিং এর জন্য উপযুক্ত। এটি ডাটাবেসের লোড কমাতে সহায়ক।
স্প্রিং ব্যাচে ডাটা রিড করার জন্য FlatFileItemReader, JdbcCursorItemReader, এবং JpaPagingItemReader তিনটি গুরুত্বপূর্ণ ItemReader রয়েছে, যা বিভিন্ন সোর্স থেকে ডাটা রিড করতে ব্যবহৃত হয়:
এই ItemReader গুলির মাধ্যমে স্প্রিং ব্যাচে বিভিন্ন ডাটা সোর্স থেকে ডাটা রিডিং করা সম্ভব, এবং প্রতিটি সোর্সের জন্য উপযুক্ত পাঠক নির্বাচন করে পারফরম্যান্স এবং মেমরি ব্যবহারের দিক থেকে কার্যকরী ব্যাচ প্রসেসিং বাস্তবায়ন করা যায়।
স্প্রিং ব্যাচ (Spring Batch) একটি শক্তিশালী ফ্রেমওয়ার্ক যা ব্যাচ প্রসেসিংয়ের জন্য ব্যবহৃত হয়। এর মাধ্যমে আপনি বৃহৎ পরিমাণ ডেটা প্রক্রিয়া করতে পারেন। ব্যাচ প্রসেসিংয়ের একটি গুরুত্বপূর্ণ অংশ হল ItemReader। ItemReader
হলো একটি অবজেক্ট যা ইনপুট ডেটা থেকে একটি বা একাধিক আইটেম পড়তে ব্যবহৃত হয়। স্প্রিং ব্যাচে Custom ItemReader তৈরি করার মাধ্যমে আপনি আপনার বিশেষ প্রয়োজন অনুযায়ী ডেটা রিডার কাস্টমাইজ করতে পারেন। যেমন, আপনি একটি ফাইল, ডেটাবেস, অথবা অন্য কোনো ডেটা সোর্স থেকে ডেটা পড়তে পারেন।
এই টিউটোরিয়ালে আমরা দেখব কীভাবে Custom ItemReader তৈরি করা যায় এবং তা ব্যাচ প্রসেসিংয়ের অংশ হিসেবে ব্যবহার করা যায়।
ItemReader
একটি ইন্টারফেস যা সাধারণত স্প্রিং ব্যাচে ব্যবহৃত হয়, যার মাধ্যমে ডেটা একটি সোর্স থেকে পড়া হয়। ItemReader
এর প্রধান কাজ হলো ইনপুট সোর্স (যেমন ফাইল, ডেটাবেস, বা অন্য কোনো ডেটা সোর্স) থেকে একটি আইটেম (বা একাধিক আইটেম) রিড করা। এর দুটি প্রধান মেথড রয়েছে:
null
রিটার্ন করে।স্প্রিং ব্যাচে Custom ItemReader তৈরি করতে হলে, আপনাকে 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
রিটার্ন করবে যা ব্যাচ প্রসেসিংয়ের জন্য একটি ইন্ডিকেটর।
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 ফাইল) কলাম হিসেবে ব্যবহার হবে।
এখন, আপনি স্প্রিং ব্যাচের 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 তৈরি করতে পারেন।
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;
}
}
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
ইন্টারফেস ইমপ্লিমেন্ট করে এবং স্প্রিং ব্যাচের বিভিন্ন স্টেপে তা ব্যবহার করে আপনি সহজেই ব্যাচ প্রসেসিংয়ের এক্সিকিউশন নিয়ন্ত্রণ করতে পারেন।
স্প্রিং ব্যাচ (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
কনফিগারেশন - FlatFileItemReaderUser
Data Model তৈরি করাআমরা একটি User
ডেটা মডেল তৈরি করব, যেটি CSV ফাইল থেকে পড়া হবে।
public class User {
private String name;
private String email;
private int age;
// Getters and Setters
}
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
অবজেক্টে ম্যাপ করে।উপরে দেওয়া 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
কনফিগার করব যা কনসোলে ডেটা লেখবে।
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;
}
}
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 কনফিগার করব, যা 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