Spring Batch ফ্রেমওয়ার্কে, Job কনফিগারেশন একটি গুরুত্বপূর্ণ অংশ যা ব্যাচ প্রসেসিং এর মাধ্যমে ডেটার বড় সেটগুলি প্রসেস করার জন্য ব্যবহৃত হয়। একটি Job একাধিক Steps নিয়ে গঠিত হয় এবং প্রতিটি Step একটি নির্দিষ্ট কাজ বা প্রক্রিয়া সম্পাদন করে। Spring Batch অ্যাপ্লিকেশন কনফিগারেশনে Job কনফিগারেশন সম্পূর্ণরূপে JobBuilderFactory এবং StepBuilderFactory এর মাধ্যমে করা হয়।
Spring Batch কনফিগারেশন দুটি প্রধান অংশে বিভক্ত:
Spring Batch এ একটি Job কনফিগার করতে কিছু ধাপ অনুসরণ করতে হয়:
Job এবং Step কনফিগারেশনে স্প্রিং বুট JobBuilderFactory এবং StepBuilderFactory এর মাধ্যমে কাজ করা হয়।
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
private DataSource dataSource;
@Bean
public Job importUserJob() {
return jobBuilderFactory.get("importUserJob")
.start(importUserStep())
.build();
}
@Bean
public Step importUserStep() {
return stepBuilderFactory.get("importUserStep")
.<User, User>chunk(10) // chunk size: 10 items per transaction
.reader(userItemReader())
.processor(userItemProcessor())
.writer(userItemWriter())
.build();
}
}
এখানে:
chunk(10)
দ্বারা প্রতিটি ট্রানজেকশন 10টি আইটেম নিয়ে কাজ করবে।@Bean
public ItemReader<User> userItemReader() {
return new FlatFileItemReaderBuilder<User>()
.name("userItemReader")
.resource(new ClassPathResource("users.csv"))
.delimited().names(new String[]{"firstName", "lastName"})
.targetType(User.class)
.build();
}
@Bean
public ItemProcessor<User, User> userItemProcessor() {
return user -> {
user.setFirstName(user.getFirstName().toUpperCase());
return user;
};
}
@Bean
public ItemWriter<User> userItemWriter() {
return new JdbcBatchItemWriterBuilder<User>()
.dataSource(dataSource)
.sql("INSERT INTO users (first_name, last_name) VALUES (:firstName, :lastName)")
.beanMapped()
.build();
}
User
অবজেক্টে ম্যাপ করবে।firstName
ফিল্ডকে বড় হাতের অক্ষরে পরিবর্তন করবে।স্প্রিং বুটে JobLauncher ব্যবহার করে আপনি কোনো নির্দিষ্ট Job চালাতে পারেন এবং তার ফলাফল JobExecution এর মাধ্যমে জানতে পারেন।
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job importUserJob;
public void runJob() throws Exception {
JobExecution jobExecution = jobLauncher.run(importUserJob, new JobParameters());
System.out.println("Job Status : " + jobExecution.getStatus());
}
এখানে:
Spring Batch JobRepository ব্যবহার করে আপনি জবের স্টেট ট্র্যাক করতে পারেন, এবং এটি প্রতিটি স্টেপের মেটাডেটা সংরক্ষণ করে।
@Bean
public JobRepository jobRepository(DataSource dataSource) throws Exception {
JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
factory.setDataSource(dataSource);
factory.setTransactionManager(transactionManager());
factory.setDatabaseType("H2");
return factory.getObject();
}
এখানে:
স্প্রিং বুটে JobParameters এর মাধ্যমে আপনি ডাইনামিকভাবে Job চালাতে পারেন, যার মাধ্যমে বিভিন্ন প্যারামিটার হিসেবে ইনপুট প্রদান করা হয়।
JobParameters jobParameters = new JobParametersBuilder()
.addString("inputFile", "data.csv")
.toJobParameters();
jobLauncher.run(importUserJob, jobParameters);
এখানে:
Spring Batch Job Configuration একটি জটিল এবং শক্তিশালী কার্যক্ষমতা প্রদান করে যা ব্যাচ প্রসেসিংয়ের জন্য প্রয়োজনীয় সমস্ত কনফিগারেশন ও টুল সরবরাহ করে। Job, Step, ItemReader, ItemProcessor, এবং ItemWriter এর মাধ্যমে আপনি খুব সহজে ডেটা রিড, প্রক্রিয়া এবং রাইট করতে পারেন। Spring Batch আপনাকে স্কেলেবিলিটি, পুনরায় চালানোর সুবিধা, এবং ট্রানজেকশন ম্যানেজমেন্ট প্রদান করে, যা বড় পরিসরে ডেটা প্রসেসিংয়ের জন্য অত্যন্ত কার্যকর।
Spring Batch একটি শক্তিশালী ফ্রেমওয়ার্ক যা বড় আকারের ডেটা প্রক্রিয়া (batch processing) করার জন্য ব্যবহৃত হয়। Job Spring Batch-এ একটি কেন্দ্রীয় কনসেপ্ট, যা একটি বা একাধিক Step এর মাধ্যমে ডেটা প্রক্রিয়া সম্পন্ন করে। Job হলো এক ধরনের কাজ যা ডেটা এক্সট্র্যাকশন, ট্রান্সফরমেশন এবং লোডিং (ETL) কার্যক্রম সম্পাদন করতে ব্যবহৃত হয়।
Job হলো একটি টাস্ক যা বিভিন্ন কাজ বা Step নিয়ে গঠিত। প্রতিটি Step ডেটা প্রক্রিয়া বা কোনো নির্দিষ্ট কাজ সম্পাদন করে। Job এ কয়েকটি Step থাকতে পারে এবং প্রতিটি Step তার নিজস্ব কাজ (যেমন, ডেটা রিড, প্রসেস, বা রাইট) সম্পন্ন করে। Job সাধারণত একটি হাই-লেভেল প্রক্রিয়া, যা এর ভিতরে থাকা স্টেপগুলির কার্যকারিতা একত্রিত করে।
Spring Batch এ Job সাধারণত তিনটি মূল ধাপে কাজ করে:
ধরা যাক, আমাদের একটি Job তৈরি করতে হবে যা একটি CSV ফাইল থেকে ডেটা পড়ে, তা প্রসেস করে এবং ডেটাবেসে সেভ করে।
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
private DataSource dataSource;
@Bean
public FlatFileItemReader<User> reader() {
FlatFileItemReader<User> reader = new FlatFileItemReader<>();
reader.setResource(new ClassPathResource("users.csv"));
reader.setLineMapper(new DefaultLineMapper<User>() {{
setLineTokenizer(new DelimitedLineTokenizer() {{
setNames("id", "name", "email");
}});
setFieldSetMapper(new BeanWrapperFieldSetMapper<User>() {{
setTargetType(User.class);
}});
}});
return reader;
}
@Bean
public ItemProcessor<User, User> processor() {
return new UserItemProcessor();
}
@Bean
public ItemWriter<User> writer() {
return new JdbcBatchItemWriterBuilder<User>()
.dataSource(dataSource)
.sql("INSERT INTO user (id, name, email) VALUES (:id, :name, :email)")
.beanMapped()
.build();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.<User, User>chunk(10)
.reader(reader())
.processor(processor())
.writer(writer())
.build();
}
@Bean
public Job importUserJob() {
return jobBuilderFactory.get("importUserJob")
.incrementer(new RunIdIncrementer())
.flow(step1())
.end()
.build();
}
}
public class UserItemProcessor implements ItemProcessor<User, User> {
@Override
public User process(User item) throws Exception {
// নাম ক্যাপিটালাইজ করুন
item.setName(item.getName().toUpperCase());
return item;
}
}
public class User {
private Long id;
private String name;
private String email;
// Getters and Setters
}
1,John,john@example.com
2,Jane,jane@example.com
3,David,david@example.com
importUserJob
Job তৈরি হয় এবং এটি একটি Step এর মধ্যে চলবে (এখানে Step1)। Job Execution শুরু হয়।ItemReader
CSV ফাইল থেকে ডেটা রিড করে, ItemProcessor
ডেটাকে প্রসেস করে (নামকে ক্যাপিটালাইজ করে), এবং ItemWriter
ডেটাবেসে সেভ করে।Spring Batch Job একটি JobParameters অবজেক্ট গ্রহণ করে, যার মাধ্যমে Job এর কনফিগারেশন প্যারামিটার পাঠানো যায়। উদাহরণস্বরূপ, যদি Jobটি ফাইলের নাম বা কোনো ডেটাবেস টেবিলের নাম গ্রহণ করে, তাহলে সেগুলো JobParameters এর মাধ্যমে পাস করা হয়।
JobParameters jobParameters = new JobParametersBuilder()
.addString("sourceFile", "input.csv")
.toJobParameters();
jobLauncher.run(importUserJob, jobParameters);
Spring Batch এ Job একটি বা একাধিক Step এর মাধ্যমে এক বা একাধিক টাস্ক সম্পাদন করে। প্রতিটি Step ডেটা রিড, প্রসেস এবং রাইটের মতো নির্দিষ্ট কাজ সম্পন্ন করে। Spring Batch অত্যন্ত শক্তিশালী এবং কার্যকরী ফ্রেমওয়ার্ক যা বড় পরিমাণ ডেটা প্রসেস করতে ব্যবহৃত হয় এবং Job এবং Step গুলোর মাধ্যমে ডেটা ট্রান্সফরমেশন, লোডিং এবং এক্সট্র্যাকশনের কাজ সম্পাদন করা হয়। Spring Batch ব্যবহার করে ETL প্রসেস, ডেটা মাইগ্রেশন, রিপোর্টিং এবং বিলিং সিস্টেমের মতো কার্যক্রম সহজে এবং দক্ষতার সাথে সম্পাদন করা যায়।
স্প্রিং ব্যাচ (Spring Batch) একটি শক্তিশালী ফ্রেমওয়ার্ক যা বড় পরিমাণ ডাটা প্রসেসিংয়ের জন্য ব্যবহৃত হয়। এতে ব্যাচ প্রসেসের বিভিন্ন ধাপ এবং স্টেপ কনফিগার করার জন্য দুটি প্রধান কনফিগারেশন পদ্ধতি রয়েছে: XML কনফিগারেশন এবং Java-based কনফিগারেশন। স্প্রিং ব্যাচে XML এবং Java-based কনফিগারেশন দুটি নির্দিষ্ট ভাবে ব্যবহৃত হয়, এবং দুটি কনফিগারেশন স্টাইলই যথেষ্ট জনপ্রিয়।
এখানে আমরা এই দুই কনফিগারেশন পদ্ধতির ব্যবহার এবং তাদের পার্থক্য সম্পর্কে আলোচনা করব।
XML কনফিগারেশন স্প্রিং ব্যাচে সাধারণত applicationContext.xml
বা অন্যান্য XML কনফিগারেশন ফাইল ব্যবহার করা হয়। এই পদ্ধতিতে, আপনার সমস্ত ব্যাচ জব এবং স্টেপ কনফিগারেশন XML ফাইলের মাধ্যমে তৈরি হয়, এবং স্প্রিং কনটেইনার তা লোড করে অ্যাপ্লিকেশন চলাকালে। XML কনফিগারেশন পদ্ধতি স্প্রিং ফ্রেমওয়ার্কের পুরোনো প্রথা, যা এখনো অনেক প্রকল্পে ব্যবহৃত হয়।
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/batch
http://www.springframework.org/schema/batch/spring-batch-3.0.xsd">
<!-- JobLauncher -->
<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository"/>
</bean>
<!-- Job Repository -->
<bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- Job Configuration -->
<bean id="myJob" class="org.springframework.batch.core.job.SimpleJob">
<property name="name" value="myJob"/>
<property name="steps">
<list>
<ref bean="step1"/>
<ref bean="step2"/>
</list>
</property>
</bean>
<!-- Step Configuration -->
<bean id="step1" class="org.springframework.batch.core.step.tasklet.TaskletStep">
<property name="tasklet" ref="tasklet1"/>
</bean>
<bean id="step2" class="org.springframework.batch.core.step.tasklet.TaskletStep">
<property name="tasklet" ref="tasklet2"/>
</bean>
<!-- Tasklet Configuration -->
<bean id="tasklet1" class="org.springframework.batch.core.step.tasklet.MethodInvokingTaskletAdapter">
<property name="targetObject" ref="myTasklet"/>
<property name="targetMethod" value="execute"/>
</bean>
<!-- DataSource -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="url" value="jdbc:h2:mem:testdb"/>
<property name="driverClassName" value="org.h2.Driver"/>
<property name="username" value="sa"/>
<property name="password" value="password"/>
</bean>
</beans>
এখানে, XML কনফিগারেশন এ Job
, Step
, এবং Tasklet
কনফিগার করা হয়েছে, যা ব্যাচ প্রসেসিংয়ের ধাপগুলিকে সংজ্ঞায়িত করে। একাধিক স্টেপের মাধ্যমে একটি জব কনফিগার করা হয়েছে এবং ব্যাচ প্রসেসিং সম্পন্ন হয়।
Java-based কনফিগারেশন পদ্ধতি স্প্রিং ব্যাচে অধিক আধুনিক এবং ফ্লেক্সিবল। এখানে সমস্ত ব্যাচ জব এবং স্টেপ কনফিগারেশন Java কোডে করা হয়, সাধারণত স্প্রিং JavaConfig ব্যবহার করে। এই পদ্ধতি অনেক বেশি ইন্টারঅ্যাকটিভ এবং অ্যানোটেশন ভিত্তিক, যেটি বিশেষত কমপ্লেক্স কনফিগারেশন এ সহজতার জন্য আদর্শ।
import org.springframework.batch.core.Job;
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.launch.JobLauncher;
import org.springframework.batch.core.repository.JobRepository;
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 myJob() {
return jobBuilderFactory.get("myJob")
.start(step1())
.next(step2())
.build();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.tasklet((contribution, chunkContext) -> {
System.out.println("Executing Step 1");
return null;
})
.build();
}
@Bean
public Step step2() {
return stepBuilderFactory.get("step2")
.tasklet((contribution, chunkContext) -> {
System.out.println("Executing Step 2");
return null;
})
.build();
}
}
এখানে, Java-based কনফিগারেশন পদ্ধতিতে Job
এবং Step
গুলি স্প্রিং @Configuration
ক্লাসের মাধ্যমে কনফিগার করা হয়েছে। এটি খুবই ফ্লেক্সিবল এবং কাস্টমাইজেশন সহজ করে।
বৈশিষ্ট্য | XML-based Configuration | Java-based Configuration |
---|---|---|
কনফিগারেশন স্টাইল | XML ফাইল ব্যবহার করা হয় | Java কোডের মধ্যে কনফিগারেশন করা হয় |
ফ্লেক্সিবিলিটি | তুলনামূলকভাবে কম | অনেক বেশি ফ্লেক্সিবল |
প্রত্যাহারের সহজতা | XML ফাইলের মাধ্যমে সহজ | কোডের মাধ্যমে আরো সহজ এবং ডিবাগযোগ্য |
টাইপ সেফটি | সাধারণত কম | টাইপ সেফ এবং IDE সাপোর্ট রয়েছে |
কাস্টমাইজেশন | XML কনফিগারেশন অনুযায়ী | কোডে কাস্টম লজিক প্রয়োগ করা যায় |
স্প্রিং ব্যাচে XML-based এবং Java-based কনফিগারেশন উভয় পদ্ধতি ব্যবহৃত হয়। XML-based কনফিগারেশন একটি দীর্ঘ সময়ের জন্য ব্যবহৃত হলেও, Java-based কনফিগারেশন বেশি আধুনিক এবং আরো ফ্লেক্সিবল। Java-based কনফিগারেশন স্প্রিং অ্যাপ্লিকেশনের কোডিং প্রক্রিয়াকে আরো পরিষ্কার, টাইপ সেফ এবং ডিবাগযোগ্য করে তোলে। দুইটি পদ্ধতিই স্প্রিং ব্যাচের শক্তিশালী কাজের জন্য যথেষ্ট কার্যকর, তবে আপনার প্রজেক্টের প্রয়োজন অনুযায়ী আপনি একটি বেছে নিতে পারেন।
স্প্রিং ব্যাচ (Spring Batch) একটি শক্তিশালী ফ্রেমওয়ার্ক যা ব্যাচ প্রসেসিংয়ের জন্য ব্যবহৃত হয়। এর মাধ্যমে আমরা একটি বা একাধিক স্টেপে কাজ করতে পারি এবং প্রতিটি কাজের মধ্যে প্রক্রিয়া নির্ধারণ করতে পারি। এই প্রক্রিয়াগুলোর মধ্যে Job Parameters এবং JobExecutionContext দুটি গুরুত্বপূর্ণ উপাদান, যা ব্যাচ প্রসেসের মধ্যে ডেটা শেয়ার এবং কনফিগারেশন পরিচালনা করতে সাহায্য করে। এই দুটি উপাদানকে স্পষ্টভাবে বোঝা গেলে ব্যাচ প্রোসেসিং আরও কার্যকরী এবং নিয়ন্ত্রিত করা যায়।
Job Parameters হল সেই ভ্যালু যা একটি স্প্রিং ব্যাচ জব চালানোর সময় পাস করা হয়। এগুলি সাধারণত ইনপুট হিসাবে ব্যবহার করা হয় এবং ব্যাচ জবের execution শুরু করার সময় বিভিন্ন প্রপার্টি বা কনফিগারেশন ভ্যালু হিসাবে প্রেরণ করা হয়। Job Parameters এর মাধ্যমে আমরা বিভিন্ন ধরনের ইনপুট কনফিগারেশন বা তথ্য জব এক্সিকিউশন শুরু করার আগে সেট করতে পারি, যেমন— ডেটা ফাইলের লোকেশন, ডেটাবেস কানেকশন ডিটেইলস, সময় বা নির্দিষ্ট কোনও কাস্টম প্যারামিটার।
স্প্রিং ব্যাচে Job Parameters ব্যবহার করতে হলে, এগুলোকে JobLauncher
এর মাধ্যমে জবকে রান করার সময় পাস করতে হয়। এখানে একটি উদাহরণ দেয়া হলো:
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class BatchJobRunner {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job myJob;
public void runJob() throws Exception {
// Creating job parameters
JobParameters jobParameters = new JobParametersBuilder()
.addString("inputFile", "file:/data/input.csv")
.addLong("timestamp", System.currentTimeMillis())
.toJobParameters();
// Running the job with parameters
jobLauncher.run(myJob, jobParameters);
}
}
এখানে JobParametersBuilder
ব্যবহার করে একটি প্যারামিটার সেট তৈরি করা হয়েছে, যেখানে inputFile
এবং timestamp
দুটি প্যারামিটার নির্ধারণ করা হয়েছে।
JobExecutionContext হল একটি কনটেক্সট অবজেক্ট যা একটি Job এর execution চলাকালে বা শেষ হওয়ার পর ব্যাচ প্রসেসে প্রয়োজনীয় তথ্য বা অবস্থা (state) সংরক্ষণ করতে ব্যবহৃত হয়। এটি একটি জবের মধ্যে পারস্পরিক অবস্থা বা ডেটা শেয়ার করতে সাহায্য করে এবং এটি কেবল ব্যাচ প্রসেসের চলমান স্টেপগুলির মধ্যে ডেটা শেয়ার করতে ব্যবহৃত হয়।
JobExecutionContext-এর মাধ্যমে, আপনি একটি জবের execution এর সময় প্রয়োজনীয় intermediate ফলাফল বা স্টেট সংরক্ষণ করতে পারেন, যা পরবর্তী স্টেপে কাজে আসতে পারে। একে আপনি মূলত ডেটা ক্যাশিং বা অবস্থা ট্র্যাকিংয়ের জন্য ব্যবহার করতে পারেন।
যখন একটি জব execution হয়, তখন তার execution সম্পর্কিত বিভিন্ন তথ্য যেমন কাস্টম ডেটা বা inter-step data কে JobExecutionContext
এ সংরক্ষণ করা যায়।
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.StepExecutionListener;
import org.springframework.batch.core.annotation.BeforeStep;
public class MyStepListener implements StepExecutionListener {
@BeforeStep
public void beforeStep(StepExecution stepExecution) {
// Accessing JobExecutionContext for storing data
JobExecution jobExecution = stepExecution.getJobExecution();
jobExecution.getExecutionContext().put("processedRecords", 0);
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
// Retrieving data from JobExecutionContext after step
JobExecution jobExecution = stepExecution.getJobExecution();
Integer processedRecords = (Integer) jobExecution.getExecutionContext().get("processedRecords");
System.out.println("Total processed records: " + processedRecords);
return ExitStatus.COMPLETED;
}
}
এখানে JobExecutionContext
এর মধ্যে processedRecords
নামে একটি কাস্টম ডেটা স্টোর করা হচ্ছে, যা পরে afterStep
মেথডে পুনরায় ব্যবহার করা হচ্ছে।
বৈশিষ্ট্য | Job Parameters | JobExecutionContext |
---|---|---|
ব্যবহার | জব শুরু করার সময় ইনপুট হিসেবে ব্যবহৃত প্যারামিটার। | জব চলাকালে বা শেষে ডেটা বা স্টেট সংরক্ষণের জন্য ব্যবহৃত। |
লাইট-ওয়েট | হ্যাঁ, এটি সাধারণত স্ট্রিং এবং অন্যান্য প্রিমিটিভ টাইপ প্যারামিটার ধারণ করে। | এটি সাধারণত অবজেক্টগুলো ধারণ করে এবং জবের execution চলাকালীন তথ্য রাখে। |
ডেটার ধরন | স্ট্রিং, লং, ডাবল, ডেট টাইপ ডেটা। | কোনো ধরনের অবজেক্ট (যেমন, Integer, List, Map, ইত্যাদি)। |
কোন সময় ব্যবহার করা হয়? | জব রান করার সময় পাস করা হয়। | এক বা একাধিক স্টেপে ডেটা শেয়ার করতে ব্যবহৃত হয়। |
Job Parameters এবং JobExecutionContext দুটি অত্যন্ত গুরুত্বপূর্ণ উপাদান যা স্প্রিং ব্যাচে ব্যাচ প্রসেসিংকে আরো গতিশীল এবং কার্যকরী করে তোলে। Job Parameters ব্যবহার করে আপনি ব্যাচ জব চালানোর জন্য প্রয়োজনীয় ইনপুট প্যারামিটার পাস করতে পারেন, আর JobExecutionContext ব্যবহারের মাধ্যমে আপনি ব্যাচ জব চলাকালে বা শেষে স্টেট বা মধ্যবর্তী ডেটা সংরক্ষণ করতে পারেন। এই দুটি উপাদান ব্যাচ প্রোসেসিংয়ের নিয়ন্ত্রণ এবং ফলাফল ট্র্যাকিং সহজ করে তোলে।
স্প্রিং ব্যাচ (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
ডিপেনডেন্সি ডেটাবেস সংযোগের জন্য ব্যবহৃত হবে।
স্প্রিং ব্যাচে একটি Job তৈরি করতে, প্রথমে Step তৈরি করতে হয়। একটি Job একাধিক Step নিয়ে গঠিত হতে পারে, যেখানে প্রতিটি Step একটি নির্দিষ্ট কার্যক্রম সম্পাদন করে।
ধরা যাক আমরা একটি সিম্পল 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
ফিল্ড রয়েছে।
স্প্রিং ব্যাচে ItemReader, ItemProcessor, এবং ItemWriter ব্যবহার করে ব্যাচে ডেটা পড়া, প্রক্রিয়া করা এবং লেখা হয়।
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
ক্লাস ডেটা পড়ার জন্য একটি সিম্পল লিস্ট ব্যবহার করছে।
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
ক্লাস নামের প্রথম অক্ষরগুলো বড় করে দেয়।
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
কনসোল আউটপুটে ব্যবহারকারীর নাম লিখবে।
এখন, আমরা একটি 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(2)
ব্যবহার করেছি, অর্থাৎ প্রতি ২টি রেকর্ডে একটি ব্যাচ প্রক্রিয়া করা হবে।Job
কনফিগারেশন তৈরি করা হয়েছে, যা একটিই Step নিয়েছে।স্প্রিং বুট অ্যাপ্লিকেশন চালানোর জন্য মূল ক্লাস তৈরি করা:
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