Spring Batch হল একটি শক্তিশালী ফ্রেমওয়ার্ক যা বিশেষভাবে ব্যাচ প্রসেসিং (যেমন ডেটা মাইগ্রেশন, রিপোর্ট জেনারেশন, ইত্যাদি) সম্পাদন করার জন্য ডিজাইন করা হয়েছে। এটি বড় পরিমাণ ডেটার সাথে কাজ করার জন্য বিশেষভাবে প্রস্তুত, এবং বিভিন্ন ধরনের ডেটা প্রসেসিং স্টেপ (যেমন রিড, প্রসেস এবং রাইট) সম্পাদন করার জন্য সুবিধা প্রদান করে।
স্প্রিং ব্যাচের মাধ্যমে আপনি ইনপুট ডেটা (যেমন ফাইল, ডেটাবেস) থেকে আউটপুট ডেটা (যেমন ফাইল, ডেটাবেস, কনসোল) তৈরি করতে পারেন। এখানে আমরা Spring Batch Processing তৈরি করার একটি উদাহরণ দেখব, যেখানে আমরা একটি ব্যাচ জব তৈরি করব যা ডেটাবেস থেকে ডেটা পড়ে, প্রক্রিয়া করে এবং ফলাফল একটি ফাইলে রাইট করবে।
Spring Batch এর উপাদানসমূহ
স্প্রিং ব্যাচ প্রধানত নিম্নলিখিত উপাদানগুলি নিয়ে গঠিত:
- Job: ব্যাচ প্রসেসিংয়ের মূল একক। এটি এক বা একাধিক স্টেপের একটি সেট হতে পারে।
- Step: একটি ব্যাচ জবের একক কার্যকরী ইউনিট যা কোনো নির্দিষ্ট কাজ সম্পাদন করে (যেমন রিডিং, প্রসেসিং বা রাইটিং)।
- ItemReader: ইনপুট ডেটা থেকে ডেটা পড়ার জন্য ব্যবহৃত হয়।
- ItemProcessor: ডেটা প্রসেস করার জন্য ব্যবহৃত হয়।
- ItemWriter: ডেটা আউটপুটে লেখার জন্য ব্যবহৃত হয়।
Spring Batch Configuration
স্প্রিং ব্যাচ প্রসেসিং সিস্টেমের জন্য কনফিগারেশন ক্লাস তৈরি করতে হবে যাতে Job, Step, ItemReader, ItemProcessor, এবং ItemWriter কনফিগার করা যায়।
উদাহরণ: Simple Spring Batch Processing
এখানে একটি উদাহরণ দেওয়া হলো যেখানে আমরা Spring Batch ব্যবহার করে একটি CSV ফাইল থেকে ডেটা রিড করব, ডেটা প্রসেস করব এবং একটি ফাইল বা ডেটাবেসে রাইট করব।
১. স্প্রিং বুট কনফিগারেশন
প্রথমে, স্প্রিং বুট অ্যাপ্লিকেশন তৈরি করতে হবে, এবং স্প্রিং ব্যাচের জন্য প্রয়োজনীয় কনফিগারেশন যোগ করতে হবে। pom.xml ফাইলের জন্য প্রয়োজনীয় ডিপেনডেন্সি যোগ করুন:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-infrastructure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
২. স্প্রিং ব্যাচ কনফিগারেশন ক্লাস
import org.springframework.batch.core.Job;
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.item.ItemReader;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.core.JobParametersValidator;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.core.explore.JobExplorer;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.launch.JobLauncher;
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;
}
// Define an ItemReader
@Bean
public ItemReader<String> reader() {
return new FileReader(); // You can implement the logic of reading data from CSV or other sources
}
// Define an ItemProcessor
@Bean
public ItemProcessor<String, String> processor() {
return new UppercaseProcessor(); // Simple processor that converts the data to uppercase
}
// Define an ItemWriter
@Bean
public ItemWriter<String> writer() {
return new FileWriter(); // You can implement the logic of writing to a file
}
// Step Definition
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.<String, String> chunk(10) // Define chunk size
.reader(reader())
.processor(processor())
.writer(writer())
.build();
}
// Job Definition
@Bean
public Job processJob() {
return jobBuilderFactory.get("processJob")
.incrementer(new RunIdIncrementer()) // Job will have a unique ID for each execution
.start(step1()) // Starting point of the job
.build();
}
}
৩. ItemReader, ItemProcessor এবং ItemWriter ক্লাস
ItemReader উদাহরণ:
import org.springframework.batch.item.ItemReader;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class FileReader implements ItemReader<String> {
private BufferedReader reader;
@Override
public String read() throws Exception {
if (reader == null) {
reader = new BufferedReader(new java.io.FileReader("data.csv"));
}
return reader.readLine(); // Read each line from the file
}
}
ItemProcessor উদাহরণ:
import org.springframework.batch.item.ItemProcessor;
public class UppercaseProcessor implements ItemProcessor<String, String> {
@Override
public String process(String item) throws Exception {
return item.toUpperCase(); // Convert the string to uppercase
}
}
ItemWriter উদাহরণ:
import org.springframework.batch.item.ItemWriter;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
public class FileWriter implements ItemWriter<String> {
private BufferedWriter writer;
@Override
public void write(List<? extends String> items) throws Exception {
if (writer == null) {
writer = new BufferedWriter(new java.io.FileWriter("output.txt"));
}
for (String item : items) {
writer.write(item);
writer.newLine();
}
writer.flush();
}
}
৪. স্প্রিং বুট অ্যাপ্লিকেশন চালানো
স্প্রিং বুট অ্যাপ্লিকেশন চালাতে, আপনাকে একটি Main Application ক্লাস তৈরি করতে হবে যা @SpringBootApplication অ্যানোটেশন সহ হবে।
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class BatchApplication {
public static void main(String[] args) {
SpringApplication.run(BatchApplication.class, args);
}
}
৫. ব্যাচ জব চালানো
স্প্রিং ব্যাচের মধ্যে JobLauncher ব্যবহার করে ব্যাচ জব চালানো যায়। এটি ব্যাচ জবের স্টার্ট এবং এক্সিকিউশন পরিচালনা করে।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.launch.JobExecution;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class BatchJobRunner implements CommandLineRunner {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job processJob;
@Override
public void run(String... args) throws Exception {
JobExecution jobExecution = jobLauncher.run(processJob, new org.springframework.batch.core.JobParameters());
System.out.println("Job Status: " + jobExecution.getStatus());
}
}
৬. রান এবং আউটপুট
এখন আপনার স্প্রিং ব্যাচ অ্যাপ্লিকেশনটি চালানোর জন্য প্রস্তুত। এটি ডেটা রিড করবে, প্রসেস করবে এবং আউটপুট ফাইলে লেখাবে। আপনি java -jar your-application.jar কমান্ড দিয়ে অ্যাপ্লিকেশনটি চালু করতে পারেন এবং ফলস্বরূপ ডেটা আউটপুট ফাইলে পাওয়া যাবে।
সারাংশ
Spring Batch একটি শক্তিশালী ফ্রেমওয়ার্ক যা ডেটা ব্যাচ প্রসেসিংয়ের জন্য ব্যবহৃত হয়। এর মাধ্যমে আপনি সহজেই ডেটাবেস থেকে ডেটা রিড, প্রসেস এবং আউটপুটে লেখার মতো কার্যক্রম করতে পারেন। এখানে, স্প্রিং ব্যাচের ItemReader, ItemProcessor, এবং ItemWriter ব্যবহার করে একটি সিম্পল ব্যাচ প্রসেসিং অ্যাপ্লিকেশন তৈরি করা হয়েছে, যা CSV ফাইল থেকে ডেটা রিড করে এবং output.txt ফাইলে প্রক্রিয়া করা ডেটা লেখে।