Spring Batch একটি শক্তিশালী ব্যাচ প্রসেসিং ফ্রেমওয়ার্ক যা ব্যাচ প্রসেসিংয়ের জন্য খুবই উপকারী, বিশেষ করে বড় ডেটাসেট ম্যানেজ এবং প্রসেসিং করতে। কখনো কখনো আপনাকে REST API থেকে ডেটা পড়তে হতে পারে এবং তারপর সেই ডেটাকে Spring Batch ব্যবহার করে প্রক্রিয়া (process) করতে হতে পারে। এই ধরনের ব্যবহারিক কেসে, ItemReader কে কাস্টমাইজ করে REST API থেকে ডেটা ফেচ করা যেতে পারে এবং সেই ডেটাকে ItemProcessor এবং ItemWriter এর মাধ্যমে প্রক্রিয়া এবং লেখার কাজ করা যেতে পারে।
এখানে আমরা দেখব কিভাবে REST API থেকে ডেটা রিড করে এবং Spring Batch এর মাধ্যমে সেই ডেটা প্রক্রিয়া করা যায়।
REST API থেকে ডেটা পড়া
Spring Batch এ REST API থেকে ডেটা পড়ার জন্য আপনি ItemReader কাস্টমাইজ করতে পারেন। RestTemplate অথবা WebClient ব্যবহার করে REST API থেকে ডেটা ফেচ করা যেতে পারে। নিচে RestTemplate ব্যবহার করে API থেকে ডেটা রিড করার একটি উদাহরণ দেখানো হলো।
1. Maven ডিপেনডেন্সি
Spring Batch এবং REST API থেকে ডেটা পড়ার জন্য spring-boot-starter-web এবং spring-boot-starter-batch ডিপেনডেন্সি প্রয়োজন।
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Step-by-Step গাইড
2. REST API ItemReader তৈরি করা
এখানে ItemReader কাস্টমাইজ করা হয়েছে RestTemplate ব্যবহার করে REST API থেকে ডেটা পড়ার জন্য। আমরা একটি সাধারণ API থেকে ডেটা ফেচ করবো যেখানে কিছু Employee তথ্য রিটার্ন হয়।
package com.example.demo;
import org.springframework.batch.item.ItemReader;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import java.util.Arrays;
import java.util.List;
@Component
public class EmployeeItemReader implements ItemReader<Employee> {
private final String apiUrl = "https://api.example.com/employees";
private int currentIndex = 0;
private List<Employee> employees;
private final RestTemplate restTemplate = new RestTemplate();
@Override
public Employee read() throws Exception {
if (employees == null || currentIndex >= employees.size()) {
// Fetch new data from REST API
employees = Arrays.asList(restTemplate.getForObject(apiUrl, Employee[].class));
currentIndex = 0; // Reset index
}
if (currentIndex < employees.size()) {
return employees.get(currentIndex++);
} else {
return null; // End of data
}
}
}
এখানে, EmployeeItemReader একটি REST API থেকে Employee তথ্য পড়ছে। RestTemplate ব্যবহার করে API থেকে ডেটা ফেচ করা হয়েছে এবং সেগুলো একটি List হিসেবে সংরক্ষিত করা হচ্ছে। প্রতিবার read() মেথড কল হওয়ার পর, এটি পরবর্তী Employee অবজেক্ট রিটার্ন করে। যখন ডেটা শেষ হয়ে যায়, তখন null রিটার্ন করা হয়।
3. ItemProcessor তৈরি করা
এখন, একটি ItemProcessor তৈরি করা হবে যা API থেকে পাওয়া ডেটাকে প্রসেস করবে। উদাহরণস্বরূপ, আমরা Employee এর নাম পরিবর্তন করতে পারি।
package com.example.demo;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.stereotype.Component;
@Component
public class EmployeeItemProcessor implements ItemProcessor<Employee, Employee> {
@Override
public Employee process(Employee employee) throws Exception {
// প্রসেসিং (যেমন নাম পরিবর্তন)
String updatedName = employee.getFirstName() + " " + employee.getLastName();
employee.setFullName(updatedName); // নতুন নাম সেট করা
return employee;
}
}
এখানে, EmployeeItemProcessor ক্লাসে, process() মেথডে Employee অবজেক্টের প্রথম নাম এবং শেষ নাম মিলিয়ে নতুন একটি fullName তৈরি করা হচ্ছে।
4. ItemWriter তৈরি করা
অবশেষে, ItemWriter তৈরি করা হবে যা প্রসেস করা ডেটাকে আউটপুটে (যেমন ডাটাবেসে বা ফাইলে) লিখবে।
package com.example.demo;
import org.springframework.batch.item.ItemWriter;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class EmployeeItemWriter implements ItemWriter<Employee> {
@Override
public void write(List<? extends Employee> items) throws Exception {
// এখানে, উদাহরণস্বরূপ কনসোলে আউটপুট করা হচ্ছে
items.forEach(item -> System.out.println(item.getFullName()));
}
}
এখানে, EmployeeItemWriter কনসোলে প্রতিটি Employee এর পূর্ণ নাম লিখছে। বাস্তবে, আপনি এই ডাটা একটি ডাটাবেস বা ফাইলে লিখতে পারেন।
5. Step কনফিগারেশন
এখন, Step কনফিগারেশন করা হবে যেখানে ItemReader, ItemProcessor, এবং ItemWriter ব্যবহার করা হবে।
package com.example.demo;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Bean
public Job job(JobBuilderFactory jobBuilderFactory, Step step1) {
return jobBuilderFactory.get("job")
.incrementer(new RunIdIncrementer())
.flow(step1) // Define step1
.end()
.build();
}
@Bean
public Step step1(StepBuilderFactory stepBuilderFactory,
EmployeeItemReader reader,
EmployeeItemProcessor processor,
EmployeeItemWriter writer) {
return stepBuilderFactory.get("step1")
.<Employee, Employee>chunk(10) // Define chunk size
.reader(reader)
.processor(processor)
.writer(writer)
.build();
}
}
এখানে, Step কনফিগারেশন এ ItemReader, ItemProcessor, এবং ItemWriter ইনজেক্ট করা হয়েছে, এবং chunk(10) দ্বারা প্রতিটি চাঙ্কে ১০টি আইটেম প্রক্রিয়া করা হবে।
6. JobRunner দিয়ে ব্যাচ জব চালানো
ব্যাচ জব চালানোর জন্য JobLauncher ব্যবহার করা হয়। এটি CommandLineRunner মাধ্যমে অ্যাপ্লিকেশন চালানোর সময় কার্যকর করা যেতে পারে।
package com.example.demo;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class JobRunner implements CommandLineRunner {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job job;
@Override
public void run(String... args) throws Exception {
jobLauncher.run(job, new JobParameters());
}
}
এখানে, JobLauncher দিয়ে job চালানো হচ্ছে এবং run() মেথড দিয়ে ব্যাচ জব কার্যকর করা হচ্ছে।
সারাংশ
Spring Batch এর মাধ্যমে REST API থেকে ডেটা পড়া এবং প্রক্রিয়া করা খুবই কার্যকরী। ItemReader কাস্টমাইজ করে REST API থেকে ডেটা ফেচ করা যায়, তারপর ItemProcessor এর মাধ্যমে সেই ডেটা প্রক্রিয়া করা হয় এবং ItemWriter এর মাধ্যমে আউটপুট দেওয়া হয়। Spring Batch এর এই ফিচার ব্যবহার করে আপনি বড় ডেটাসেট বা অনেকগুলো আইটেমকে কার্যকরভাবে প্রক্রিয়া এবং পরিচালনা করতে পারেন।
Read more