Spring Batch ItemWriter

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

267

Spring Batch একটি পাওয়ারফুল ফ্রেমওয়ার্ক যা ব্যাচ প্রসেসিং (batch processing) কাজগুলি সহজে পরিচালনা করতে সহায়তা করে। একটি ItemWriter Spring Batch এ ব্যবহৃত হয় যখন একটি নির্দিষ্ট পরিমাণ ডেটা (একটি "chunk") প্রসেস করার পর সেগুলিকে কোথাও লেখা (write) হয়, যেমন ডেটাবেস, ফাইল বা অন্য কোনো স্টোরেজে।

ItemWriter ডেটার প্রসেসিং শেষে সেই ডেটা কোথাও লিখে দেয়। এটি ব্যাচ স্টেপের শেষ অংশ হিসেবে কাজ করে এবং ItemReader এবং ItemProcessor এর মাধ্যমে প্রাপ্ত ডেটা লেখার কাজটি সম্পাদন করে।

Spring Batch এ ItemWriter ব্যবহার করে ডেটা লেখার অনেক পদ্ধতি রয়েছে, যেমন:

  • Database (JDBC)
  • Flat Files (CSV, TSV, etc.)
  • Custom Output (e.g., JSON)

এখানে ItemWriter এর উদাহরণ দেওয়া হবে যা ডেটা কনসোলে লেখার কাজ করবে।


1. ItemWriter কি?

ItemWriter একটি Spring Batch ইন্টারফেস, যা write(List<? extends T> items) মেথডটি প্রয়োগ করে। এটি একটি বা একাধিক আইটেম (যেমন, items তালিকা) গ্রহণ করে এবং সেগুলিকে ডেটা স্টোরে লেখে। এটি ব্যাচ প্রসেসের অংশ হিসেবে শেষের দিকে কাজ করে।


2. ItemWriter ইন্টারফেসের কাস্টম ইমপ্লিমেন্টেশন

Spring Batch এর মাধ্যমে একটি কাস্টম ItemWriter তৈরি করার জন্য, আপনি ItemWriter ইন্টারফেস ইমপ্লিমেন্ট করে write() মেথডটি কাস্টমাইজ করবেন।

2.1 ItemWriter উদাহরণ: কনসোলে ডেটা লেখা

এখানে একটি সহজ ItemWriter উদাহরণ দেওয়া হয়েছে যা User অবজেক্টকে কনসোলে লিখবে।

2.1.1 User Model ক্লাস

package com.example.batch.model;

public class User {
    private String name;
    private String email;

    // Constructor
    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }

    // Getters and Setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{name='" + name + "', email='" + email + "'}";
    }
}

এখানে, User একটি মডেল ক্লাস যেখানে name এবং email প্রপার্টি রয়েছে।

2.1.2 ItemWriter ইমপ্লিমেন্টেশন

package com.example.batch.writer;

import com.example.batch.model.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);
        }
    }
}

এখানে, UserItemWriter ক্লাসটি ItemWriter<User> ইন্টারফেস ইমপ্লিমেন্ট করেছে এবং write() মেথডটি কনসোলে ইউজার অবজেক্ট প্রিন্ট করছে।


3. Step Configuration with ItemWriter

Spring Batch এ ItemWriter ব্যবহার করতে হলে, এটি একটি Step এর মধ্যে কনফিগার করতে হয়। একবার আপনি ItemReader, ItemProcessor, এবং ItemWriter সেটআপ করে ফেললে, আপনি Step কনফিগার করতে পারবেন।

3.1 Step Configuration

package com.example.batch.config;

import com.example.batch.model.User;
import com.example.batch.processor.UserItemProcessor;
import com.example.batch.reader.UserItemReader;
import com.example.batch.writer.UserItemWriter;
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.batch.core.launch.support.RunIdIncrementer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableBatchProcessing
public class BatchConfig {

    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    public BatchConfig(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) {
        this.jobBuilderFactory = jobBuilderFactory;
        this.stepBuilderFactory = stepBuilderFactory;
    }

    @Bean
    public Job userJob() {
        return jobBuilderFactory.get("userJob")
                .incrementer(new RunIdIncrementer())
                .start(userStep())
                .build();
    }

    @Bean
    public Step userStep() {
        return stepBuilderFactory.get("userStep")
                .<User, User>chunk(10)  // Process 10 items at a time
                .reader(userItemReader())
                .processor(userItemProcessor())
                .writer(userItemWriter())
                .build();
    }

    @Bean
    public UserItemReader userItemReader() {
        return new UserItemReader();
    }

    @Bean
    public UserItemProcessor userItemProcessor() {
        return new UserItemProcessor();
    }

    @Bean
    public UserItemWriter userItemWriter() {
        return new UserItemWriter();
    }
}

এখানে:

  • chunk(10): প্রতি 10টি আইটেম একসাথে প্রোসেস করা হবে।
  • ItemReader, ItemProcessor, এবং ItemWriter গুলি userStep এ সংযুক্ত করা হয়েছে।

4. ItemReader এবং ItemProcessor উদাহরণ

এখন, ItemReader এবং ItemProcessor কনফিগার করা হবে যা ItemWriter এর সঙ্গে কাজ করবে।

4.1 ItemReader কনফিগারেশন

package com.example.batch.reader;

import com.example.batch.model.User;
import org.springframework.batch.item.ItemReader;

import java.util.Arrays;
import java.util.List;

public class UserItemReader implements ItemReader<User> {

    private final List<User> users = Arrays.asList(
            new User("John", "john@example.com"),
            new User("Jane", "jane@example.com"),
            new User("Bob", "bob@example.com")
    );

    private int index = 0;

    @Override
    public User read() throws Exception {
        if (index < users.size()) {
            return users.get(index++);
        }
        return null;  // Return null when all items are read
    }
}

এখানে UserItemReader ক্লাস একটি লিস্ট থেকে User অবজেক্ট রিড করে।

4.2 ItemProcessor কনফিগারেশন

package com.example.batch.processor;

import com.example.batch.model.User;
import org.springframework.batch.item.ItemProcessor;

public class UserItemProcessor implements ItemProcessor<User, User> {

    @Override
    public User process(User item) throws Exception {
        item.setName(item.getName().toUpperCase());  // Convert name to uppercase
        return item;
    }
}

এখানে UserItemProcessor প্রতিটি User অবজেক্টের নাম uppercase তে রূপান্তরিত করছে।


5. Batch Job চালানো

Spring Batch অ্যাপ্লিকেশন চালাতে, BatchConfig কনফিগারেশন ক্লাসে JobLauncher ব্যবহার করে জব রান করতে হবে।

package com.example.batch;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.core.JobExecutionException;
import org.springframework.batch.core.JobExecution;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class BatchApplication {

    public static void main(String[] args) throws JobExecutionException {
        ApplicationContext context = new AnnotationConfigApplicationContext(BatchConfig.class);
        JobLauncher jobLauncher = context.getBean(JobLauncher.class);
        Job job = context.getBean("userJob", Job.class);
        JobExecution execution = jobLauncher.run(job, new JobParameters());
        System.out.println("Job Status : " + execution.getStatus());
    }
}

এখানে, JobLauncher ব্যবহার করে userJob রান করা হয়েছে। এক্সিকিউশনের স্ট্যাটাস কনসোলে প্রদর্শিত হবে।


সারাংশ

Spring Batch এ ItemWriter ডেটা লেখার জন্য ব্যবহৃত হয়। ItemWriter এর মাধ্যমে আপনি ডেটা ডাটাবেস, ফাইল, বা কনসোলে লেখার কাজ করতে পারেন। এখানে, একটি কাস্টম ItemWriter তৈরি করা হয়েছে যা User অবজেক্ট কনসোলে প্রিন্ট করে। Spring Batch তে ItemReader, ItemProcessor, এবং ItemWriter এর মধ্যে সমন্বয়ের মাধ্যমে ডেটা প্রসেস করা হয়। Chunk Processing এর মাধ্যমে আইটেমগুলো ব্যাচে গ্রুপ হয়ে প্রসেস করা হয়। Spring Batch আপনাকে স্কেলেবল এবং কার্যকর ব্যাচ প্রসেসিং করতে সহায়তা করে।

Content added By

ItemWriter কি?

স্প্রিং ব্যাচে ItemWriter একটি গুরুত্বপূর্ণ উপাদান যা প্রসেস করা ডেটাকে আউটপুটে লিখে। এটি মূলত একটি ইন্টারফেস, এবং এর কাজ হলো যে ডেটা আইটেমগুলো ItemProcessor থেকে প্রক্রিয়াজাত হয়ে এসেছে, সেগুলোকে কোনো নির্দিষ্ট আউটপুট টার্গেটে যেমন ডেটাবেস, ফাইল, কিংবা অন্য কোনো ডেটা স্টোরেজ সিস্টেমে লিখে দেওয়া। ItemWriter এর মাধ্যমে ব্যাচ প্রসেসিংয়ের ফলাফল আউটপুট হিসেবে সংরক্ষণ করা হয়।

স্প্রিং ব্যাচে, ডেটা একটি নির্দিষ্ট আকারের "chunk" হিসেবে প্রক্রিয়া করা হয়, এবং যখন একটি chunk সম্পূর্ণ হয়ে যায়, তখন ItemWriter ওই chunk এর সমস্ত আইটেম একসাথে লিখে ফেলে।


ItemWriter এর ভূমিকা

স্প্রিং ব্যাচের প্রসেসিং চক্রের মধ্যে ItemWriter এর ভূমিকা অত্যন্ত গুরুত্বপূর্ণ। এটি মূলত এই কাজগুলো করে:

  1. প্রক্রিয়াজাত ডেটা আউটপুটে লেখা: ItemWriter হল সেই কম্পোনেন্ট যা ItemProcessor থেকে প্রক্রিয়াজাত ডেটা নেয় এবং সেগুলোকে নির্দিষ্ট আউটপুট টার্গেটে লেখে।
  2. ব্যাচের আউটপুট প্রদান করা: একটি ব্যাচ প্রসেসিং সিস্টেমে অনেকগুলি আইটেম একসাথে প্রসেস করা হয় এবং ItemWriter সমস্ত আইটেম একত্রে আউটপুটে লেখার কাজ করে, যা ফাইল বা ডেটাবেস হতে পারে।
  3. ডেটা ইন্টিগ্রিটি নিশ্চিত করা: ItemWriter ডেটাকে সঠিকভাবে এবং নির্ভরযোগ্যভাবে সংরক্ষণ করে। এটি ডেটার integrity এবং consistency বজায় রাখতে সাহায্য করে।

ItemWriter এর মাধ্যমে আপনি বিভিন্ন আউটপুট ডেটা সোর্সে যেমন:

  • ফাইল (CSV, XML, JSON ইত্যাদি)
  • ডেটাবেস
  • কিউ (Queue)
  • মেসেজ ব্রোকার (Message Broker)

এগুলোতে ডেটা লিখতে পারেন।


ItemWriter এর কাজের প্রক্রিয়া

স্প্রিং ব্যাচের একটি typical ব্যাচ প্রসেসিং ফ্লো নিম্নরূপ:

  1. ItemReader: প্রথমে ডেটা পড়ে নেয়া হয়। এটি ডেটা সোর্স থেকে ডেটা রিড করে।
  2. ItemProcessor: তারপর সেই ডেটা প্রক্রিয়াজাত করা হয়। এটি ডেটাকে পরিবর্তন বা প্রসেস করে।
  3. ItemWriter: অবশেষে, প্রক্রিয়াজাত ডেটা ItemWriter এর মাধ্যমে আউটপুটে লিখে দেওয়া হয়।

ItemWriter সাধারনত write() মেথডের মাধ্যমে কাজ করে, যেখানে List<T> আর্গুমেন্ট হিসেবে ডেটার একটি chunk নেয় এবং সেটি আউটপুটে লিখে দেয়।

public interface ItemWriter<T> {
    void write(List<? extends T> items) throws Exception;
}

এখানে T হচ্ছে ডেটার টাইপ যা ItemProcessor দ্বারা প্রক্রিয়াজাত হয়েছে এবং write() মেথডে একটি List হিসেবে পাঠানো হচ্ছে।


ItemWriter এর উদাহরণ

ধরা যাক, আপনার একটি ব্যাচ অ্যাপ্লিকেশন রয়েছে যা একটি CSV ফাইলে ডেটা লিখবে। এখানে একটি কাস্টম ItemWriter তৈরি করা হয়েছে যা ফাইলের মধ্যে ডেটা লেখে।

১. ItemWriter উদাহরণ (CSV ফাইল লেখার জন্য)

import org.springframework.batch.item.ItemWriter;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

public class CsvItemWriter implements ItemWriter<String> {

    private static final String OUTPUT_FILE = "output.csv";

    @Override
    public void write(List<? extends String> items) throws Exception {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(OUTPUT_FILE, true))) {
            for (String item : items) {
                writer.write(item);
                writer.newLine();  // New line after each item
            }
        } catch (IOException e) {
            throw new Exception("Error writing data to CSV file", e);
        }
    }
}

এখানে:

  • CsvItemWriter ItemWriter ইন্টারফেস ইমপ্লিমেন্ট করেছে।
  • write() মেথডে ডেটার একটি List এসেছে এবং এটি ফাইলে লিখে দেওয়া হচ্ছে।

২. ItemWriter উদাহরণ (ডেটাবেসে লেখার জন্য)

স্প্রিং ব্যাচে ডেটাবেসে ডেটা লিখতে JdbcBatchItemWriter বা কাস্টম ItemWriter ব্যবহার করা যায়।

import org.springframework.batch.item.database.JdbcBatchItemWriter;
import javax.sql.DataSource;

@Bean
public JdbcBatchItemWriter<Employee> writer(DataSource dataSource) {
    JdbcBatchItemWriter<Employee> writer = new JdbcBatchItemWriter<>();
    writer.setDataSource(dataSource);
    writer.setSql("INSERT INTO employees (id, name, department) VALUES (?, ?, ?)");
    writer.setItemPreparedStatementSetter(new EmployeePreparedStatementSetter());
    return writer;
}

এখানে:

  • JdbcBatchItemWriter ডেটাবেসে ব্যাচে ডেটা লেখার জন্য ব্যবহৃত হচ্ছে।
  • setSql() মেথডে SQL স্টেটমেন্ট দেওয়া হয়েছে, যা ডেটাবেসে ডেটা ইনসার্ট করবে।

EmployeePreparedStatementSetter ক্লাসটি SQL প্রশ্নে ডেটা সেট করার জন্য ব্যবহৃত হয়।


ItemWriter এর বিভিন্ন প্রকার

স্প্রিং ব্যাচে বিভিন্ন ধরনের ItemWriter পাওয়া যায়, যেমন:

  1. FlatFileItemWriter: ফাইল আউটপুটে লেখার জন্য ব্যবহৃত হয়, যেমন CSV, TXT ফাইল।
  2. JdbcBatchItemWriter: ডেটাবেসে ব্যাচ আউটপুট লেখার জন্য ব্যবহৃত হয়।
  3. HibernateItemWriter: Hibernate সেশন ব্যবহার করে ডেটাবেসে লেখার জন্য ব্যবহৃত হয়।
  4. Custom ItemWriter: কাস্টম আউটপুট টার্গেটে ডেটা লেখার জন্য নিজস্ব ItemWriter তৈরি করা যায়।

সারাংশ

ItemWriter স্প্রিং ব্যাচে একটি গুরুত্বপূর্ণ উপাদান, যার মাধ্যমে প্রসেস করা ডেটা আউটপুটে লেখা হয়। এটি ব্যাচ প্রসেসিংয়ের শেষ ধাপ, যেখানে সমস্ত প্রক্রিয়াজাত আইটেমকে একটি নির্দিষ্ট আউটপুট টার্গেটে যেমন ফাইল বা ডেটাবেসে লিখে দেওয়া হয়। ItemWriter এর মাধ্যমে ডেটার ইন্টিগ্রিটি এবং সঠিকতা নিশ্চিত করা হয়। এর মধ্যে বেশ কিছু পূর্বনির্ধারিত ইমপ্লিমেন্টেশন যেমন FlatFileItemWriter এবং JdbcBatchItemWriter রয়েছে, কিন্তু প্রয়োজনে কাস্টম ItemWriter তৈরি করাও সম্ভব।

Content added By

Spring Batch একটি শক্তিশালী ফ্রেমওয়ার্ক যা ডেটা প্রসেসিংয়ের জন্য ব্যবহৃত হয়। যখন ব্যাচ প্রসেসিংয়ে ডেটা লেখার কাজ আসে, তখন ItemWriter ব্যবহার করা হয়। Spring Batch এ তিনটি জনপ্রিয় ItemWriter হল: FlatFileItemWriter, JdbcBatchItemWriter, এবং JpaItemWriter। এগুলোর মধ্যে প্রতিটির ব্যবহারের ক্ষেত্র ভিন্ন, এবং এগুলি বিভিন্ন আউটপুট সোর্সে ডেটা লেখার জন্য ব্যবহৃত হয়। চলুন দেখি প্রতিটি ItemWriter এর বিস্তারিত ব্যবহার এবং উদ্দেশ্য।


১. FlatFileItemWriter

FlatFileItemWriter একটি ItemWriter যা ফ্ল্যাট ফাইল (যেমন CSV, TXT) এ ডেটা লেখার জন্য ব্যবহৃত হয়। এটি সাধারণত ডেটা রিড করার পর ফলাফল একটি ফাইলের মধ্যে সংরক্ষণ করার জন্য ব্যবহৃত হয়। এই Writer টি ডেটা লেখার সময় একটি নির্দিষ্ট ফরম্যাটে ডেটা রূপান্তর করে, যেমন CSV ফরম্যাটে ডেটা লেখা।

ব্যবহার

@Bean
public FlatFileItemWriter<User> writer() {
    FlatFileItemWriter<User> writer = new FlatFileItemWriter<>();
    writer.setResource(new FileSystemResource("users.csv"));
    
    // Set the LineAggregator to format the data in a specific way
    writer.setLineAggregator(new DelimitedLineAggregator<User>() {{
        setDelimiter(",");
        setFieldExtractor(new BeanWrapperFieldExtractor<User>() {{
            setNames(new String[] { "id", "name", "email" });
        }});
    }});
    
    return writer;
}
  • Resource: FlatFileItemWriter এ ফাইলের লোকেশন সেট করা হয় যেখানে ডেটা লেখার কাজ হবে।
  • LineAggregator: এটি Item গুলিকে একটি লাইন আকারে রূপান্তর করে। এখানে DelimitedLineAggregator ব্যবহার করা হয়েছে যা কমা দিয়ে বিভিন্ন ফিল্ড আলাদা করে।
  • FieldExtractor: এটি ডেটা থেকে নির্দিষ্ট ফিল্ড বের করার জন্য ব্যবহৃত হয়, যেমন এখানে id, name, এবং email ফিল্ডগুলো নির্বাচন করা হয়েছে।

ব্যবহারের সুবিধা

  • সহজ এবং কার্যকরী ফাইল লেখার জন্য।
  • বিভিন্ন ফরম্যাটে (যেমন CSV) ফাইল তৈরি করতে সহায়তা করে।

২. JdbcBatchItemWriter

JdbcBatchItemWriter একটি ItemWriter যা ডেটা ব্যাচ আকারে ডেটাবেসে ইনসার্ট, আপডেট, বা ডিলিট করার জন্য ব্যবহৃত হয়। এটি একটি SQL স্টেটমেন্ট ব্যবহার করে ডেটাবেসে একাধিক রেকর্ড লেখা বা আপডেট করা যায়। যখন আপনার ব্যাচ প্রসেসিংয়ে ডেটাবেসের সাথে কাজ করতে হয়, তখন এই Writer ব্যবহার করা হয়।

ব্যবহার

@Bean
public JdbcBatchItemWriter<User> writer(DataSource dataSource) {
    JdbcBatchItemWriter<User> writer = new JdbcBatchItemWriter<>();
    writer.setDataSource(dataSource);
    writer.setSql("INSERT INTO users (id, name, email) VALUES (:id, :name, :email)");
    writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
    return writer;
}
  • DataSource: ডেটাবেসের সাথে সংযোগ স্থাপন করতে DataSource ব্যবহার করা হয়।
  • SQL: যে SQL স্টেটমেন্টে ডেটা ইনসার্ট বা আপডেট হবে, সেটি নির্দিষ্ট করা হয়।
  • ItemSqlParameterSourceProvider: এটি ডেটাবেসের জন্য ডেটা ম্যানিপুলেট করার জন্য উপযুক্ত ফিল্ডগুলি ম্যাপ করে।

ব্যবহারের সুবিধা

  • ব্যাচ আকারে ডেটাবেসে ডেটা লেখার জন্য খুবই কার্যকরী।
  • ডেটাবেস অপারেশনের জন্য অপটিমাইজড এবং দ্রুত।
  • ব্যাচ প্রসেসিংয়ের মাধ্যমে একাধিক ডেটাবেস অপারেশন (ইনসার্ট/আপডেট) একই সময়ে সম্পন্ন করা সম্ভব।

৩. JpaItemWriter

JpaItemWriter একটি ItemWriter যা JPA (Java Persistence API) ব্যবহার করে ডেটাবেসে ডেটা লেখার জন্য ব্যবহৃত হয়। এটি সাধারণত JPA এন্টিটির মাধ্যমে ডেটাবেসে ডেটা সেভ করতে ব্যবহৃত হয়। JpaItemWriter ডেটাবেসে একাধিক অবজেক্ট ইনসার্ট, আপডেট বা মর্জ করার জন্য JPA এর EntityManager ব্যবহার করে।

ব্যবহার

@Bean
public JpaItemWriter<User> writer(EntityManagerFactory entityManagerFactory) {
    JpaItemWriter<User> writer = new JpaItemWriter<>();
    writer.setEntityManagerFactory(entityManagerFactory);
    return writer;
}
  • EntityManagerFactory: এটি JPA EntityManager তৈরি করতে ব্যবহৃত হয় যা ডেটাবেসে ডেটা লেখার জন্য প্রয়োজনীয়।
  • JpaItemWriter: এটি JPA Entity এর মাধ্যমে ডেটাবেসে ডেটা লেখার জন্য ব্যবহৃত হয়।

ব্যবহারের সুবিধা

  • JPA Entity ব্যবহারের মাধ্যমে ডেটাবেসের সাথে কাজ করতে সুবিধাজনক।
  • Spring Data JPA এর সাথে ভালভাবে কাজ করে।
  • EntityManager ব্যবহার করে ডেটা লেখা এবং আপডেট করা সহজ।

FlatFileItemWriter, JdbcBatchItemWriter, এবং JpaItemWriter এর মধ্যে পার্থক্য

বিষয়FlatFileItemWriterJdbcBatchItemWriterJpaItemWriter
ব্যবহারফ্ল্যাট ফাইল (যেমন CSV, TXT) এ ডেটা লেখার জন্য।ডেটাবেসে ব্যাচ আকারে ডেটা ইনসার্ট/আপডেট/ডিলিট করার জন্য।JPA এন্টিটি ব্যবহার করে ডেটাবেসে ডেটা লেখার জন্য।
ফাইল ফরম্যাটCSV, TXT, বা অন্যান্য ফ্ল্যাট ফাইল ফরম্যাট।ডেটাবেসে ডেটা লেখা (SQL স্টেটমেন্ট)।ডেটাবেসে JPA এন্টিটি দিয়ে ডেটা লেখা।
ডেটা সংরক্ষণ পদ্ধতিফাইল সিস্টেমে ডেটা লেখা।ডেটাবেসের টেবিলে ডেটা ইনসার্ট করা।JPA এর EntityManager ব্যবহার করে ডেটাবেসে ডেটা সংরক্ষণ।
ব্যাচ প্রসেসিংএকেকটি লাইনে ডেটা লেখার জন্য উপযুক্ত।ডেটাবেসে ব্যাচে একাধিক রেকর্ড প্রসেস করে।JPA এর মাধ্যমে একাধিক রেকর্ড ইনসার্ট বা আপডেট করা।
উপযুক্ততাফাইল ভিত্তিক আউটপুটের জন্য উপযুক্ত।ডেটাবেসের জন্য ব্যাচ প্রসেসিং ও অপটিমাইজড।JPA ব্যবহারকারী ডেটাবেস কাজের জন্য।

সারাংশ

Spring Batch এ FlatFileItemWriter, JdbcBatchItemWriter, এবং JpaItemWriter তিনটি অত্যন্ত গুরুত্বপূর্ণ ItemWriter যা ডেটা লেখা বা প্রসেস করার জন্য ব্যবহৃত হয়। FlatFileItemWriter ফ্ল্যাট ফাইল (যেমন CSV) এ ডেটা লেখার জন্য ব্যবহৃত হয়, JdbcBatchItemWriter ডেটাবেসে ব্যাচ আকারে ডেটা লেখার জন্য এবং JpaItemWriter JPA Entity এর মাধ্যমে ডেটাবেসে ডেটা লেখার জন্য ব্যবহৃত হয়। প্রতিটি ItemWriter বিভিন্ন ধরনের ডেটাবেস বা আউটপুট সোর্সের জন্য উপযুক্ত এবং এটি ব্যাচ প্রসেসিংয়ের কাজ আরও সহজ এবং কার্যকরী করে তোলে।


Content added By

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

এখানে, আমরা Custom ItemWriter তৈরি করার প্রক্রিয়া নিয়ে আলোচনা করব। ItemWriter সাধারণত ItemProcessor এর পরবর্তী ধাপ হিসাবে কাজ করে এবং ডেটা ফাইল, ডেটাবেস বা অন্য কোনও আউটপুট টার্গেটে লেখার দায়িত্ব নেয়।


ItemWriter Interface

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

ItemWriter ইন্টারফেসে একটি একমাত্র মেথড আছে:

void write(List<? extends T> items) throws Exception;
  • items: এটি একটি তালিকা বা সংগ্রহ (Collection), যা ডেটা প্রসেসিংয়ের পরে লেখার জন্য প্রস্তুত থাকে।
  • Exception: যদি লেখার সময় কোনো ত্রুটি ঘটে, তাহলে এটি একটি এক্সসেপশন রিটার্ন করবে।

Custom ItemWriter তৈরি করা

Spring Batch এ একটি Custom ItemWriter তৈরি করতে হলে আপনাকে ItemWriter ইন্টারফেসটি ইমপ্লিমেন্ট করতে হবে এবং তার মধ্যে write() মেথডটি কাস্টমভাবে বাস্তবায়ন করতে হবে। এখানে আমরা একটি উদাহরণ দেখাব, যেখানে একটি Custom ItemWriter ডেটা একটি সিম্পল ফাইল (টেক্সট ফাইল) এ লিখবে।

Custom ItemWriter উদাহরণ: ডেটা ফাইল এ লেখা

ধরা যাক, আমাদের একটি ItemWriter তৈরি করতে হবে যা একটি List আইটেমকে একটি টেক্সট ফাইলে লিখবে।

import org.springframework.batch.item.ItemWriter;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

public class FileItemWriter implements ItemWriter<String> {

    private String outputFile;

    public FileItemWriter(String outputFile) {
        this.outputFile = outputFile;
    }

    @Override
    public void write(List<? extends String> items) throws Exception {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile, true))) {
            for (String item : items) {
                writer.write(item);
                writer.newLine(); // একেকটি আইটেম নতুন লাইনে লেখা হবে
            }
        } catch (IOException e) {
            throw new Exception("Error writing to file", e);
        }
    }
}

এখানে:

  • FileItemWriter ক্লাসটি ItemWriter ইন্টারফেস ইমপ্লিমেন্ট করেছে।
  • write() মেথডে List<String> আইটেমগুলো টেক্সট ফাইলে লেখার জন্য BufferedWriter ব্যবহার করা হয়েছে।
  • ফাইলটি অতিরিক্ত লেখা এড়াতে (append mode) true ব্যবহার করা হয়েছে।
  • IOException হলে সেই এক্সসেপশনটি পুনরায় ছুড়ে দেওয়া হয়েছে।

ItemWriter কে Step এ ব্যবহার করা

এখন, আমরা আমাদের Custom ItemWriter কে একটি Step এর মধ্যে ব্যবহার করব, যা Spring Batch Job এর একটি অংশ হিসেবে কাজ করবে। Step এ ItemWriter সাধারণত ItemReader এবং ItemProcessor এর সাথে ব্যবহৃত হয়।

Step তৈরি করা

@Configuration
@EnableBatchProcessing
public class BatchConfig {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job myJob() {
        return jobBuilderFactory.get("myJob")
                .start(myStep())
                .build();
    }

    @Bean
    public Step myStep() {
        return stepBuilderFactory.get("myStep")
                .<String, String>chunk(10)  // প্রতি 10টি আইটেমে চাঙ্ক
                .reader(myItemReader())
                .processor(myItemProcessor())
                .writer(myItemWriter())  // Custom ItemWriter ব্যবহার করা হয়েছে
                .build();
    }

    @Bean
    public ItemReader<String> myItemReader() {
        return new MyItemReader();  // এই উদাহরণে আইটেম রিডার কাস্টম
    }

    @Bean
    public ItemProcessor<String, String> myItemProcessor() {
        return new MyItemProcessor();  // প্রসেসিংয়ের জন্য কাস্টম প্রসেসর
    }

    @Bean
    public ItemWriter<String> myItemWriter() {
        return new FileItemWriter("output.txt");  // Custom FileItemWriter
    }
}

এখানে:

  • myStep() এর মধ্যে আমাদের Custom ItemWriter (FileItemWriter) ব্যবহার করা হয়েছে।
  • chunk(10) এর মাধ্যমে প্রতি ১০টি আইটেমের পর ItemWriter কে কল করা হবে।

ItemWriter এর ব্যবহার ক্ষেত্র

Custom ItemWriter সাধারণত ব্যবহার করা হয় যখন:

  • আপনাকে একটি কাস্টম আউটপুট টার্গেটে ডেটা লিখতে হয়, যেমন ফাইল, ডেটাবেস, বা অন্যান্য আউটপুট মিডিয়া।
  • বৃহৎ পরিমাণ ডেটাকে একত্রে (batch) লেখা হয়।
  • ডেটা লেখার জন্য কোনো নির্দিষ্ট লজিক প্রয়োগ করতে হয়, যেমন ফাইলের মধ্যে নির্দিষ্ট ফরম্যাটে ডেটা লেখা বা বিশেষ কোনো এক্সটেনশন সহ ফাইল তৈরি করা।

সারাংশ

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

Content added By

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

নিচে, ItemWriter কনফিগারেশন এবং ব্যবহারের উদাহরণ দেওয়া হলো।


ItemWriter এর ভূমিকা

ItemWriter মূলত একটি ইন্টারফেস যা একাধিক আইটেম গ্রহণ করে এবং সেগুলো একটি নির্দিষ্ট ডেস্টিনেশনে লেখে। এটি ব্যাচের শেষে কাজ করে এবং সাধারণত একটি নির্দিষ্ট সংখ্যক আইটেম একত্রে লেখে, যাতে পারফরম্যান্স বৃদ্ধি পায়।

এটি তিনটি প্রধান দায়িত্ব পালন করে:

  1. ডেটা লেখা: এটি প্রক্রিয়া করা ডেটা নির্দিষ্ট ডেস্টিনেশনে (যেমন ডেটাবেস, ফাইল, বা কনসোল) লেখে।
  2. ব্যাচ আউটপুট: এটি একবারে একাধিক আইটেম লেখে।
  3. পারফরম্যান্স উন্নতি: একাধিক আইটেম একসঙ্গে লেখার মাধ্যমে পারফরম্যান্স উন্নত হয়।

ItemWriter কনফিগারেশন উদাহরণ

ধরা যাক, আমাদের একটি প্রোডাক্ট ক্লাস রয়েছে এবং আমরা ItemWriter ব্যবহার করে প্রক্রিয়া করা আইটেমগুলো কনসোলে লিখতে চাই। নিচে উদাহরণসহ কনফিগারেশন দেওয়া হলো।

Product ক্লাস:

public class Product {
    private String name;
    private double price;

    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }

    // Getters and Setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

ItemWriter কনফিগারেশন:

ItemWriter এর জন্য আমরা একটি কাস্টম ক্লাস তৈরি করব যা ItemWriter ইন্টারফেস ইমপ্লিমেন্ট করবে এবং ডেটা কনসোলে লিখবে।

@Bean
public ItemWriter<Product> itemWriter() {
    return new ItemWriter<Product>() {
        @Override
        public void write(List<? extends Product> items) throws Exception {
            // আইটেমগুলিকে কনসোলে লিখে
            for (Product product : items) {
                System.out.println("Writing product: " + product.getName() + " with price: " + product.getPrice());
            }
        }
    };
}

এখানে, আমরা একটি কাস্টম ItemWriter তৈরি করেছি যা Product আইটেমগুলি গ্রহণ করে এবং কনসোলে সেই আইটেমের নাম এবং মূল্য লেখে।

Step কনফিগারেশন:

এখন, আমরা ItemReader, ItemProcessor, এবং ItemWriter একত্রে ব্যবহার করব একটি Step কনফিগারেশনে, যেখানে chunk(5) দ্বারা প্রতি চাঙ্কে ৫টি আইটেম প্রসেস করা হবে।

@Bean
public Step step1() {
    return stepBuilderFactory.get("step1")
        .<Product, Product>chunk(5)
        .reader(itemReader())       // ডেটা পড়ার জন্য ItemReader
        .processor(itemProcessor()) // ডেটা প্রসেস করার জন্য ItemProcessor
        .writer(itemWriter())       // ডেটা লেখার জন্য ItemWriter
        .build();
}

এখানে, chunk(5) দ্বারা প্রতি চাঙ্কে ৫টি Product আইটেম প্রসেস করা হবে এবং একবারে লেখা হবে।

Job কনফিগারেশন:

এটি সম্পূর্ণ Job কনফিগারেশনের অংশ হতে হবে, যা স্প্রিং ব্যাচের ব্যাচ প্রসেসিংয়ের মূল অংশ। আমরা এই Step কে একটি Job-এ অন্তর্ভুক্ত করব।

@Bean
public Job job(JobRepository jobRepository, JobLauncher jobLauncher) {
    return jobBuilderFactory.get("job")
        .start(step1())
        .build();
}

এখানে, job তৈরি করা হয়েছে, যা step1 কে এক্সিকিউট করবে।


ItemWriter ব্যবহার করে ডেটা লেখা

আপনার ItemWriter কনফিগারেশন প্রস্তুত হলে, যখন ব্যাচ জবটি চলবে, তখন ডেটা প্রসেস হয়ে শেষ হলে ItemWriter কনফিগারেশনের মাধ্যমে ডেটা কনসোলে বা অন্য কোনো আউটপুট ডিভাইসে লেখা হবে। এখানে কনসোল আউটপুটের উদাহরণ দেওয়া হল:

Writing product: Product1 with price: 100.0
Writing product: Product2 with price: 200.0
Writing product: Product3 with price: 150.0

এখানে তিনটি প্রোডাক্ট আইটেম কনসোলে লেখা হয়েছে।


আরও উন্নত ItemWriter কনফিগারেশন

আমরা যদি ডেটাবেসে ডেটা লিখতে চাই, তবে JdbcBatchItemWriter ব্যবহার করতে পারি, যা স্প্রিং ব্যাচের বিল্ট-ইন ItemWriter। নিচে এর একটি উদাহরণ দেওয়া হল:

JdbcBatchItemWriter কনফিগারেশন:

@Bean
public JdbcBatchItemWriter<Product> itemWriter(DataSource dataSource) {
    JdbcBatchItemWriter<Product> writer = new JdbcBatchItemWriter<>();
    writer.setDataSource(dataSource);
    writer.setSql("INSERT INTO products (name, price) VALUES (?, ?)");
    writer.setItemPreparedStatementSetter(new ItemPreparedStatementSetter<Product>() {
        @Override
        public void setValues(Product product, PreparedStatement ps) throws SQLException {
            ps.setString(1, product.getName());
            ps.setDouble(2, product.getPrice());
        }
    });
    return writer;
}

এখানে, JdbcBatchItemWriter ব্যবহার করা হয়েছে যাতে ডেটাবেসে প্রোডাক্ট আইটেমগুলো ইনসার্ট করা যায়। SQL কুয়েরি এবং ItemPreparedStatementSetter ব্যবহার করে আমরা Product আইটেমগুলো ডেটাবেসে ইনসার্ট করি।


উপসংহার

স্প্রিং ব্যাচে ItemWriter ডেটা লেখার জন্য একটি গুরুত্বপূর্ণ উপাদান। এটি ডেটা কনফিগার করে আউটপুট ডেস্টিনেশনে (যেমন কনসোল, ফাইল, ডেটাবেস) লেখে। উপরের উদাহরণে, কাস্টম ItemWriter এবং JdbcBatchItemWriter ব্যবহার করা হয়েছে, যা আপনাকে ব্যাচ প্রসেসিংয়ের ক্ষেত্রে বিভিন্ন আউটপুট ডেস্টিনেশনে ডেটা লেখার জন্য সাহায্য করবে। ItemWriter কনফিগারেশন আরও কাস্টমাইজ এবং সম্প্রসারণযোগ্য, যা স্প্রিং ব্যাচের একটি শক্তিশালী বৈশিষ্ট্য।

Content added By
Promotion

Are you sure to start over?

Loading...