স্প্রিং ব্যাচ (Spring Batch) একটি ফ্রেমওয়ার্ক যা বড় পরিসরের ব্যাচ প্রসেসিং-এর জন্য ডিজাইন করা হয়েছে। এটি মূলত জাভা টেকনোলজি ব্যবহার করে ডেটা প্রক্রিয়াকরণের জন্য ব্যবহৃত হয়। স্প্রিং ব্যাচের মধ্যে দুটি মূল উপাদান আছে যেগুলোর মাধ্যমে ব্যাচ প্রসেসিং পরিচালিত হয়: Chunk-based এবং Tasklet-based Step। এই দুইটি ভিত্তিক Step-এর কাজগুলো বিস্তারিতভাবে জানবো।
Chunk-based Step
Chunk-based Step হলো একটি স্টেপ যেখানে ডেটা ছোট ছোট অংশে (chunk) ভাগ করা হয় এবং প্রতিটি অংশের উপর আলাদা করে প্রসেসিং করা হয়। এটি তখনই উপকারী হয় যখন আপনি খুব বড় পরিসরের ডেটা নিয়ে কাজ করছেন এবং একে একে সব ডেটা মেমোরিতে লোড করা সম্ভব নয়।
কাজের প্রক্রিয়া:
- ItemReader: ডেটা পড়ার জন্য ব্যবহার করা হয়।
- ItemProcessor: প্রতিটি আইটেমের উপর প্রক্রিয়াকরণ করা হয়।
- ItemWriter: প্রক্রিয়াকৃত ডেটা কোন ডেস্টিনেশনে লেখার জন্য ব্যবহৃত হয়।
- CommitInterval: Chunk size হিসেবে ডেটার কত অংশ একসাথে প্রসেস করা হবে তা নির্ধারণ করে।
এতে করে প্রতি chunk এর শেষে commit করা হয়, অর্থাৎ প্রতি chunk প্রসেসিং শেষে ডেটা ডাটাবেসে সেভ হয়ে যায়।
Tasklet-based Step
Tasklet-based Step একটি সাধারাণ স্টেপ যেখানে একটি নির্দিষ্ট কাজ সম্পন্ন করার জন্য শুধুমাত্র একটির বেশি কার্যক্রম বা স্টেপের প্রয়োজন হয় না। Tasklet হল একটি সিঙ্গল টাস্ক যা ব্যাচ প্রসেসিংয়ের জন্য বিশেষভাবে উপযুক্ত, যেমন কোনও সিস্টেম বা ফাইল থেকে ডেটা সরানো, বা ডেটাবেসের মধ্যে নির্দিষ্ট আপডেট করা।
কাজের প্রক্রিয়া:
- Tasklet: এই স্টেপের মধ্যে আপনি একটি একক কার্যকলাপ সম্পন্ন করেন, যা একটি নির্দিষ্ট কাজের উপর ভিত্তি করে। Tasklet সাধারণত একটি
execute()মেথডের মাধ্যমে কাজ করে যা যে কাজটি করবে তা নির্দেশ করে।
উদাহরণ:
ফাইল সিস্টেম থেকে একটি ফাইল মুছে ফেলতে Tasklet-based Step ব্যবহার করা যেতে পারে।
প্রতিটি Step-ই নির্দিষ্ট পরিস্থিতিতে উপকারী। Chunk-based Step তখন ব্যবহৃত হয় যখন বড় পরিসরের ডেটা প্রসেস করতে হয় এবং Tasklet-based Step ব্যবহৃত হয় যখন একটি নির্দিষ্ট একক কাজ সম্পাদন করা প্রয়োজন।
স্প্রিং ব্যাচে Chunk-based এবং Tasklet-based Step-এ কাজ করার জন্য প্রাথমিকভাবে স্প্রিং ব্যাচের কিছু প্রয়োজনীয় কনফিগারেশন তৈরি করতে হয়। নিচে বিস্তারিত কোড সহ দুইটি ধরণের Step-এর উদাহরণ দেওয়া হলো।
Chunk-based Step এর উদাহরণ
Chunk-based প্রসেসিং-এ আপনি ডেটা পঠন, প্রক্রিয়া, এবং লেখার জন্য আলাদা আলাদা অংশ তৈরি করবেন। এখানে ItemReader, ItemProcessor, এবং ItemWriter ব্যবহার করা হয়।
প্রয়োজনীয় ডিপেনডেন্সি
স্প্রিং ব্যাচ ব্যবহার করতে হলে, pom.xml ফাইলে নিচের ডিপেনডেন্সি গুলি যুক্ত করতে হবে:
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-core</artifactId>
<version>5.0.0</version> <!-- Ensure to use the latest version -->
</dependency>
কোড উদাহরণ
1. ItemReader, ItemProcessor, এবং ItemWriter ক্লাস তৈরি
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;
import org.springframework.stereotype.Component;
@Component
public class MyItemProcessor implements ItemProcessor<MyData, MyData> {
@Override
public MyData process(MyData item) throws Exception {
// Process each item (e.g., transforming it)
item.setName(item.getName().toUpperCase());
return item;
}
}
@Component
public class MyItemReader implements ItemReader<MyData> {
private List<MyData> data = Arrays.asList(
new MyData("John"), new MyData("Jane"), new MyData("Doe")
);
private int index = 0;
@Override
public MyData read() throws Exception {
if (index < data.size()) {
return data.get(index++);
}
return null; // End of data
}
}
@Component
public class MyItemWriter implements ItemWriter<MyData> {
@Override
public void write(List<? extends MyData> items) throws Exception {
for (MyData item : items) {
System.out.println("Writing: " + item.getName());
}
}
}
2. Chunk-based Step কনফিগারেশন
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.launch.support.RunIdIncrementer;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.step.tasklet.TaskletStep;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.batch.core.Job;
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Bean
public Job job(JobBuilderFactory jobBuilderFactory, Step step) {
return jobBuilderFactory.get("myJob")
.incrementer(new RunIdIncrementer())
.start(step)
.build();
}
@Bean
public Step step(StepBuilderFactory stepBuilderFactory, MyItemReader reader, MyItemProcessor processor, MyItemWriter writer) {
return stepBuilderFactory.get("myStep")
.<MyData, MyData>chunk(2) // 2 items per chunk
.reader(reader)
.processor(processor)
.writer(writer)
.build();
}
}
3. MyData ক্লাস
public class MyData {
private String name;
public MyData(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
এই কনফিগারেশন অনুসারে, ২টি ডেটা একসাথে প্রসেস করা হবে প্রতি চাঙ্কে এবং প্রতিটি আইটেম প্রসেস করার পরে ItemWriter তাদের আউটপুট দেখাবে।
Tasklet-based Step এর উদাহরণ
Tasklet-based Step-এ আপনি একক কার্যক্রম সম্পাদন করেন। উদাহরণস্বরূপ, একটি ফাইল থেকে ডেটা সরিয়ে ফেলা বা নির্দিষ্ট কোনও কাজ করতে এই পদ্ধতি ব্যবহার করা হয়।
কোড উদাহরণ
1. Tasklet কনফিগারেশন
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.launch.support.RunIdIncrementer;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.batch.core.Job;
@Configuration
@EnableBatchProcessing
public class TaskletBatchConfig {
@Bean
public Job taskletJob(JobBuilderFactory jobBuilderFactory, Step taskletStep) {
return jobBuilderFactory.get("taskletJob")
.incrementer(new RunIdIncrementer())
.start(taskletStep)
.build();
}
@Bean
public Step taskletStep(StepBuilderFactory stepBuilderFactory, Tasklet myTasklet) {
return stepBuilderFactory.get("taskletStep")
.tasklet(myTasklet)
.build();
}
@Bean
public Tasklet myTasklet() {
return (contribution, chunkContext) -> {
System.out.println("Executing Tasklet...");
return null; // return null to indicate completion
};
}
}
2. Tasklet ব্যবহার করে কোনো কাজ
এখানে Tasklet একটি নির্দিষ্ট কাজ সম্পাদন করছে, যেমন কনসোল আউটপুট। আপনি আরও জটিল কাজ যেমন ফাইল রিড, ডাটাবেস অপারেশন বা ফাইল মুছে ফেলা ইত্যাদি করতে পারেন।
এই দুইটি উদাহরণের মাধ্যমে আপনি স্প্রিং ব্যাচের Chunk-based এবং Tasklet-based Step এর কনফিগারেশন এবং কাজ দেখতে পেলেন। আপনার প্রজেক্টের প্রয়োজন অনুযায়ী এগুলো ব্যবহার করতে পারেন।
Read more