Tasklet এবং Chunk-based Processing কি?
স্প্রিং ব্যাচে Tasklet এবং Chunk-based Processing হল দুটি প্রধান পদ্ধতি যা ব্যাচ প্রসেসিংয়ের জন্য ব্যবহৃত হয়। প্রতিটি পদ্ধতির নিজস্ব সুবিধা এবং উদ্দেশ্য রয়েছে, এবং এগুলো ডেটা প্রসেসিংয়ের জন্য বিভিন্ন ধরনের পরিস্থিতিতে উপযোগী।
- Tasklet: এটি একটি সাধারণ পদ্ধতি যেখানে একটি একক কাজ সম্পাদন করা হয়, যেমন একটি ডেটাবেস থেকে ডেটা ডিলিট করা বা ফাইল লেখার কাজ। একক কাজের জন্য খুবই উপযোগী।
- Chunk-based Processing: এটি ডেটার বৃহৎ সেট নিয়ে কাজ করার জন্য ব্যবহৃত হয়, যেখানে ডেটাকে ছোট ছোট অংশে (chunk) ভাগ করা হয় এবং সেগুলো ব্যাচে প্রসেস করা হয়। এটি বড় ডেটাসেটের জন্য কার্যকরী।
স্প্রিং ব্যাচে এই দুটি পদ্ধতি একত্রে ব্যবহার করা যেতে পারে অথবা পৃথকভাবে প্রয়োগ করা যেতে পারে, ডেটার পরিমাণ এবং কাজের ধরণের উপর নির্ভর করে।
Tasklet
Tasklet হল একটি সাধারণ একক কাজ যা একটি Step হিসেবে কাজ করে। যখন একটি Step কেবল একটি নির্দিষ্ট একক কাজ সম্পাদন করবে, তখন Tasklet ব্যবহার করা হয়। এটি সাধারণত কোনো একক রেকর্ড, ফাইল অপারেশন, বা ডেটাবেসে আপডেট করার জন্য ব্যবহৃত হয়।
Tasklet এর কাঠামো
Tasklet হল একটি ইন্টারফেস, এবং এটি সাধারণত execute() মেথডকে অতিক্রম করে, যেখানে কাজটি বাস্তবায়িত হয়।
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.stereotype.Component;
@Component
public class MyTasklet implements Tasklet {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
// Tasklet logic goes here
System.out.println("Tasklet executed");
return RepeatStatus.FINISHED; // Indicates the task is completed
}
}
এখানে RepeatStatus.FINISHED নির্দেশ করে যে কাজটি শেষ হয়েছে। আপনি চাইলে RepeatStatus.CONTINUABLE ব্যবহার করে কাজ পুনরায় চালু করার জন্য নির্দেশ দিতে পারেন।
Tasklet ব্যবহার করে Step তৈরি করা
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.flow.FlowExecutionStatus;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.core.Job;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BatchConfig {
@Bean
public Job job(JobBuilderFactory jobBuilderFactory, Step step) {
return jobBuilderFactory.get("job")
.incrementer(new RunIdIncrementer())
.start(step)
.build();
}
@Bean
public Step step(StepBuilderFactory stepBuilderFactory, MyTasklet tasklet) {
return stepBuilderFactory.get("step")
.tasklet(tasklet)
.build();
}
}
এখানে, MyTasklet নামক Tasklet ক্লাস ব্যবহার করা হয়েছে এবং সেটি Step হিসাবে কনফিগার করা হয়েছে। এরপর সেটি একটি Job এর অংশ হিসেবে যুক্ত করা হয়েছে।
Chunk-based Processing
Chunk-based Processing একটি অত্যন্ত জনপ্রিয় পদ্ধতি যা ব্যাচ ডেটা প্রসেসিংয়ে ব্যবহৃত হয়। এই পদ্ধতিতে ডেটা ছোট ছোট অংশে (chunks) ভাগ করা হয় এবং প্রতিটি chunk আলাদাভাবে প্রসেস করা হয়। একটি chunk-এ নির্দিষ্ট সংখ্যক আইটেম (যেমন, ১০০, ১০০০ ইত্যাদি) নিয়ে কাজ করা হয়। যখন একটি chunk প্রসেস হয়, তখন সমস্ত আইটেম একসাথে write করা হয়।
Chunk-based Processing এর কাঠামো
Chunk-based Processing ব্যবহারের জন্য আপনাকে ItemReader, ItemProcessor, এবং ItemWriter এর সাহায্য নিতে হবে। এই তিনটি কম্পোনেন্টের মাধ্যমে ডেটা পড়ে, প্রক্রিয়া করে এবং লেখার কাজ করা হয়।
- ItemReader: এটি ডেটা পড়ার জন্য ব্যবহৃত হয়।
- ItemProcessor: এটি ডেটাকে প্রসেস করার জন্য ব্যবহৃত হয়।
- ItemWriter: এটি প্রক্রিয়াজাত ডেটা লেখার জন্য ব্যবহৃত হয়।
উদাহরণ: Chunk-based Processing
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.support.RunIdIncrementer;
import org.springframework.batch.core.Job;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BatchConfig {
@Bean
public Job job(JobBuilderFactory jobBuilderFactory, Step chunkStep) {
return jobBuilderFactory.get("chunkJob")
.incrementer(new RunIdIncrementer())
.start(chunkStep)
.build();
}
@Bean
public Step chunkStep(StepBuilderFactory stepBuilderFactory, ItemReader<String> reader,
ItemProcessor<String, String> processor, ItemWriter<String> writer) {
return stepBuilderFactory.get("chunkStep")
.<String, String>chunk(10) // Process 10 items at a time
.reader(reader)
.processor(processor)
.writer(writer)
.build();
}
@Bean
public ItemReader<String> reader() {
return new MyItemReader(); // Custom reader
}
@Bean
public ItemProcessor<String, String> processor() {
return new MyItemProcessor(); // Custom processor
}
@Bean
public ItemWriter<String> writer() {
return new MyItemWriter(); // Custom writer
}
}
এখানে, একটি Step তৈরি করা হয়েছে যেখানে ১০টি আইটেম একসাথে প্রক্রিয়া করা হচ্ছে (chunk(10) এর মাধ্যমে)। ItemReader, ItemProcessor, এবং ItemWriter এ কাস্টম ক্লাস ব্যবহার করা হয়েছে।
ItemReader, ItemProcessor, এবং ItemWriter উদাহরণ
ItemReader:
import org.springframework.batch.item.ItemReader;
public class MyItemReader implements ItemReader<String> {
private String[] data = {"Item1", "Item2", "Item3", "Item4", "Item5"};
private int count = 0;
@Override
public String read() throws Exception {
if (count < data.length) {
return data[count++];
} else {
return null; // End of data
}
}
}
ItemProcessor:
import org.springframework.batch.item.ItemProcessor;
public class MyItemProcessor implements ItemProcessor<String, String> {
@Override
public String process(String item) throws Exception {
return item.toUpperCase(); // Converts each item to uppercase
}
}
ItemWriter:
import org.springframework.batch.item.ItemWriter;
public class MyItemWriter implements ItemWriter<String> {
@Override
public void write(List<? extends String> items) throws Exception {
for (String item : items) {
System.out.println("Writing item: " + item);
}
}
}
এখানে, MyItemReader ডেটা পড়ছে, MyItemProcessor আইটেমগুলোকে uppercase করছে এবং MyItemWriter সেগুলোকে আউটপুটে লিখছে।
Tasklet এবং Chunk-based Processing এর মধ্যে পার্থক্য
| Feature | Tasklet | Chunk-based Processing |
|---|---|---|
| Complexity | Simple (one task per Step) | Complex (multiple items processed per chunk) |
| Data Handling | One-time task (no chunking) | Multiple items in chunks |
| Use Case | Small tasks (file operations, single record processing) | Large datasets, database updates, ETL processes |
| Performance | Suitable for small tasks | Better for large datasets with transactions |
সারাংশ
স্প্রিং ব্যাচে Tasklet এবং Chunk-based Processing দুটি ভিন্ন পদ্ধতি, যার মাধ্যমে বিভিন্ন ধরনের ব্যাচ প্রসেসিং কার্যক্রম সম্পাদন করা যায়। Tasklet সাধারণত ছোট এবং একক কাজের জন্য ব্যবহৃত হয়, যখন Chunk-based Processing বড় ডেটাসেটের জন্য এবং ডেটার ব্যাচ প্রসেসিংয়ের জন্য ব্যবহৃত হয়। Chunk-based Processing ডেটাকে ছোট ছোট অংশে ভাগ করে এবং প্রতিটি অংশকে প্রসেস করে, যা বড় আকারের ডেটা প্রসেসিংয়ে কার্যকরী।
Tasklet এবং Chunk-based Processing কি?
স্প্রিং ব্যাচে Tasklet এবং Chunk-based Processing হল দুটি প্রধান পদ্ধতি যা ব্যাচ প্রসেসিংয়ের জন্য ব্যবহৃত হয়। প্রতিটি পদ্ধতির নিজস্ব সুবিধা এবং উদ্দেশ্য রয়েছে, এবং এগুলো ডেটা প্রসেসিংয়ের জন্য বিভিন্ন ধরনের পরিস্থিতিতে উপযোগী।
- Tasklet: এটি একটি সাধারণ পদ্ধতি যেখানে একটি একক কাজ সম্পাদন করা হয়, যেমন একটি ডেটাবেস থেকে ডেটা ডিলিট করা বা ফাইল লেখার কাজ। একক কাজের জন্য খুবই উপযোগী।
- Chunk-based Processing: এটি ডেটার বৃহৎ সেট নিয়ে কাজ করার জন্য ব্যবহৃত হয়, যেখানে ডেটাকে ছোট ছোট অংশে (chunk) ভাগ করা হয় এবং সেগুলো ব্যাচে প্রসেস করা হয়। এটি বড় ডেটাসেটের জন্য কার্যকরী।
স্প্রিং ব্যাচে এই দুটি পদ্ধতি একত্রে ব্যবহার করা যেতে পারে অথবা পৃথকভাবে প্রয়োগ করা যেতে পারে, ডেটার পরিমাণ এবং কাজের ধরণের উপর নির্ভর করে।
Tasklet
Tasklet হল একটি সাধারণ একক কাজ যা একটি Step হিসেবে কাজ করে। যখন একটি Step কেবল একটি নির্দিষ্ট একক কাজ সম্পাদন করবে, তখন Tasklet ব্যবহার করা হয়। এটি সাধারণত কোনো একক রেকর্ড, ফাইল অপারেশন, বা ডেটাবেসে আপডেট করার জন্য ব্যবহৃত হয়।
Tasklet এর কাঠামো
Tasklet হল একটি ইন্টারফেস, এবং এটি সাধারণত execute() মেথডকে অতিক্রম করে, যেখানে কাজটি বাস্তবায়িত হয়।
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.stereotype.Component;
@Component
public class MyTasklet implements Tasklet {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
// Tasklet logic goes here
System.out.println("Tasklet executed");
return RepeatStatus.FINISHED; // Indicates the task is completed
}
}
এখানে RepeatStatus.FINISHED নির্দেশ করে যে কাজটি শেষ হয়েছে। আপনি চাইলে RepeatStatus.CONTINUABLE ব্যবহার করে কাজ পুনরায় চালু করার জন্য নির্দেশ দিতে পারেন।
Tasklet ব্যবহার করে Step তৈরি করা
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.flow.FlowExecutionStatus;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.core.Job;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BatchConfig {
@Bean
public Job job(JobBuilderFactory jobBuilderFactory, Step step) {
return jobBuilderFactory.get("job")
.incrementer(new RunIdIncrementer())
.start(step)
.build();
}
@Bean
public Step step(StepBuilderFactory stepBuilderFactory, MyTasklet tasklet) {
return stepBuilderFactory.get("step")
.tasklet(tasklet)
.build();
}
}
এখানে, MyTasklet নামক Tasklet ক্লাস ব্যবহার করা হয়েছে এবং সেটি Step হিসাবে কনফিগার করা হয়েছে। এরপর সেটি একটি Job এর অংশ হিসেবে যুক্ত করা হয়েছে।
Chunk-based Processing
Chunk-based Processing একটি অত্যন্ত জনপ্রিয় পদ্ধতি যা ব্যাচ ডেটা প্রসেসিংয়ে ব্যবহৃত হয়। এই পদ্ধতিতে ডেটা ছোট ছোট অংশে (chunks) ভাগ করা হয় এবং প্রতিটি chunk আলাদাভাবে প্রসেস করা হয়। একটি chunk-এ নির্দিষ্ট সংখ্যক আইটেম (যেমন, ১০০, ১০০০ ইত্যাদি) নিয়ে কাজ করা হয়। যখন একটি chunk প্রসেস হয়, তখন সমস্ত আইটেম একসাথে write করা হয়।
Chunk-based Processing এর কাঠামো
Chunk-based Processing ব্যবহারের জন্য আপনাকে ItemReader, ItemProcessor, এবং ItemWriter এর সাহায্য নিতে হবে। এই তিনটি কম্পোনেন্টের মাধ্যমে ডেটা পড়ে, প্রক্রিয়া করে এবং লেখার কাজ করা হয়।
- ItemReader: এটি ডেটা পড়ার জন্য ব্যবহৃত হয়।
- ItemProcessor: এটি ডেটাকে প্রসেস করার জন্য ব্যবহৃত হয়।
- ItemWriter: এটি প্রক্রিয়াজাত ডেটা লেখার জন্য ব্যবহৃত হয়।
উদাহরণ: Chunk-based Processing
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.support.RunIdIncrementer;
import org.springframework.batch.core.Job;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BatchConfig {
@Bean
public Job job(JobBuilderFactory jobBuilderFactory, Step chunkStep) {
return jobBuilderFactory.get("chunkJob")
.incrementer(new RunIdIncrementer())
.start(chunkStep)
.build();
}
@Bean
public Step chunkStep(StepBuilderFactory stepBuilderFactory, ItemReader<String> reader,
ItemProcessor<String, String> processor, ItemWriter<String> writer) {
return stepBuilderFactory.get("chunkStep")
.<String, String>chunk(10) // Process 10 items at a time
.reader(reader)
.processor(processor)
.writer(writer)
.build();
}
@Bean
public ItemReader<String> reader() {
return new MyItemReader(); // Custom reader
}
@Bean
public ItemProcessor<String, String> processor() {
return new MyItemProcessor(); // Custom processor
}
@Bean
public ItemWriter<String> writer() {
return new MyItemWriter(); // Custom writer
}
}
এখানে, একটি Step তৈরি করা হয়েছে যেখানে ১০টি আইটেম একসাথে প্রক্রিয়া করা হচ্ছে (chunk(10) এর মাধ্যমে)। ItemReader, ItemProcessor, এবং ItemWriter এ কাস্টম ক্লাস ব্যবহার করা হয়েছে।
ItemReader, ItemProcessor, এবং ItemWriter উদাহরণ
ItemReader:
import org.springframework.batch.item.ItemReader;
public class MyItemReader implements ItemReader<String> {
private String[] data = {"Item1", "Item2", "Item3", "Item4", "Item5"};
private int count = 0;
@Override
public String read() throws Exception {
if (count < data.length) {
return data[count++];
} else {
return null; // End of data
}
}
}
ItemProcessor:
import org.springframework.batch.item.ItemProcessor;
public class MyItemProcessor implements ItemProcessor<String, String> {
@Override
public String process(String item) throws Exception {
return item.toUpperCase(); // Converts each item to uppercase
}
}
ItemWriter:
import org.springframework.batch.item.ItemWriter;
public class MyItemWriter implements ItemWriter<String> {
@Override
public void write(List<? extends String> items) throws Exception {
for (String item : items) {
System.out.println("Writing item: " + item);
}
}
}
এখানে, MyItemReader ডেটা পড়ছে, MyItemProcessor আইটেমগুলোকে uppercase করছে এবং MyItemWriter সেগুলোকে আউটপুটে লিখছে।
Tasklet এবং Chunk-based Processing এর মধ্যে পার্থক্য
| Feature | Tasklet | Chunk-based Processing |
|---|---|---|
| Complexity | Simple (one task per Step) | Complex (multiple items processed per chunk) |
| Data Handling | One-time task (no chunking) | Multiple items in chunks |
| Use Case | Small tasks (file operations, single record processing) | Large datasets, database updates, ETL processes |
| Performance | Suitable for small tasks | Better for large datasets with transactions |
সারাংশ
স্প্রিং ব্যাচে Tasklet এবং Chunk-based Processing দুটি ভিন্ন পদ্ধতি, যার মাধ্যমে বিভিন্ন ধরনের ব্যাচ প্রসেসিং কার্যক্রম সম্পাদন করা যায়। Tasklet সাধারণত ছোট এবং একক কাজের জন্য ব্যবহৃত হয়, যখন Chunk-based Processing বড় ডেটাসেটের জন্য এবং ডেটার ব্যাচ প্রসেসিংয়ের জন্য ব্যবহৃত হয়। Chunk-based Processing ডেটাকে ছোট ছোট অংশে ভাগ করে এবং প্রতিটি অংশকে প্রসেস করে, যা বড় আকারের ডেটা প্রসেসিংয়ে কার্যকরী।
Spring Batch একটি শক্তিশালী ফ্রেমওয়ার্ক যা বড় পরিমাণ ডেটা প্রসেসিংয়ের জন্য ব্যবহৃত হয়। এর মধ্যে একটি গুরুত্বপূর্ণ উপাদান হল Tasklet Interface, যা একক কাজ বা প্রসেসিং ইউনিটের জন্য ব্যবহৃত হয়। Tasklet সাধারণত ছোট কাজ বা একক কাজগুলো সম্পাদন করে যেমন ডেটা সিঙ্ক্রোনাইজেশন, ফাইল কপি করা, ফাইলের মধ্যে ডেটা প্রক্রিয়াজাতকরণ ইত্যাদি। এটি একটি খুবই শক্তিশালী কৌশল যেটি ছোট, নির্দিষ্ট কাজগুলো বাস্তবায়ন করতে ব্যবহৃত হয়।
এই টিউটোরিয়ালে আমরা Tasklet Interface এবং Custom Tasklet তৈরি করার পদ্ধতি সম্পর্কে বিস্তারিত আলোচনা করব।
Tasklet Interface এর কাজ
Tasklet Interface Spring Batch এ একটি কাজ বা প্রসেসিং ইউনিট যা একক স্টেপে ছোট কাজগুলি সম্পাদন করে। এটি সাধারণত একটি নির্দিষ্ট কাজকে সম্পাদন করার জন্য ব্যবহৃত হয় এবং কাজটির অবস্থা RepeatStatus রিটার্ন করে, যা নির্দেশ করে কাজটি চলমান থাকবে, শেষ হবে বা বাতিল করা হবে।
Tasklet ইন্টারফেসের প্রধান মেথড হল:
RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception;
- StepContribution: এটি Step এর প্রসেসিং অবস্থার একটি অংশ, যা এই Step এর জন্য হালনাগাদ তথ্য প্রদান করে।
- ChunkContext: এটি Chunk ভিত্তিক প্রসেসিংয়ের জন্য ব্যবহার করা হয়, যেখানে প্রসেসিংয়ের সময়ে ডেটা বা স্টেট ফরম্যাট করা হয়।
- RepeatStatus: এটি নির্দেশ করে যে Taskletটি আরও একবার সম্পাদিত হবে কি না, বা শেষ হবে।
RepeatStatus এর দুটি মূল মান:
- RepeatStatus.FINISHED: কাজটি শেষ হয়ে গেছে এবং আর পুনরায় সম্পাদন করা হবে না।
- RepeatStatus.CONTINUABLE: কাজটি চলমান থাকবে এবং পরবর্তী চক্রে পুনরায় চালানো হবে।
Custom Tasklet তৈরি করা
Spring Batch এ একটি Custom Tasklet তৈরি করার জন্য আপনাকে Tasklet Interface ইমপ্লিমেন্ট করতে হবে। একটি কাস্টম Tasklet তৈরি করতে সাধারণত নিচের পদক্ষেপগুলি অনুসরণ করা হয়:
Taskletইন্টারফেস ইমপ্লিমেন্ট করা।execute()মেথডে আপনার নির্দিষ্ট কাজটি বাস্তবায়ন করা।- Step এর মধ্যে Tasklet ব্যবহার করা।
উদাহরণ: Custom Tasklet তৈরি
ধরা যাক, আমাদের একটি Tasklet তৈরি করতে হবে যা একটি ফাইলের ভিতর থেকে ডেটা পড়বে এবং সেটি কনসোলে প্রদর্শন করবে। এখানে আমরা একটি সাধারণ Custom Tasklet তৈরি করব যা একটি টেক্সট ফাইল থেকে পাঠ্য ডেটা পড়বে এবং কনসোলে প্রিন্ট করবে।
public class MyFileReadingTasklet implements Tasklet {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
// ফাইল পড়া
Path path = Paths.get("data.txt");
try (Stream<String> lines = Files.lines(path)) {
lines.forEach(System.out::println); // কনসোলে ফাইলের ডেটা প্রদর্শন
} catch (IOException e) {
e.printStackTrace();
}
return RepeatStatus.FINISHED; // কাজ শেষ
}
}
এখানে, MyFileReadingTasklet ক্লাস একটি টেক্সট ফাইল থেকে লাইন-by-লাইন ডেটা পড়ে এবং তা কনসোলে প্রিন্ট করে। কাজটি সম্পন্ন হলে RepeatStatus.FINISHED রিটার্ন করা হয়।
Step এর মধ্যে Custom Tasklet ব্যবহার করা
Spring Batch এর একটি Step এ Custom Tasklet ব্যবহার করতে আপনাকে StepBuilderFactory ব্যবহার করে একটি Step তৈরি করতে হবে এবং সেই Step এর মধ্যে Tasklet সেট করতে হবে।
উদাহরণ: Custom Tasklet কে Step এ ব্যবহার করা
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Job fileProcessingJob() {
return jobBuilderFactory.get("fileProcessingJob")
.start(fileProcessingStep()) // প্রথম Step
.build();
}
@Bean
public Step fileProcessingStep() {
return stepBuilderFactory.get("fileProcessingStep")
.tasklet(myFileReadingTasklet()) // Custom Tasklet
.build();
}
@Bean
public Tasklet myFileReadingTasklet() {
return new MyFileReadingTasklet(); // Custom Tasklet Bean
}
}
এখানে, fileProcessingJob() নামে একটি Job তৈরি করা হয়েছে, যার মধ্যে একটি Step (নাম fileProcessingStep) রয়েছে। এই Step এর মধ্যে আমরা আমাদের Custom Tasklet (MyFileReadingTasklet) ব্যবহার করেছি।
Tasklet এর ব্যবহার ক্ষেত্র
Tasklet সাধারণত সেসব কাজের জন্য ব্যবহার হয় যেখানে:
- একক কাজ বা ছোট স্ক্রিপ্ট প্রয়োজন হয়।
- ডেটা রিডিং বা রাইটিং এর কাজ করা হয়, যেমন ফাইল সিস্টেমে কনভার্সন বা ডেটা ম্যানিপুলেশন।
- কোনো নির্দিষ্ট টাস্ক (যেমন, ডেটাবেস মেইন্টেনেন্স, ফাইল কপি, ইত্যাদি) সম্পাদন করতে হবে।
- বড় পরিমাণ ডেটার পরিবর্তে ছোট ছোট কাজ করতে হবে।
সারাংশ
Spring Batch এ Tasklet Interface ছোট কাজ বা একক কাজ সম্পাদন করার জন্য ব্যবহৃত হয়। Tasklet একটি খুবই কার্যকরী উপাদান যা সাধারণত ছোট কাজগুলো, যেমন ফাইল প্রক্রিয়াকরণ বা ডেটাবেস সিঙ্ক্রোনাইজেশন, বাস্তবায়ন করতে ব্যবহৃত হয়। একটি Custom Tasklet তৈরি করতে হলে, আপনাকে Tasklet Interface ইমপ্লিমেন্ট করতে হবে এবং সেই Tasklet এর execute() মেথডে কাজের কার্যক্রম নির্ধারণ করতে হবে। Spring Batch এ Tasklet ব্যবহার করে একক কাজগুলো খুব সহজে সম্পাদন করা যায়, যা ব্যাচ প্রসেসিংয়ের অন্য স্টেপগুলির সাথে একত্রিত হয়ে কার্যকরীভাবে কাজ করতে পারে।
Spring Batch একটি শক্তিশালী ফ্রেমওয়ার্ক যা বড় পরিমাণ ডেটা প্রসেসিংয়ের জন্য ব্যবহৃত হয়। এর মধ্যে একটি গুরুত্বপূর্ণ উপাদান হল Tasklet Interface, যা একক কাজ বা প্রসেসিং ইউনিটের জন্য ব্যবহৃত হয়। Tasklet সাধারণত ছোট কাজ বা একক কাজগুলো সম্পাদন করে যেমন ডেটা সিঙ্ক্রোনাইজেশন, ফাইল কপি করা, ফাইলের মধ্যে ডেটা প্রক্রিয়াজাতকরণ ইত্যাদি। এটি একটি খুবই শক্তিশালী কৌশল যেটি ছোট, নির্দিষ্ট কাজগুলো বাস্তবায়ন করতে ব্যবহৃত হয়।
এই টিউটোরিয়ালে আমরা Tasklet Interface এবং Custom Tasklet তৈরি করার পদ্ধতি সম্পর্কে বিস্তারিত আলোচনা করব।
Tasklet Interface এর কাজ
Tasklet Interface Spring Batch এ একটি কাজ বা প্রসেসিং ইউনিট যা একক স্টেপে ছোট কাজগুলি সম্পাদন করে। এটি সাধারণত একটি নির্দিষ্ট কাজকে সম্পাদন করার জন্য ব্যবহৃত হয় এবং কাজটির অবস্থা RepeatStatus রিটার্ন করে, যা নির্দেশ করে কাজটি চলমান থাকবে, শেষ হবে বা বাতিল করা হবে।
Tasklet ইন্টারফেসের প্রধান মেথড হল:
RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception;
- StepContribution: এটি Step এর প্রসেসিং অবস্থার একটি অংশ, যা এই Step এর জন্য হালনাগাদ তথ্য প্রদান করে।
- ChunkContext: এটি Chunk ভিত্তিক প্রসেসিংয়ের জন্য ব্যবহার করা হয়, যেখানে প্রসেসিংয়ের সময়ে ডেটা বা স্টেট ফরম্যাট করা হয়।
- RepeatStatus: এটি নির্দেশ করে যে Taskletটি আরও একবার সম্পাদিত হবে কি না, বা শেষ হবে।
RepeatStatus এর দুটি মূল মান:
- RepeatStatus.FINISHED: কাজটি শেষ হয়ে গেছে এবং আর পুনরায় সম্পাদন করা হবে না।
- RepeatStatus.CONTINUABLE: কাজটি চলমান থাকবে এবং পরবর্তী চক্রে পুনরায় চালানো হবে।
Custom Tasklet তৈরি করা
Spring Batch এ একটি Custom Tasklet তৈরি করার জন্য আপনাকে Tasklet Interface ইমপ্লিমেন্ট করতে হবে। একটি কাস্টম Tasklet তৈরি করতে সাধারণত নিচের পদক্ষেপগুলি অনুসরণ করা হয়:
Taskletইন্টারফেস ইমপ্লিমেন্ট করা।execute()মেথডে আপনার নির্দিষ্ট কাজটি বাস্তবায়ন করা।- Step এর মধ্যে Tasklet ব্যবহার করা।
উদাহরণ: Custom Tasklet তৈরি
ধরা যাক, আমাদের একটি Tasklet তৈরি করতে হবে যা একটি ফাইলের ভিতর থেকে ডেটা পড়বে এবং সেটি কনসোলে প্রদর্শন করবে। এখানে আমরা একটি সাধারণ Custom Tasklet তৈরি করব যা একটি টেক্সট ফাইল থেকে পাঠ্য ডেটা পড়বে এবং কনসোলে প্রিন্ট করবে।
public class MyFileReadingTasklet implements Tasklet {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
// ফাইল পড়া
Path path = Paths.get("data.txt");
try (Stream<String> lines = Files.lines(path)) {
lines.forEach(System.out::println); // কনসোলে ফাইলের ডেটা প্রদর্শন
} catch (IOException e) {
e.printStackTrace();
}
return RepeatStatus.FINISHED; // কাজ শেষ
}
}
এখানে, MyFileReadingTasklet ক্লাস একটি টেক্সট ফাইল থেকে লাইন-by-লাইন ডেটা পড়ে এবং তা কনসোলে প্রিন্ট করে। কাজটি সম্পন্ন হলে RepeatStatus.FINISHED রিটার্ন করা হয়।
Step এর মধ্যে Custom Tasklet ব্যবহার করা
Spring Batch এর একটি Step এ Custom Tasklet ব্যবহার করতে আপনাকে StepBuilderFactory ব্যবহার করে একটি Step তৈরি করতে হবে এবং সেই Step এর মধ্যে Tasklet সেট করতে হবে।
উদাহরণ: Custom Tasklet কে Step এ ব্যবহার করা
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Job fileProcessingJob() {
return jobBuilderFactory.get("fileProcessingJob")
.start(fileProcessingStep()) // প্রথম Step
.build();
}
@Bean
public Step fileProcessingStep() {
return stepBuilderFactory.get("fileProcessingStep")
.tasklet(myFileReadingTasklet()) // Custom Tasklet
.build();
}
@Bean
public Tasklet myFileReadingTasklet() {
return new MyFileReadingTasklet(); // Custom Tasklet Bean
}
}
এখানে, fileProcessingJob() নামে একটি Job তৈরি করা হয়েছে, যার মধ্যে একটি Step (নাম fileProcessingStep) রয়েছে। এই Step এর মধ্যে আমরা আমাদের Custom Tasklet (MyFileReadingTasklet) ব্যবহার করেছি।
Tasklet এর ব্যবহার ক্ষেত্র
Tasklet সাধারণত সেসব কাজের জন্য ব্যবহার হয় যেখানে:
- একক কাজ বা ছোট স্ক্রিপ্ট প্রয়োজন হয়।
- ডেটা রিডিং বা রাইটিং এর কাজ করা হয়, যেমন ফাইল সিস্টেমে কনভার্সন বা ডেটা ম্যানিপুলেশন।
- কোনো নির্দিষ্ট টাস্ক (যেমন, ডেটাবেস মেইন্টেনেন্স, ফাইল কপি, ইত্যাদি) সম্পাদন করতে হবে।
- বড় পরিমাণ ডেটার পরিবর্তে ছোট ছোট কাজ করতে হবে।
সারাংশ
Spring Batch এ Tasklet Interface ছোট কাজ বা একক কাজ সম্পাদন করার জন্য ব্যবহৃত হয়। Tasklet একটি খুবই কার্যকরী উপাদান যা সাধারণত ছোট কাজগুলো, যেমন ফাইল প্রক্রিয়াকরণ বা ডেটাবেস সিঙ্ক্রোনাইজেশন, বাস্তবায়ন করতে ব্যবহৃত হয়। একটি Custom Tasklet তৈরি করতে হলে, আপনাকে Tasklet Interface ইমপ্লিমেন্ট করতে হবে এবং সেই Tasklet এর execute() মেথডে কাজের কার্যক্রম নির্ধারণ করতে হবে। Spring Batch এ Tasklet ব্যবহার করে একক কাজগুলো খুব সহজে সম্পাদন করা যায়, যা ব্যাচ প্রসেসিংয়ের অন্য স্টেপগুলির সাথে একত্রিত হয়ে কার্যকরীভাবে কাজ করতে পারে।
স্প্রিং ব্যাচ (Spring Batch) একটি শক্তিশালী ফ্রেমওয়ার্ক যা ব্যাচ প্রসেসিংয়ে সাহায্য করে, বিশেষ করে বড় আকারের ডেটা প্রক্রিয়া করতে। এর মধ্যে Chunk-based Processing একটি জনপ্রিয় প্যাটার্ন, যেখানে ডেটা ব্যাচে বিভক্ত হয়ে প্রসেস করা হয়। এই প্যাটার্নে ItemReader, ItemProcessor, এবং ItemWriter ব্যবহার করা হয় ডেটা পড়া, প্রসেস করা এবং লেখার জন্য।
এই তিনটি উপাদান একে অপরের সাথে কাজ করে ডেটা চাঙ্ক (Chunk) আকারে প্রসেস করতে সাহায্য করে। এর মাধ্যমে ডেটা আউটপুট করার আগে এর মধ্যে বিভিন্ন স্টেপে কাস্টম লজিক প্রয়োগ করা যায়।
Chunk-based Processing Overview
Chunk-based Processing হল একটি পদ্ধতি যেখানে ডেটা ছোট ছোট অংশে (চাঙ্ক) ভাগ করে প্রসেস করা হয়। এই পদ্ধতিতে, স্প্রিং ব্যাচ ডেটার একটি নির্দিষ্ট সংখ্যা (Item) ধরে একযোগে কাজ করে এবং একবারে সব ডেটা প্রসেস না করে ধাপে ধাপে কাজ সম্পন্ন করে।
প্রক্রিয়াটি সাধারণত এইভাবে চলে:
- ItemReader: ডেটা পড়ে।
- ItemProcessor: ডেটার উপর প্রক্রিয়া চালায়।
- ItemWriter: প্রক্রিয়াকৃত ডেটা লিখে।
ItemReader
ItemReader হল একটি ইন্টারফেস যা ডেটা পড়ে এবং প্রতি চাঙ্কে কতগুলো আইটেম রিটার্ন করে সেটি নির্ধারণ করে। এটি বিভিন্ন ডেটা সোর্স থেকে ডেটা পড়ার জন্য ব্যবহৃত হয়, যেমন ডেটাবেস, ফাইল, বা API।
ItemReader এর ভূমিকা:
- ডেটা পড়া: এটি মূলত ডেটা সোর্স থেকে ডেটা পড়ে এবং একটি আইটেম রিটার্ন করে। প্রতিটি আইটেম ব্যাচ প্রসেসিংয়ের অংশ হিসেবে গণনা করা হয়।
- EOF (End of File) চেক: ডেটা পড়া সম্পূর্ণ হলে, এটি EOF চেক করে এবং পরে আর কোনো আইটেম থাকলে false রিটার্ন করে।
উদাহরণ:
@Bean
public ItemReader<Product> itemReader() {
List<Product> products = Arrays.asList(new Product("Product1", 100), new Product("Product2", 200));
return new ListItemReader<>(products);
}
এখানে, ListItemReader ব্যবহার করা হয়েছে যা একটি তালিকা থেকে আইটেমগুলো পড়বে।
ItemProcessor
ItemProcessor একটি ইন্টারফেস যা ডেটা প্রসেসিংয়ের জন্য ব্যবহৃত হয়। এটি ItemReader দ্বারা পড়া ডেটা গ্রহণ করে এবং সেই ডেটা পরিবর্তন বা প্রসেস করে। এটি ডেটার মধ্যে ফিল্টারিং, ভ্যালিডেশন, বা ট্রান্সফরমেশন (যেমন ডেটা ফরম্যাট পরিবর্তন) করতে ব্যবহার করা হয়।
ItemProcessor এর ভূমিকা:
- ডেটা ট্রান্সফরমেশন: আইটেমের মান পরিবর্তন করা, যেমন কোনো ফিল্ডের মান গণনা, ফিল্টারিং বা কোন ব্যবসায়িক লজিক প্রয়োগ করা।
- ভ্যালিডেশন: যদি কোনো আইটেম ভ্যালিড না হয়, তবে এটি
nullরিটার্ন করতে পারে বা ব্যতিক্রম থ্রো করতে পারে।
উদাহরণ:
@Bean
public ItemProcessor<Product, Product> itemProcessor() {
return new ItemProcessor<Product, Product>() {
@Override
public Product process(Product item) throws Exception {
item.setPrice(item.getPrice() * 1.1); // Adding 10% tax
return item;
}
};
}
এখানে, ItemProcessor একটি প্রোডাক্টের মূল্যকে ১০% বৃদ্ধি করছে।
ItemWriter
ItemWriter একটি ইন্টারফেস যা ডেটা লেখার জন্য ব্যবহৃত হয়। এটি একটি চাঙ্কের সমস্ত আইটেম প্রক্রিয়া করার পর, সেই আইটেমগুলো একটি ডেস্টিনেশন (যেমন ডেটাবেস, ফাইল, ইত্যাদি) এ লিখে।
ItemWriter এর ভূমিকা:
- ডেটা লিখা: এটি একত্রিত আইটেমগুলো একটি নির্দিষ্ট ডেস্টিনেশনে লিখে। যেমন ডেটাবেসে ইনসার্ট করা বা ফাইলে লেখা।
- ব্যাচ আউটপুট: এটি একাধিক আইটেমকে একত্রে লেখা হয়, যা পারফরম্যান্স উন্নত করতে সাহায্য করে।
উদাহরণ:
@Bean
public ItemWriter<Product> itemWriter() {
return new ItemWriter<Product>() {
@Override
public void write(List<? extends Product> items) throws Exception {
for (Product product : items) {
System.out.println("Writing product: " + product.getName() + " with price " + product.getPrice());
}
}
};
}
এখানে, ItemWriter প্রক্রিয়া করা প্রোডাক্ট আইটেমগুলো কনসোলে লিখে।
Chunk-based Processing কনফিগারেশন
একটি সম্পূর্ণ Chunk-based Processing সেটআপ করার জন্য, আপনাকে Step কনফিগারেশন করতে হবে যেখানে ItemReader, ItemProcessor, এবং ItemWriter যুক্ত থাকবে। নিচে একটি উদাহরণ দেওয়া হলো:
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.<Product, Product>chunk(10)
.reader(itemReader())
.processor(itemProcessor())
.writer(itemWriter())
.build();
}
@Bean
public Job job(JobRepository jobRepository, JobLauncher jobLauncher) {
return jobBuilderFactory.get("job")
.start(step1())
.build();
}
এখানে:
chunk(10)এর মানে হল যে প্রতিটি চাঙ্কে ১০টি আইটেম থাকবে।itemReader(),itemProcessor(), এবংitemWriter()যথাক্রমে আইটেম পড়া, প্রক্রিয়া এবং লেখা পরিচালনা করবে।
উপসংহার
স্প্রিং ব্যাচের Chunk-based Processing প্যাটার্নে ItemReader, ItemProcessor, এবং ItemWriter তিনটি গুরুত্বপূর্ণ উপাদান। ItemReader ডেটা পড়ে, ItemProcessor ডেটার উপর কাস্টম লজিক প্রয়োগ করে এবং ItemWriter প্রক্রিয়াকৃত ডেটা লেখে। এই পদ্ধতি ডেটা ব্যাচে প্রসেস করার জন্য খুবই কার্যকরী এবং পারফরম্যান্স উন্নত করতে সহায়তা করে, বিশেষ করে বড় আকারের ডেটা প্রক্রিয়া করতে।
Read more