Spring Batch ItemReader

Java Technologies - স্প্রিং ব্যাচ (Spring Batch)
108
108

Spring Batch ফ্রেমওয়ার্কে, ItemReader হল একটি ইন্টারফেস যা ডেটা রিড করার জন্য ব্যবহৃত হয়। এটি একটি গুরুত্বপূর্ণ উপাদান কারণ এটি ব্যাচ প্রসেসিংয়ের প্রথম ধাপ, যেখানে ডেটা কোন উৎস (যেমন ডেটাবেস, ফাইল, কিউ, ইত্যাদি) থেকে রিড করা হয়। ItemReader-এর মাধ্যমে Spring Batch ডেটাকে রিড করে এবং পরবর্তী ItemProcessor বা ItemWriter এর জন্য প্রস্তুত করে।

ItemReader কী?

ItemReader একটি ইন্টারফেস যা ডেটা উৎস থেকে এক এক করে ডেটা নিয়ে আসে। এটি স্প্রিং ব্যাচের Chunk-Oriented Processing পদ্ধতির সাথে কাজ করে, যেখানে একবারে একাধিক ডেটা আইটেম (items) রিড এবং প্রক্রিয়া করা হয়। প্রতিটি রিড আইটেম পরবর্তী স্টেপে পাঠানো হয়, যেগুলি প্রসেসিং বা রাইটিংয়ের জন্য প্রস্তুত থাকে।

ItemReader সাধারণত read() মেথড ইমপ্লিমেন্ট করে, যা একটি একক ডেটা আইটেম রিটার্ন করে।


Spring Batch ItemReader এর প্রধান ধরণ

Spring Batch বেশ কিছু ভিন্ন ধরনের ItemReader প্রদান করে, যেগুলির মাধ্যমে বিভিন্ন উৎস থেকে ডেটা রিড করা যেতে পারে। যেমন:

  1. FlatFileItemReader: ফাইল থেকে ডেটা রিড করার জন্য ব্যবহৃত হয় (যেমন CSV, TSV)।
  2. JdbcCursorItemReader: ডেটাবেস থেকে ডেটা রিড করার জন্য ব্যবহৃত হয়।
  3. JpaPagingItemReader: JPA ব্যবহার করে ডেটাবেস থেকে পেজ-পেজ করে ডেটা রিড করার জন্য ব্যবহৃত হয়।
  4. StaxEventItemReader: XML ফাইল থেকে ডেটা রিড করার জন্য ব্যবহৃত হয়।

FlatFileItemReader উদাহরণ

ধরা যাক, আমাদের একটি CSV ফাইল আছে যেটি থেকে ডেটা রিড করতে হবে। এখানে FlatFileItemReader ব্যবহার করে কিভাবে CSV ফাইল থেকে ডেটা রিড করা যায় তা দেখানো হচ্ছে।

1. CSV ফাইল কনফিগারেশন

ফাইলের মধ্যে ডেটা থাকতে পারে যেমন:

firstName,lastName
John,Doe
Jane,Doe

2. ItemReader কনফিগারেশন

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();
}

এখানে:

  • FlatFileItemReader: এটি CSV ফাইল বা টেক্সট ফাইল থেকে ডেটা রিড করতে ব্যবহৃত হয়।
  • ClassPathResource: এটি ফাইল রিসোর্স লোড করার জন্য ব্যবহৃত হয়।
  • Delimited(): এটি ডেটাকে ডেলিমিটারের মাধ্যমে ভেঙে ফেলে (যেমন কমা বা স্পেস)।
  • names(): ফাইলের কলামের নামগুলি নির্ধারণ করা হয় যেগুলি ক্লাসের ফিল্ডের সাথে ম্যাপ হবে।
  • targetType(): ডেটা যেখানে ম্যাপ হবে, তা নির্ধারণ করা হয়। এখানে User ক্লাসে ডেটা ম্যাপ হবে।

3. User ক্লাস

public class User {
    private String firstName;
    private String lastName;

    // Getters and Setters
}

এখানে, CSV ফাইলের firstName এবং lastName কলামগুলো User অবজেক্টের ফিল্ডের সাথে ম্যাপ হয়ে যাবে।


JdbcCursorItemReader উদাহরণ

JdbcCursorItemReader ডেটাবেস থেকে ডেটা রিড করার জন্য ব্যবহৃত হয়। এটি একটি JDBC cursor ব্যবহার করে ডেটাবেজ থেকে ডেটা একে একে রিড করে।

1. JDBC কনফিগারেশন

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;
}

2. RowMapper কনফিগারেশন

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;
    }
}

এখানে:

  • JdbcCursorItemReader: ডেটাবেস থেকে ডেটা রিড করার জন্য ব্যবহৃত হয়।
  • RowMapper: এটি একটি Row কে ডেটা মডেলে (এখানে User ক্লাস) রূপান্তরিত করে।

Spring Batch ItemReader কনফিগারেশন টিপস

  1. Error Handling: ItemReader এর মাধ্যমে রিড করা ডেটা কখনও null বা ভুল হতে পারে, সেক্ষেত্রে প্রপার ত্রুটি হ্যান্ডলিং প্রয়োজন। আপনি skip policy ব্যবহার করে ভুল ডেটা স্কিপ করতে পারেন।

    উদাহরণ:

    reader.setSkippedLinesCallback((line) -> {
        // Handle skipped lines
    });
    
  2. Chunk Size: ব্যাচ প্রসেসিংয়ের জন্য সাধারণত chunk-based processing ব্যবহৃত হয়, যেখানে একাধিক আইটেম একে একে রিড, প্রসেস এবং রাইট করা হয়। একটি বড় ব্যাচের ডেটা রিড করার সময় চাঙ্ক সাইজ সঠিকভাবে নির্বাচন করা উচিত।
  3. Resource Management: ItemReader ফাইল বা ডেটাবেসের সাথে কাজ করলে রিসোর্স ম্যানেজমেন্টের বিষয়টি গুরুত্বপূর্ণ। Spring Batch স্বয়ংক্রিয়ভাবে রিসোর্স ম্যানেজমেন্ট এবং ক্লোজিংয়ের ব্যবস্থা করে, তবে কিছু ক্ষেত্রে নিজে থেকে রিসোর্স ক্লোজ করার ব্যবস্থা করতে হতে পারে।
  4. Paging: বড় পরিমাণ ডেটা রিড করার সময় JdbcPagingItemReader ব্যবহার করা যেতে পারে যা ডেটাকে পেজ-বাই-পেজ রিড করে।

সারসংক্ষেপ

Spring Batch ItemReader ফ্রেমওয়ার্কের একটি গুরুত্বপূর্ণ উপাদান, যা বিভিন্ন উৎস (ফাইল, ডেটাবেস, কিউ ইত্যাদি) থেকে ডেটা রিড করার জন্য ব্যবহৃত হয়। Spring Batch বিভিন্ন ধরনের ItemReader প্রদান করে, যেমন FlatFileItemReader, JdbcCursorItemReader, JpaPagingItemReader ইত্যাদি, যেগুলি বিভিন্ন উৎস থেকে ডেটা রিড করতে সক্ষম। ItemReader এর মাধ্যমে আপনি বড় পরিমাণ ডেটা স্কেলেবলি এবং কার্যকরভাবে রিড করতে পারেন, এবং পরবর্তী ItemProcessor বা ItemWriter এর জন্য প্রক্রিয়াজাত ডেটা প্রস্তুত করতে পারেন।

Content added By

ItemReader কি এবং এর প্রয়োজনীয়তা

73
73

ItemReader হল Spring Batch এর একটি গুরুত্বপূর্ণ উপাদান, যা একটি Step এর মধ্যে ডেটা রিডিং (পড়া) কাজ করে। এটি মূলত একটি কাস্টম অবজেক্ট যা ডেটা সোর্স থেকে ডেটা পড়তে ব্যবহৃত হয়। Spring Batch এর মধ্যে, ItemReader ব্যবহার করা হয় ডেটা এক্সট্র্যাকশন (Extract) করার জন্য, যেমন ডেটাবেস, ফাইল, ওয়েব সার্ভিস, বা অন্য কোনো সোর্স থেকে ডেটা রিড করা।

ItemReader এমন একটি কনট্রাক্ট ইন্টারফেস, যার মাধ্যমে আপনি ডেটা সোর্স (যেমন ফাইল, ডেটাবেস, এক্সটার্নাল API ইত্যাদি) থেকে ডেটা পড়তে পারবেন। সাধারণত, ItemReader কাস্টম ইমপ্লিমেন্টেশন সরবরাহ করতে পারে যা বিভিন্ন ফরম্যাটে বা সোর্স থেকে ডেটা প্রক্রিয়া করে।


Spring Batch এ ItemReader এর প্রকারভেদ

Spring Batch এ বেশ কিছু ডিফল্ট ItemReader ইমপ্লিমেন্টেশন রয়েছে, তবে আপনি চাইলে কাস্টম ItemReader ইমপ্লিমেন্টেশনও তৈরি করতে পারেন। কিছু প্রচলিত ItemReader প্রকার হলো:

  1. FlatFileItemReader:
    • এটি ফাইল থেকে ডেটা রিড করার জন্য ব্যবহৃত হয়। বিশেষত CSV, TSV, বা অন্যান্য সোজা ফাইল ফরম্যাট থেকে ডেটা পড়ার জন্য এটি ব্যবহৃত হয়।
  2. JdbcCursorItemReader:
    • এটি ডেটাবেস থেকে ডেটা রিড করার জন্য ব্যবহৃত হয়। SQL কোয়েরি চালিয়ে ডেটাবেস থেকে রেকর্ড রিটার্ন করতে এটি ব্যবহৃত হয়।
  3. JpaPagingItemReader:
    • এটি JPA ব্যবহার করে ডেটাবেস থেকে পেজ-বাই-পেজ ডেটা রিড করতে ব্যবহৃত হয়।
  4. Custom ItemReader:
    • প্রয়োজনে আপনি নিজের কাস্টম ItemReader তৈরি করতে পারেন, যা বিশেষ ডেটা সোর্স বা ফরম্যাট থেকে ডেটা পড়ে।

ItemReader এর প্রয়োজনীয়তা

ItemReader এর প্রয়োজনীয়তা নানা কারণে গুরুত্বপূর্ণ, বিশেষত Spring Batch এর মতো ব্যাচ প্রসেসিং ফ্রেমওয়ার্কে। এখানে তার প্রধান কিছু কারণ তুলে ধরা হলো:

১. ডেটা এক্সট্র্যাকশন বা রিডিং এর জন্য স্ট্যান্ডার্ড ইন্টারফেস

ItemReader Spring Batch-এ ডেটা সোর্স থেকে ডেটা পড়ার জন্য একটি স্ট্যান্ডার্ড ইন্টারফেস সরবরাহ করে। এটি ডেটার রিডিং প্রক্রিয়াকে সরল এবং সুবিধাজনক করে তোলে।

২. ডেটার সোর্স বা ফরম্যাটের নিরপেক্ষতা

ItemReader ব্যবহার করে, আপনি যে কোনো ধরনের ডেটা সোর্স বা ফরম্যাট থেকে ডেটা পড়তে পারেন। এটি একটি শক্তিশালী এবং ফ্লেক্সিবল মেকানিজম যা কোনো নির্দিষ্ট ডেটা সোর্সের উপর নির্ভর করে না। উদাহরণস্বরূপ, আপনি যদি CSV ফাইল থেকে ডেটা পড়েন, তাহলে FlatFileItemReader ব্যবহার করবেন, আর যদি ডেটাবেস থেকে ডেটা পড়েন, তাহলে JdbcCursorItemReader ব্যবহার করবেন।

৩. পারফরম্যান্স অপ্টিমাইজেশন

ItemReader একবারে একাধিক রেকর্ড পড়তে পারে এবং তারপরে ডেটা রাইট করার জন্য একটি chunk-এ প্রক্রিয়া করতে সহায়তা করে (Chunk-Oriented Processing)। এটি একটি ভাল পারফরম্যান্স প্রদান করে, বিশেষত বড় ডেটাসেটের জন্য।

৪. এফিসিয়েন্ট মেমোরি ম্যানেজমেন্ট

ItemReader শুধুমাত্র প্রয়োজনীয় ডেটা রিড করে এবং একে একে প্রক্রিয়া করে, ফলে মেমোরির ব্যবহার অপ্টিমাইজ হয়। এটি chunk-oriented প্রসেসিং ধারণা অনুসরণ করে, যেখানে রিড করা ডেটা কিছু পরিমাণে chunk করে প্রসেস করা হয় এবং মেমরি ব্যবহারের ওপর চাপ কমানো হয়।

৫. ব্যাচ প্রসেসিংয়ের একীভূততা (Consistency) নিশ্চিত করা

ItemReader ডেটার মধ্যে consistency বজায় রাখার জন্য ব্যবহৃত হয়। আপনি যদি large-scale batch processing করে থাকেন, তখন ডেটার integrity নিশ্চিত করার জন্য ItemReader-এর প্রক্রিয়া অত্যন্ত গুরুত্বপূর্ণ। এটি ডেটা সোর্সের থেকে ডেটা সঠিকভাবে এবং নির্ভরযোগ্যভাবে পড়ে এবং প্রসেসিংয়ের জন্য প্রস্তুত করে।


Spring Batch এ ItemReader এর উদাহরণ

১. FlatFileItemReader ব্যবহার করে CSV ফাইল থেকে ডেটা রিড

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 অবজেক্টে ম্যাপ করা হচ্ছে।

২. JdbcCursorItemReader ব্যবহার করে ডেটাবেস থেকে ডেটা রিড

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 বজায় রাখে এবং বড় ডেটা সেটের ক্ষেত্রে খুবই কার্যকরী।

Content added By

FlatFileItemReader, JdbcCursorItemReader, এবং JpaPagingItemReader এর ব্যবহার

93
93

স্প্রিং ব্যাচ (Spring Batch) একটি শক্তিশালী ফ্রেমওয়ার্ক যা ব্যাচ প্রসেসিংয়ের জন্য ব্যবহৃত হয়, এবং এটি বিভিন্ন ধরনের ItemReader সরবরাহ করে ডাটা রিড করার জন্য। এই ItemReader গুলি বিভিন্ন ধরনের ডাটা সোর্স থেকে ডাটা পড়তে সহায়তা করে, যেমন ফাইল, ডাটাবেস, বা JPA (Java Persistence API) এর মাধ্যমে।

আজ আমরা আলোচনা করব FlatFileItemReader, JdbcCursorItemReader, এবং JpaPagingItemReader এর ব্যবহারের উপর।


FlatFileItemReader

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;
}

ব্যাখ্যা:

  • FlatFileItemReader একটি টেক্সট ফাইল (এখানে employee.csv) থেকে ডাটা রিড করতে ব্যবহৃত হচ্ছে।
  • DelimitedLineTokenizer টোকেনাইজারের মাধ্যমে ফাইলের প্রতিটি লাইনকে আলাদা করে, এবং তারপর BeanWrapperFieldSetMapper ব্যবহার করে সেই ডাটা Employee ক্লাসের অবজেক্টে ম্যাপ করা হয়।

এটি সিপিএফ (CSV ফাইল) বা যে কোনও ডেলিমিটারযুক্ত ফাইল থেকে ডাটা রিড করার জন্য ব্যবহৃত হয়।


JdbcCursorItemReader

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;
}

ব্যাখ্যা:

  • JdbcCursorItemReader একটি SQL কুয়েরি (SELECT) দিয়ে ডাটাবেস থেকে ডাটা রিড করে।
  • setRowMapper() মেথডের মাধ্যমে প্রতিটি রেকর্ডকে EmployeeRowMapper ক্লাসে ম্যাপ করা হয়। এই ক্লাসটি RowMapper ইন্টারফেস ইমপ্লিমেন্ট করে, যা SQL রেজাল্ট সেট থেকে রেকর্ড ম্যাপ করার কাজ করে।

এই পাঠকটি ডাটাবেসের মধ্যে বড় পরিমাণ ডাটা রিড করার জন্য আদর্শ, কারণ এটি লেজি লোডিং ব্যবহার করে এবং মেমরি ব্যবহার কম রাখে।


JpaPagingItemReader

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;
}

ব্যাখ্যা:

  • JpaPagingItemReader JPA এর মাধ্যমে ডাটাবেস থেকে পেজ বাই পেজ ডাটা রিড করে।
  • setQueryString() পদ্ধতির মাধ্যমে একটি JPQL কুয়েরি ব্যবহার করা হয় ডাটা রিড করার জন্য, এবং setPageSize() পদ্ধতির মাধ্যমে প্রতিটি পেজের আকার নির্ধারণ করা হয়।

এই পাঠকটি বড় ডাটাবেসের ডাটা পেজ বাই পেজ রিড করতে ব্যবহৃত হয়, যা ব্যাচ প্রসেসিং এর জন্য উপযুক্ত। এটি ডাটাবেসের লোড কমাতে সহায়ক।


সারাংশ

স্প্রিং ব্যাচে ডাটা রিড করার জন্য FlatFileItemReader, JdbcCursorItemReader, এবং JpaPagingItemReader তিনটি গুরুত্বপূর্ণ ItemReader রয়েছে, যা বিভিন্ন সোর্স থেকে ডাটা রিড করতে ব্যবহৃত হয়:

  • FlatFileItemReader টেক্সট বা CSV ফাইল থেকে ডাটা রিড করতে ব্যবহৃত হয়।
  • JdbcCursorItemReader ডাটাবেস থেকে রেকর্ড একে একে রিড করার জন্য ব্যবহৃত হয়, এটি মেমরি ব্যবহারের জন্য কার্যকরী।
  • JpaPagingItemReader JPA ব্যবহার করে ডাটাবেস থেকে পেজ বাই পেজ ডাটা রিড করতে ব্যবহৃত হয়, যা বড় পরিমাণ ডাটার ক্ষেত্রে কার্যকর।

এই ItemReader গুলির মাধ্যমে স্প্রিং ব্যাচে বিভিন্ন ডাটা সোর্স থেকে ডাটা রিডিং করা সম্ভব, এবং প্রতিটি সোর্সের জন্য উপযুক্ত পাঠক নির্বাচন করে পারফরম্যান্স এবং মেমরি ব্যবহারের দিক থেকে কার্যকরী ব্যাচ প্রসেসিং বাস্তবায়ন করা যায়।


Content added By

Custom ItemReader তৈরি করা

98
98

স্প্রিং ব্যাচ (Spring Batch) একটি শক্তিশালী ফ্রেমওয়ার্ক যা ব্যাচ প্রসেসিংয়ের জন্য ব্যবহৃত হয়। এর মাধ্যমে আপনি বৃহৎ পরিমাণ ডেটা প্রক্রিয়া করতে পারেন। ব্যাচ প্রসেসিংয়ের একটি গুরুত্বপূর্ণ অংশ হল ItemReaderItemReader হলো একটি অবজেক্ট যা ইনপুট ডেটা থেকে একটি বা একাধিক আইটেম পড়তে ব্যবহৃত হয়। স্প্রিং ব্যাচে Custom ItemReader তৈরি করার মাধ্যমে আপনি আপনার বিশেষ প্রয়োজন অনুযায়ী ডেটা রিডার কাস্টমাইজ করতে পারেন। যেমন, আপনি একটি ফাইল, ডেটাবেস, অথবা অন্য কোনো ডেটা সোর্স থেকে ডেটা পড়তে পারেন।

এই টিউটোরিয়ালে আমরা দেখব কীভাবে Custom ItemReader তৈরি করা যায় এবং তা ব্যাচ প্রসেসিংয়ের অংশ হিসেবে ব্যবহার করা যায়।

ItemReader এর ভূমিকা

ItemReader একটি ইন্টারফেস যা সাধারণত স্প্রিং ব্যাচে ব্যবহৃত হয়, যার মাধ্যমে ডেটা একটি সোর্স থেকে পড়া হয়। ItemReader এর প্রধান কাজ হলো ইনপুট সোর্স (যেমন ফাইল, ডেটাবেস, বা অন্য কোনো ডেটা সোর্স) থেকে একটি আইটেম (বা একাধিক আইটেম) রিড করা। এর দুটি প্রধান মেথড রয়েছে:

  1. read(): এটি একটি আইটেম পড়ে এবং তা রিটার্ন করে। যদি আর কোনো আইটেম না থাকে তবে এটি null রিটার্ন করে।
  2. 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 কে ব্যবহার করা হয়েছে, যা একটি কাস্টম ItemReaderchunk(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 ইন্টারফেস ইমপ্লিমেন্ট করে এবং স্প্রিং ব্যাচের বিভিন্ন স্টেপে তা ব্যবহার করে আপনি সহজেই ব্যাচ প্রসেসিংয়ের এক্সিকিউশন নিয়ন্ত্রণ করতে পারেন।

Content added By

উদাহরণ সহ ItemReader Configuration

69
69

স্প্রিং ব্যাচ (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 ব্যবহার করে ডেটা প্রক্রিয়া এবং লেখা হয়েছে। স্প্রিং ব্যাচের এই কনফিগারেশনগুলো সহজেই বৃহৎ পরিমাণ ডেটা প্রসেস করতে সহায়তা করে এবং ব্যাচ প্রসেসিংকে স্কেলেবল এবং কার্যকরী করে তোলে।

Content added By
Promotion