স্প্রিং ব্যাচ (Spring Batch) ব্যাচ প্রসেসিংয়ের জন্য একটি শক্তিশালী ফ্রেমওয়ার্ক, যা ডেটা প্রসেসিং টাস্কগুলিকে ব্যাচ আকারে পরিচালনা করতে সহায়তা করে। যখন আমাদের ব্যাচ জব নির্দিষ্ট সময় পর পর চালানো প্রয়োজন হয়, তখন Batch Job Scheduling ব্যবহার করা হয়। এই প্রক্রিয়া স্বয়ংক্রিয়ভাবে একটি ব্যাচ জব নির্দিষ্ট সময়সীমার মধ্যে চালাতে সক্ষম হয়।
স্প্রিং ব্যাচের মাধ্যমে batch job scheduling পরিচালনা করতে আমরা সাধারণত Spring TaskScheduler বা Quartz Scheduler ব্যবহার করি। এখানে আমরা Spring TaskScheduler ব্যবহার করে একটি ব্যাচ জব সিডিউল করার উদাহরণ দেখব।
Batch Job Scheduling উদাহরণ
ধরা যাক, আমাদের একটি ব্যাচ জব রয়েছে, যা প্রতি দিন ১ ঘণ্টায় একবার চালাতে হবে। এই জবটি Employee টেবিল থেকে ডেটা রিড এবং প্রসেস করার কাজ করবে।
১. স্প্রিং ব্যাচ জব কনফিগারেশন
আমরা প্রথমে একটি সাধারণ ব্যাচ জব তৈরি করব, যা Employee টেবিল থেকে ডেটা রিড করবে এবং কিছু প্রসেসিং শেষে সেই ডেটা আপডেট করবে।
উদাহরণ: Employee Salary Update Job
import org.springframework.batch.core.Step;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
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 updateEmployeeSalaryJob() {
return jobBuilderFactory.get("updateEmployeeSalaryJob")
.start(processEmployeeSalaryStep())
.build();
}
@Bean
public Step processEmployeeSalaryStep() {
return stepBuilderFactory.get("processEmployeeSalaryStep")
.<Employee, Employee>chunk(10)
.reader(reader(null)) // Reader: JdbcCursorItemReader
.processor(new EmployeeSalaryProcessor()) // Processor: EmployeeSalaryProcessor
.writer(writer(null)) // Writer: JdbcBatchItemWriter
.build();
}
}
এখানে, updateEmployeeSalaryJob নামক একটি জব তৈরি করা হয়েছে, যা processEmployeeSalaryStep নামক স্টেপ থেকে ডেটা রিড এবং প্রসেস করবে।
২. স্প্রিং টাস্ক সিডিউলার ব্যবহার করা
এখন, TaskScheduler ব্যবহার করে প্রতি ঘণ্টায় একবার ব্যাচ জব চালানোর জন্য কনফিগারেশন করা হবে।
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.Job;
import org.springframework.stereotype.Component;
@Component
@EnableScheduling
public class JobScheduler {
private final JobLauncher jobLauncher;
private final Job updateEmployeeSalaryJob;
public JobScheduler(JobLauncher jobLauncher, Job updateEmployeeSalaryJob) {
this.jobLauncher = jobLauncher;
this.updateEmployeeSalaryJob = updateEmployeeSalaryJob;
}
@Scheduled(cron = "0 0 * * * ?") // প্রতি ঘণ্টায় একবার
public void runJob() {
try {
jobLauncher.run(updateEmployeeSalaryJob, new JobParameters());
} catch (Exception e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- @EnableScheduling অ্যানোটেশনটি স্প্রিং কনটেক্সটে সিডিউলিং সক্ষম করে।
- @Scheduled(cron = "0 0 * * * ?") এই ক্রন এক্সপ্রেশনটি প্রতি ঘণ্টায় একবার ব্যাচ জব চালানোর জন্য ব্যবহৃত হয়। এখানে
0 0 * * * ?মানে প্রতি ঘণ্টার শুরুর সময়। - jobLauncher.run(updateEmployeeSalaryJob, new JobParameters()) এটি ব্যাচ জব রান করার কোড, যা স্প্রিং ব্যাচে ডিফাইন করা জবকে নির্দিষ্ট সময়সীমায় চালায়।
৩. স্প্রিং কনফিগারেশন (ApplicationConfig)
এখন, স্প্রিং কনফিগারেশন ফাইলে সিডিউলার এবং ব্যাচ প্রসেসিংয়ের জন্য প্রয়োজনীয় কনফিগারেশন এবং টাস্ক সিডিউলার সেট আপ করা হবে।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.launch.support.SimpleJobLauncher;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.context.annotation.ComponentScan;
import javax.sql.DataSource;
@Configuration
@EnableBatchProcessing
@EnableScheduling
@ComponentScan(basePackages = "com.example.batch")
public class BatchApplicationConfig {
@Bean
public JobLauncher jobLauncher(JobRepository jobRepository) {
SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
jobLauncher.setJobRepository(jobRepository);
return jobLauncher;
}
@Bean
public JobRepository jobRepository(DataSource dataSource) throws Exception {
MapJobRepositoryFactoryBean factory = new MapJobRepositoryFactoryBean();
factory.setDataSource(dataSource);
return factory.getObject();
}
@Bean
public JobBuilderFactory jobBuilderFactory(JobRepository jobRepository) {
return new JobBuilderFactory(jobRepository);
}
@Bean
public StepBuilderFactory stepBuilderFactory(JobRepository jobRepository) {
return new StepBuilderFactory(jobRepository, jobRepository.getTransactionManager());
}
}
এখানে, EnableBatchProcessing এবং EnableScheduling ব্যবহৃত হয়েছে, যা ব্যাচ প্রসেসিং এবং সিডিউলিং কার্যক্রম চালাবে। jobLauncher এবং jobRepository কে কনফিগার করা হয়েছে, যাতে স্প্রিং ব্যাচ কাজ করতে পারে।
সারাংশ
স্প্রিং ব্যাচের মাধ্যমে ব্যাচ জব সিডিউলিং খুব সহজেই করা যায়, বিশেষত Spring TaskScheduler বা Quartz Scheduler ব্যবহার করে। আমাদের উদাহরণে, আমরা @Scheduled অ্যানোটেশন ব্যবহার করে প্রতি ঘণ্টায় একবার ব্যাচ জব চালানোর কনফিগারেশন দেখেছি। এই পদ্ধতিতে স্প্রিং ব্যাচের ব্যাচ জবগুলো নির্দিষ্ট সময় পর পর বা নির্দিষ্ট ক্রনের মাধ্যমে রান করা যায়, যা আপনার ডেটা প্রসেসিং টাস্কগুলোকে স্বয়ংক্রিয়ভাবে পরিচালিত করতে সাহায্য করে।
Read more