স্প্রিং ব্যাচ (Spring Batch) একটি শক্তিশালী ফ্রেমওয়ার্ক যা ব্যাচ প্রসেসিং পরিচালনা করতে ব্যবহৃত হয়। একটি Batch Job হলো একটি নির্দিষ্ট কাজের সমষ্টি যা একসাথে চালানো হয়। এটি সাধারণত একাধিক Step নিয়ে গঠিত হয়, যেখানে প্রতিটি Step একটি নির্দিষ্ট কার্যক্রম (যেমন, ডেটা পড়া, ডেটা প্রক্রিয়া করা, ডেটা লেখা) সম্পাদন করে। স্প্রিং ব্যাচের মাধ্যমে একটি Job এবং Step তৈরি করা খুবই সহজ এবং কনফিগারেবল।
এখানে, আমরা একটি Spring Batch Job তৈরি করার পুরো প্রক্রিয়া উদাহরণ সহ ব্যাখ্যা করব।
১. প্রয়োজনীয় ডিপেনডেন্সি
স্প্রিং ব্যাচের জন্য প্রয়োজনীয় ডিপেনডেন্সি 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 (for database interaction, optional) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- Database Driver (e.g., MySQL) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
এখানে spring-boot-starter-batch ডিপেনডেন্সি স্প্রিং ব্যাচ ফিচারগুলি অন্তর্ভুক্ত করে এবং spring-boot-starter-data-jpa ডিপেনডেন্সি ডেটাবেস সংযোগের জন্য ব্যবহৃত হবে।
২. Batch Job তৈরি করা
স্প্রিং ব্যাচে একটি Job তৈরি করতে, প্রথমে Step তৈরি করতে হয়। একটি Job একাধিক Step নিয়ে গঠিত হতে পারে, যেখানে প্রতিটি Step একটি নির্দিষ্ট কার্যক্রম সম্পাদন করে।
Step 1: Data Model (Entity) তৈরি করা
ধরা যাক আমরা একটি সিম্পল User এন্টিটি তৈরি করেছি, যা ডেটাবেসে সেভ হবে।
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class User {
@Id
private Long id;
private String name;
private String email;
// Getters and Setters
}
এখানে, User ক্লাসে id, name, এবং email ফিল্ড রয়েছে।
Step 2: ItemReader, ItemProcessor, এবং ItemWriter তৈরি করা
স্প্রিং ব্যাচে ItemReader, ItemProcessor, এবং ItemWriter ব্যবহার করে ব্যাচে ডেটা পড়া, প্রক্রিয়া করা এবং লেখা হয়।
- ItemReader: ডেটা পড়ার জন্য।
- ItemProcessor: ডেটা প্রক্রিয়া করার জন্য।
- ItemWriter: ডেটা লেখার জন্য।
ItemReader
import org.springframework.batch.item.ItemReader;
import java.util.List;
public class UserItemReader implements ItemReader<User> {
private List<User> users;
private int currentIndex = 0;
public UserItemReader(List<User> users) {
this.users = users;
}
@Override
public User read() throws Exception {
if (currentIndex < users.size()) {
return users.get(currentIndex++);
}
return null; // End of the data
}
}
এখানে, UserItemReader ক্লাস ডেটা পড়ার জন্য একটি সিম্পল লিস্ট ব্যবহার করছে।
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()); // Example transformation
return user;
}
}
এখানে, UserItemProcessor ক্লাস নামের প্রথম অক্ষরগুলো বড় করে দেয়।
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());
}
}
}
এখানে, UserItemWriter কনসোল আউটপুটে ব্যবহারকারীর নাম লিখবে।
Step 3: Batch Job Configuration
এখন, আমরা একটি Job কনফিগার করব, যা একাধিক 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.Job;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;
import org.springframework.beans.factory.annotation.Autowired;
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public ItemReader<User> itemReader() {
// Sample list of users
List<User> users = Arrays.asList(
new User(1L, "John Doe", "john@example.com"),
new User(2L, "Jane Smith", "jane@example.com")
);
return new UserItemReader(users);
}
@Bean
public ItemProcessor<User, User> itemProcessor() {
return new UserItemProcessor();
}
@Bean
public ItemWriter<User> itemWriter() {
return new UserItemWriter();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.<User, User>chunk(2)
.reader(itemReader())
.processor(itemProcessor())
.writer(itemWriter())
.build();
}
@Bean
public Job job() {
return jobBuilderFactory.get("job")
.start(step1())
.build();
}
}
এখানে:
ItemReader,ItemProcessor, এবংItemWriterতৈরি করা হয়েছে এবং এগুলোকে একটি Step-এ যুক্ত করা হয়েছে।- Chunk এর মাধ্যমে ডেটা একটি নির্দিষ্ট আকারে প্রসেস করা হয়। এখানে আমরা
chunk(2)ব্যবহার করেছি, অর্থাৎ প্রতি ২টি রেকর্ডে একটি ব্যাচ প্রক্রিয়া করা হবে। Jobকনফিগারেশন তৈরি করা হয়েছে, যা একটিই Step নিয়েছে।
Step 4: Application Run Configuration
স্প্রিং বুট অ্যাপ্লিকেশন চালানোর জন্য মূল ক্লাস তৈরি করা:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Autowired;
@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())দিয়ে ব্যাচ কাজ শুরু করা হয়।@PostConstruct: এই অ্যানোটেশনটি ব্যবহার করে অ্যাপ্লিকেশন স্টার্ট হওয়ার পর প্রথমে ব্যাচ কাজ চালানো হয়।
সারাংশ
স্প্রিং ব্যাচের মাধ্যমে একটি Batch Job তৈরি করা খুবই সহজ এবং কনফিগারেবল। এখানে আমরা একটি সিম্পল ব্যাচ কাজ তৈরি করেছি, যা ItemReader, ItemProcessor, এবং ItemWriter ব্যবহার করে ডেটা পড়ে, প্রক্রিয়া করে এবং লেখে। ব্যাচ প্রসেসিংকে আরও কার্যকরী এবং স্কেলেবল করতে আপনি একাধিক Step, Parallel Processing, বা Partitioned Processing ব্যবহার করতে পারেন।
Read more