Spring Batch এর একটি গুরুত্বপূর্ণ অংশ হল Step Configuration, যেখানে একটি Step এর মাধ্যমে একটি ব্যাচ প্রোগ্রামে একাধিক কাজ সম্পন্ন করা হয়। Step একটি নির্দিষ্ট কাজের সেটকে নির্দেশ করে, যেমন ডেটা রিড করা, প্রোসেস করা এবং রাইট করা। প্রতিটি Step সাধারণত একটি ItemReader, ItemProcessor, এবং ItemWriter ব্যবহার করে কাজ সম্পন্ন করে।
এখানে একটি Step Configuration এর উদাহরণ দেওয়া হবে, যেখানে Spring Batch এর বিভিন্ন কনফিগারেশন ব্যবহার করে একটি Step তৈরি করা হবে।
1. প্রয়োজনীয় ডিপেনডেন্সি ইনস্টল করা
Spring Batch অ্যাপ্লিকেশন তৈরি করতে হলে প্রথমে spring-boot-starter-batch ডিপেনডেন্সি pom.xml ফাইলে যোগ করতে হবে।
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Starter Batch -->
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-core</artifactId>
</dependency>
<!-- H2 Database for in-memory DB (optional) -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
এখানে, spring-batch-core ডিপেনডেন্সি Spring Batch এর প্রধান কার্যকারিতা প্রদান করে এবং H2 ডাটাবেস (যদি আপনি ডেটাবেস ব্যবহার করতে চান) একটি ইন-মেমরি ডেটাবেস হিসেবে ব্যবহার করা হচ্ছে।
2. Step Configuration তৈরি করা
Spring Batch এ Step তৈরি করতে হলে ItemReader, ItemProcessor, এবং ItemWriter এর কম্পোনেন্টগুলো কনফিগার করা হয়।
2.1 Step কনফিগারেশন ক্লাস
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();
}
}
এখানে:
- Job কনফিগারেশন করা হয়েছে, যেখানে
userStep()নামক Step কে অন্তর্ভুক্ত করা হয়েছে। - Step কনফিগারেশনে
chunk(10)পদ্ধতি ব্যবহার করা হয়েছে, যা প্রতি 10টি আইটেম একসাথে প্রসেস করবে। - ItemReader, ItemProcessor, এবং ItemWriter গুলি Bean হিসেবে কনফিগার করা হয়েছে।
3. Reader, Processor এবং Writer তৈরি করা
এখন, ItemReader, ItemProcessor, এবং ItemWriter ক্লাসগুলো তৈরি করা হবে, যেগুলি Step এর মধ্যে কাজ করবে।
3.1 ItemReader তৈরি করা
ItemReader ক্লাসটি ডেটা পড়ার জন্য ব্যবহৃত হয়। এখানে, UserItemReader ক্লাস একটি সিম্পল ইউজার ডেটা রিডার হিসেবে কাজ করবে।
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 একটি স্ট্যাটিক লিস্ট থেকে ইউজার ডেটা রিড করে। প্রতিবার কল করার সময় এটি পরবর্তী ইউজার অবজেক্ট রিটার্ন করবে।
3.2 ItemProcessor তৈরি করা
ItemProcessor ডেটা প্রসেস করার জন্য ব্যবহৃত হয়। এখানে, UserItemProcessor ক্লাসের মধ্যে ডেটা প্রসেস করা হবে।
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 তে রূপান্তর করবে।
3.3 ItemWriter তৈরি করা
ItemWriter ডেটা লেখার জন্য ব্যবহৃত হয়। এখানে, UserItemWriter ক্লাস কনসোলে প্রোসেস করা ডেটা লেখবে।
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 প্রোসেস করা User অবজেক্টগুলি কনসোলে প্রিন্ট করে।
4. User Model ক্লাস
এখন, আমাদের একটি User মডেল ক্লাস তৈরি করতে হবে, যেটি ডেটা রিড, প্রোসেস এবং রাইট করার জন্য ব্যবহৃত হবে।
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 ক্লাসের মধ্যে নাম এবং ইমেইল ফিল্ড রয়েছে এবং সেগুলির জন্য গেটার এবং সেটার মেথড রয়েছে।
5. Batch Job চালানো
Spring Batch অ্যাপ্লিকেশন চালানোর জন্য, আপনি BatchConfig কনফিগারেশন ক্লাসে JobLauncher ব্যবহার করে জব রান করতে পারেন।
5.1 Job Execution
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 এর মাধ্যমে আপনি Step Configuration ব্যবহার করে ব্যাচ প্রসেস তৈরি করতে পারেন। ItemReader, ItemProcessor, এবং ItemWriter এর মাধ্যমে ডেটা রিড, প্রোসেস এবং রাইট করার কাজ করা হয়। এই উদাহরণে, আমরা দেখেছি কিভাবে একটি User ব্যাচ প্রসেস তৈরি করতে হয় এবং প্রতিটি Step এ ডেটা প্রোসেস করা হয়। Spring Batch বড় আকারের ডেটা প্রসেসিংয়ে সহায়ক এবং স্কেলেবল একটি ফ্রেমওয়ার্ক।
Read more