স্প্রিং ব্যাচ (Spring Batch) এবং স্প্রিং বুট (Spring Boot) একসাথে ব্যবহার করা খুবই জনপ্রিয়, কারণ স্প্রিং বুটের মাধ্যমে স্প্রিং ব্যাচকে খুব সহজে কনফিগার এবং ডিপ্লয় করা যায়। স্প্রিং ব্যাচ মূলত ব্যাচ প্রসেসিং কাজ পরিচালনার জন্য ব্যবহৃত হয়, যেমন বড় পরিমাণ ডেটা পড়া, প্রক্রিয়া করা এবং লিখা, যখন স্প্রিং বুট একটি ফ্রেমওয়ার্ক যা এন্টারপ্রাইজ অ্যাপ্লিকেশন দ্রুত এবং সহজে তৈরি করতে সহায়তা করে। স্প্রিং বুটের সাথে স্প্রিং ব্যাচ ইন্টিগ্রেট করলে এটি ডেটাবেস, ফাইল এবং অন্যান্য সোর্স থেকে ডেটা প্রসেস করতে শক্তিশালী এবং স্কেলেবল সিস্টেম তৈরি করতে সাহায্য করে।
এই টিউটোরিয়ালে, আমরা স্প্রিং বুট অ্যাপ্লিকেশনের মধ্যে স্প্রিং ব্যাচ কনফিগার করব এবং একটি সিম্পল ব্যাচ কাজ তৈরি করব।
স্প্রিং বুট এবং স্প্রিং ব্যাচ ইন্টিগ্রেশন: উদাহরণ
এই উদাহরণে, আমরা একটি ব্যাচ কাজ তৈরি করব যা CSV ফাইল থেকে ডেটা পড়ে, তথ্য প্রক্রিয়া করবে, এবং ডাটাবেসে লিখবে।
১. প্রয়োজনীয় ডিপেনডেন্সি
স্প্রিং বুট অ্যাপ্লিকেশনে স্প্রিং ব্যাচ কনফিগার করতে প্রথমে 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 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- Database Driver -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Spring Batch Core -->
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-core</artifactId>
</dependency>
</dependencies>
এখানে, spring-boot-starter-batch স্প্রিং ব্যাচ ফিচারগুলির জন্য এবং spring-boot-starter-data-jpa ডেটাবেস ইন্টিগ্রেশনের জন্য ব্যবহৃত হয়।
২. ব্যাচ কাজ কনফিগারেশন (Batch Job Configuration)
স্প্রিং ব্যাচে একটি ব্যাচ কাজ তৈরি করতে আমরা Step এবং Job কনফিগার করব।
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;
private int age;
// Getters and Setters
}
Step 2: ItemReader, ItemProcessor, এবং ItemWriter কনফিগারেশন
স্প্রিং ব্যাচে ডেটা পড়ার, প্রক্রিয়া করার এবং লেখার জন্য ItemReader, ItemProcessor, এবং ItemWriter ব্যবহার করা হয়।
- ItemReader: ফাইল বা ডেটাবেস থেকে ডেটা পড়তে ব্যবহৃত হয়।
- ItemProcessor: ডেটা প্রক্রিয়া করতে ব্যবহৃত হয়।
- ItemWriter: প্রক্রিয়া করা ডেটা ডেটাবেস বা ফাইলে লেখে।
ItemReader (CSV ফাইল থেকে ডেটা পড়া)
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
import org.springframework.batch.item.file.mapping.FieldSetMapper;
import org.springframework.core.io.ClassPathResource;
@Bean
public FlatFileItemReader<User> itemReader() {
FlatFileItemReader<User> reader = new FlatFileItemReader<>();
reader.setResource(new ClassPathResource("users.csv"));
// LineTokenizer কনফিগারেশন
DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
tokenizer.setNames("name", "email", "age");
// FieldSetMapper কনফিগারেশন
FieldSetMapper<User> mapper = new BeanWrapperFieldSetMapper<>();
mapper.setTargetType(User.class);
reader.setLineTokenizer(tokenizer);
reader.setFieldSetMapper(mapper);
return reader;
}
এখানে, FlatFileItemReader ব্যবহার করা হয়েছে যা CSV ফাইল থেকে ডেটা পড়বে এবং সেটিকে User অবজেক্টে রূপান্তর করবে।
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()); // Name কে বড় অক্ষরে পরিণত করা
return user;
}
}
ItemWriter (ডেটা ডাটাবেসে লেখা)
import org.springframework.batch.item.ItemWriter;
import org.springframework.beans.factory.annotation.Autowired;
public class UserItemWriter implements ItemWriter<User> {
@Autowired
private UserRepository userRepository;
@Override
public void write(List<? extends User> items) throws Exception {
for (User user : items) {
userRepository.save(user); // ডেটাবেসে সেভ করা
}
}
}
এখানে, UserItemWriter ক্লাসটি ডেটাবেসে ব্যবহারকারীদের সেভ করবে।
Step 3: Batch Job কনফিগারেশন
এখন আমরা Batch Job কনফিগার করব, যেটি ItemReader, ItemProcessor, এবং ItemWriter ব্যবহার করবে।
import org.springframework.batch.core.Step;
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;
@Configuration
public class BatchConfig {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Autowired
public BatchConfig(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) {
this.jobBuilderFactory = jobBuilderFactory;
this.stepBuilderFactory = stepBuilderFactory;
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.<User, User>chunk(10)
.reader(itemReader()) // ItemReader
.processor(new UserItemProcessor()) // ItemProcessor
.writer(new UserItemWriter()) // ItemWriter
.build();
}
@Bean
public Job job() {
return jobBuilderFactory.get("job")
.start(step1())
.build();
}
}
এখানে:
chunk(10): প্রতি ১০টি রেকর্ডে একবার ব্যাচ প্রসেস হবে।- ItemReader, ItemProcessor, এবং ItemWriter ব্যাচ স্টেপে যুক্ত করা হয়েছে।
৩. স্প্রিং বুট অ্যাপ্লিকেশন চালানো
স্প্রিং বুট অ্যাপ্লিকেশন চালানোর জন্য মূল ক্লাস তৈরি করুন:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.batch.core.launch.JobParameters;
import org.springframework.batch.core.Job;
@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()) দিয়ে ব্যাচ কাজ চালানো হয়।
সারাংশ
স্প্রিং ব্যাচ এবং স্প্রিং বুটের ইন্টিগ্রেশন ডেটাবেস থেকে ডেটা পড়া, প্রক্রিয়া করা এবং লেখা অনেক সহজ এবং কার্যকরী করে তোলে। আমরা এখানে CSV ফাইল থেকে ডেটা পড়া, প্রক্রিয়া করা, এবং ডাটাবেসে লেখা এর একটি ব্যাচ কাজ তৈরি করেছি। স্প্রিং বুটের সাহায্যে স্প্রিং ব্যাচ কনফিগারেশন সহজ হয় এবং এটি আপনার ব্যাচ প্রসেসিং অ্যাপ্লিকেশনকে দ্রুত ডিপ্লয় এবং পরিচালনা করার সুযোগ দেয়।