Spring Batch একটি শক্তিশালী ফ্রেমওয়ার্ক যা ডেটা প্রসেসিংয়ের জন্য ব্যবহৃত হয়। তবে কখনও কখনও বড় পরিমাণ ডেটা একসাথে প্রক্রিয়া করা কঠিন হতে পারে, বিশেষত যখন ডেটা অনেক বড় হয় এবং এটি একাধিক সিস্টেমে প্রসেস করা প্রয়োজন। এমন পরিস্থিতিতে Partitioning বা Spring Batch Partitioning অত্যন্ত কার্যকরী হতে পারে। Partitioning ডেটা প্রসেসিংকে ছোট ছোট ভাগে ভাগ করে একাধিক প্রসেস বা থ্রেডের মাধ্যমে একযোগে প্রসেস করা যায়, যার ফলে ডেটা প্রক্রিয়ার গতি অনেক বৃদ্ধি পায়।
Spring Batch Partitioning একটি পদ্ধতি যেখানে একটি বড় ডেটাসেটকে ছোট ছোট ভাগে (partitions) বিভক্ত করা হয় এবং প্রতিটি ভাগ আলাদাভাবে প্রক্রিয়া করা হয়। এটি ডিস্ট্রিবিউটেড প্রসেসিংয়ের ক্ষেত্রে অনেক সহায়ক।
Partitioning হল একটি কৌশল যেখানে একটি স্টেপের কাজকে ছোট ছোট ভাগে ভাগ করা হয়, এবং প্রতিটি ভাগ আলাদা স্টেপ হিসেবে একযোগে প্রসেস করা হয়। এতে ডেটা দ্রুত প্রক্রিয়া করা সম্ভব হয়, কারণ একাধিক প্যাটার্নে ভাগ করে প্রসেস করা হয়। Partitioning একটি খুবই শক্তিশালী কৌশল যেখানে ডেটার কাজটি parallelly বা distributively কার্যকরীভাবে সম্পাদিত হয়।
Spring Batch এ Partitioning সাধারণত দুটি প্রধান উপাদান নিয়ে কাজ করে:
Master Step ডেটা ভাগ করার কাজ করে এবং Slave Step প্রতিটি ভাগ প্রক্রিয়া করে। এই ভাগগুলো সাধারণত আলাদা থ্রেডে বা আলাদা প্রক্রিয়ায় (process) চালানো হয়।
এখানে আমরা একটি উদাহরণ দেখাব, যেখানে একটি বড় ডেটাসেটকে Partitioning এর মাধ্যমে আলাদা আলাদা অংশে ভাগ করে প্রসেস করা হবে।
@Configuration
@EnableBatchProcessing
public class PartitioningConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Job partitionedJob() {
return jobBuilderFactory.get("partitionedJob")
.start(masterStep()) // Master Step
.build();
}
@Bean
public Step masterStep() {
return stepBuilderFactory.get("masterStep")
.partitioner(slaveStep())
.partitioner("slaveStep", partitioner()) // Slave Step এর জন্য Partitioner
.gridSize(4) // কতটি পার্টিশন তৈরি হবে
.taskExecutor(taskExecutor()) // Multi-threaded execution
.build();
}
@Bean
public Step slaveStep() {
return stepBuilderFactory.get("slaveStep")
.<String, String>chunk(10)
.reader(myItemReader()) // Custom ItemReader
.processor(myItemProcessor()) // Custom ItemProcessor
.writer(myItemWriter()) // Custom ItemWriter
.build();
}
@Bean
public Partitioner partitioner() {
return new MyPartitioner(); // Custom Partitioner
}
@Bean
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(4); // ৪টি থ্রেড থাকবে
executor.setMaxPoolSize(8);
executor.setQueueCapacity(10);
executor.initialize();
return executor;
}
@Bean
public ItemReader<String> myItemReader() {
return new MyItemReader(); // Custom ItemReader
}
@Bean
public ItemProcessor<String, String> myItemProcessor() {
return new MyItemProcessor(); // Custom ItemProcessor
}
@Bean
public ItemWriter<String> myItemWriter() {
return new MyItemWriter(); // Custom ItemWriter
}
}
এখানে:
masterStep
) মূল স্টেপ যেখানে পার্টিশনিং কনফিগার করা হয়। এটি partitioner()
এবং gridSize()
ব্যবহার করে পার্টিশন তৈরি করে।slaveStep
) প্রতিটি পার্টিশন প্রসেস করার জন্য ব্যবহৃত হয়।TaskExecutor
ব্যবহার করা হয়েছে যাতে একাধিক থ্রেডে একযোগে কাজ চালানো যায়।gridSize(4)
নির্দেশ করে যে মোট ৪টি পার্টিশন তৈরি হবে।Partitioner
একটি কাস্টম ক্লাস যা ডেটাকে পার্টিশনগুলিতে ভাগ করার কাজ করে।
public class MyPartitioner implements Partitioner {
@Override
public Map<String, ExecutionContext> partition(int gridSize) {
Map<String, ExecutionContext> result = new HashMap<>();
// এখানে আপনার ডেটা ভাগ করার লজিক থাকবে
for (int i = 0; i < gridSize; i++) {
ExecutionContext context = new ExecutionContext();
context.put("partitionNumber", i); // প্রতিটি পার্টিশনের জন্য ডেটা
result.put("partition" + i, context);
}
return result;
}
}
এখানে:
partition(int gridSize)
মেথড ডেটাকে ৪টি ভাগে ভাগ করছে। প্রতিটি পার্টিশন একটি ExecutionContext
ব্যবহার করে।এখন, আমরা ItemReader
, ItemProcessor
, এবং ItemWriter
তৈরি করব যা প্রতিটি পার্টিশনে কাজ করবে।
public class MyItemReader implements ItemReader<String> {
private List<String> data = Arrays.asList("Item1", "Item2", "Item3", "Item4", "Item5");
private int index = 0;
@Override
public String read() throws Exception {
if (index < data.size()) {
return data.get(index++);
}
return null;
}
}
public class MyItemProcessor implements ItemProcessor<String, String> {
@Override
public String process(String item) throws Exception {
return item.toUpperCase(); // Uppercase transformation
}
}
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); // Print each item
}
}
}
এখানে:
MyItemReader
একটি ফিক্সড ডেটা তালিকা থেকে ডেটা পড়ে।MyItemProcessor
প্রতিটি আইটেমকে uppercase করে।MyItemWriter
কনসোলে ডেটা লিখে।Spring Batch এ Partitioning একটি শক্তিশালী কৌশল যা ডেটাকে ছোট ছোট ভাগে ভাগ করে একাধিক প্রসেস বা থ্রেডে সমান্তরালভাবে (parallel) প্রক্রিয়া করার সুবিধা দেয়। এই পদ্ধতির মাধ্যমে ডেটা প্রক্রিয়া করার সময় দক্ষতা এবং পারফরম্যান্স বৃদ্ধি পায়। Spring Batch Partitioning ব্যবহার করে, আপনি ডেটা প্রসেসিংকে আরও দ্রুত এবং কার্যকরীভাবে পরিচালনা করতে পারেন। Partitioning এর মাধ্যমে কাজগুলো Master Step এবং Slave Step এর মাধ্যমে ভাগ করা হয় এবং প্রতিটি অংশ আলাদাভাবে প্রক্রিয়া করা হয়।
স্প্রিং ব্যাচ (Spring Batch) একটি শক্তিশালী ফ্রেমওয়ার্ক যা বড় আকারের ডেটা প্রসেসিংয়ের জন্য ব্যবহৃত হয়। ডেটার পরিমাণ বা স্কেল অনেক বড় হলে, এককভাবে ডেটা প্রসেস করা অনেক সময় এবং রিসোর্স-অধিক হতে পারে। এই পরিস্থিতিতে Partitioning একটি কার্যকরী সমাধান হিসেবে কাজে আসে।
Partitioning হল একটি প্রসেসিং কৌশল যেখানে বড় ডেটা সেটটিকে ছোট ছোট ভাগে ভাগ করা হয়, এবং প্রতিটি ভাগকে আলাদাভাবে প্রসেস করা হয়। এই পদ্ধতিতে, ডেটা পার্টিশনে বিভক্ত হয়ে যায়, এবং প্রতিটি পার্টিশন আলাদা থ্রেড বা প্রসেসিং ইউনিট দ্বারা এক্সিকিউট হয়, যার ফলে ব্যাচ প্রসেসিংয়ের কার্যক্ষমতা (performance) এবং স্কেলিবিলিটি (scalability) বৃদ্ধি পায়।
স্প্রিং ব্যাচে Partitioned Step একটি পদ্ধতি হিসেবে ব্যবহৃত হয় যেখানে একটি প্রধান Step
কে পার্টিশন করে একই সময় একাধিক থ্রেডে কাজ করা হয়। এই পদ্ধতিতে, প্রতিটি পার্টিশন আলাদাভাবে প্রসেস হয়, এবং শেষে এগুলো একত্রিত (combine) করা হয়।
Partitioning গুরুত্বপূর্ণ কারণ এটি ব্যাচ প্রসেসিংয়ের অনেক দিকের উন্নতি করতে সাহায্য করে:
স্প্রিং ব্যাচে Partitioned Step কনফিগারেশন ব্যবহৃত হয়, যেখানে একটি নির্দিষ্ট স্টেপের ডেটাকে ভাগ করা হয় এবং প্রতিটি পার্টিশনকে আলাদাভাবে প্রসেস করা হয়। সাধারণত, একটি প্রধান স্টেপ থাকে এবং এটি পার্টিশনিং করার জন্য একটি Partitioner
ইন্টারফেস ব্যবহৃত হয়, যা ডেটা ভাগ করে দেয়। এরপর, প্রতিটি পার্টিশন StepExecution
দ্বারা প্রক্রিয়া করা হয়।
public class ProductPartitioner implements Partitioner {
@Override
public Map<String, ExecutionContext> partition(int gridSize) {
Map<String, ExecutionContext> partitionMap = new HashMap<>();
for (int i = 0; i < gridSize; i++) {
ExecutionContext context = new ExecutionContext();
context.putInt("partitionNumber", i);
partitionMap.put("partition" + i, context);
}
return partitionMap;
}
}
এখানে, ProductPartitioner
ক্লাসটি ডেটাকে পার্টিশনে ভাগ করে। gridSize
হল এক্সিকিউট করার জন্য পার্টিশনের সংখ্যা। এই উদাহরণে, প্রতিটি পার্টিশনের জন্য একটি ExecutionContext তৈরি করা হচ্ছে এবং প্রতিটি পার্টিশনের জন্য একটি আলাদা প্যারামিটার সংরক্ষিত হচ্ছে।
@Bean
public Step partitionedStep() {
return stepBuilderFactory.get("partitionedStep")
.partitioner(step1())
.partitioner("step2", new ProductPartitioner())
.step(step1())
.gridSize(4)
.build();
}
এখানে:
partitioner()
মেথডের মাধ্যমে পার্টিশনিং কনফিগার করা হচ্ছে।gridSize(4)
দ্বারা মোট ৪টি পার্টিশন হবে।@Bean
public Job partitionedJob() {
return jobBuilderFactory.get("partitionedJob")
.start(partitionedStep())
.build();
}
এখানে, Master Step (অর্থাৎ মূল স্টেপ) কনফিগার করা হয়েছে, যা পার্টিশন করা step1()
এবং step2()
এক্সিকিউট করবে।
স্প্রিং ব্যাচে দুটি মূল Partitioning প্রকার রয়েছে:
স্প্রিং ব্যাচে Partitioning একটি অত্যন্ত গুরুত্বপূর্ণ কৌশল যা বড় ডেটা সেটের কার্যকরী প্রসেসিং নিশ্চিত করে। এটি পারফরম্যান্স, স্কেলেবিলিটি, এফিসিয়েন্সি এবং লোড ভারসাম্য উন্নত করে। ডেটাকে ছোট ছোট ভাগে ভাগ করে, একাধিক থ্রেড বা প্রসেসিং ইউনিটে একযোগভাবে কাজ করা সম্ভব হয়, যার ফলে ব্যাচ প্রসেসিং আরও দ্রুত ও কার্যকরী হয়। স্প্রিং ব্যাচে Partitioning ব্যবহার করার মাধ্যমে আপনি সহজে বড় আকারের ডেটা পরিচালনা করতে পারেন এবং ডেটা প্রসেসিংয়ের কার্যকারিতা বৃদ্ধি করতে পারেন।
স্প্রিং ব্যাচ (Spring Batch) একটি শক্তিশালী ফ্রেমওয়ার্ক যা বড় পরিমাণে ডেটা প্রক্রিয়া (ডেটা মাইগ্রেশন, ডেটা ট্রান্সফরমেশন, ইত্যাদি) করতে ব্যবহৃত হয়। তবে, যখন ডেটার পরিমাণ বিশাল হয়ে ওঠে, তখন কার্যক্ষমতা এবং পারফরম্যান্স আরও উন্নত করতে Partitioning ব্যবহার করা হয়। স্প্রিং ব্যাচে Local Partitioning এবং Remote Partitioning দুইটি প্রধান পার্টিশনিং কৌশল রয়েছে, যা ব্যাচ প্রসেসিংয়ের কর্মক্ষমতা এবং স্কেলেবিলিটি উন্নত করতে সহায়তা করে।
Partitioning হল একটি পদ্ধতি যার মাধ্যমে একটি বৃহত্তর কাজকে (যেমন ডেটার বিশাল সেট) ছোট ছোট উপ-উপকারে ভাগ করা হয় এবং একাধিক থ্রেড বা প্রসেসে সমান্তরালভাবে প্রক্রিয়া করা হয়। এটি পারফরম্যান্স উন্নত করতে এবং কাজের সম্পন্ন সময় কমাতে সহায়ক হয়। স্প্রিং ব্যাচে দুটি প্রধান ধরনের Partitioning রয়েছে:
Local Partitioning হল একটি পদ্ধতি যেখানে একটি কাজকে বিভিন্ন অংশে ভাগ করা হয় এবং প্রতিটি অংশ একই JVM বা মেশিনের মধ্যে সমান্তরালভাবে প্রসেস করা হয়। এতে একটি কাজের প্রতিটি পার্টিশন আলাদা Step
হিসেবে কার্যকর করা হয়, এবং প্রতিটি Step
একটি নির্দিষ্ট ডেটা অংশ প্রক্রিয়া করে।
Local Partitioning সাধারণত কম্পিউটিং শক্তির একক মেশিন বা ক্লাস্টারের মধ্যে কাজের জন্য ব্যবহৃত হয়।
ধরা যাক, আমাদের একটি ব্যাচ প্রসেসিং কাজ রয়েছে যা Users
টেবিল থেকে ডেটা পড়বে, এবং আমরা ডেটা ভলিউম বেশি হলে এটি পার্টিশনিং করে সমান্তরালভাবে প্রসেস করতে চাই।
Step 1: স্প্রিং ব্যাচ কনফিগারেশন
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
private DataSource dataSource;
@Bean
public ItemReader<User> reader() {
JdbcCursorItemReader<User> reader = new JdbcCursorItemReader<>();
reader.setDataSource(dataSource);
reader.setSql("SELECT id, name, email FROM users");
reader.setRowMapper(new BeanPropertyRowMapper<>(User.class));
return reader;
}
@Bean
public ItemProcessor<User, User> processor() {
return new UserItemProcessor();
}
@Bean
public ItemWriter<User> writer() {
JdbcBatchItemWriter<User> writer = new JdbcBatchItemWriter<>();
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
writer.setSql("UPDATE users SET processed = true WHERE id = :id");
writer.setDataSource(dataSource);
return writer;
}
@Bean
public Step partitionedStep() {
return stepBuilderFactory.get("partitionedStep")
.partitioner("partitionedStep", new UserPartitioner())
.step(step1()) // Here step1() is the actual step that processes data
.build();
}
@Bean
public Job partitionedJob() {
return jobBuilderFactory.get("partitionedJob")
.start(partitionedStep())
.build();
}
}
Step 2: Partitioner Implementation
UserPartitioner
একটি কাস্টম ক্লাস যা ডেটা ভাগ করার জন্য ব্যবহার করা হয়।
public class UserPartitioner implements Partitioner {
@Override
public Map<String, ExecutionContext> partition(int gridSize) {
Map<String, ExecutionContext> partitionMap = new HashMap<>();
int partitionSize = 100; // number of records per partition
int totalRecords = 1000; // total number of records in your dataset
for (int i = 0; i < gridSize; i++) {
ExecutionContext context = new ExecutionContext();
context.putInt("partitionNumber", i);
context.putInt("start", i * partitionSize);
context.putInt("end", (i + 1) * partitionSize);
partitionMap.put("partition" + i, context);
}
return partitionMap;
}
}
এখানে, UserPartitioner
ক্লাস partition()
মেথডে ডেটা অংশে ভাগ করে। প্রতিটি পার্টিশনের জন্য একটি ExecutionContext
তৈরি হয়, যা প্রক্রিয়ার জন্য start
এবং end
সীমা সংরক্ষণ করে।
Remote Partitioning একটি উন্নত পার্টিশনিং কৌশল যা একাধিক মেশিন বা JVM-এ সমান্তরালভাবে কাজ করতে সহায়তা করে। এটি সাধারণত স্কেলেবল এবং ক্লাস্টার-ভিত্তিক অ্যাপ্লিকেশনগুলির জন্য ব্যবহৃত হয়, যেখানে মূল সিস্টেম (master) কাজের ভাগ (partitions) বিভক্ত করে, এবং প্রতিটি সিস্টেম (worker) নির্দিষ্ট অংশের জন্য কাজ করে।
স্প্রিং ব্যাচে রিমোট পার্টিশনিং করার জন্য স্প্রিং মেসেজিং (Spring Messaging
) বা JMS (Java Message Service) ব্যবহার করা হয়। এখানে মূল সিস্টেমটি (Master) Worker সিস্টেমগুলিকে পার্টিশন তথ্য পাঠায় এবং Worker সিস্টেমগুলো তাদের নির্দিষ্ট অংশে কাজ সম্পন্ন করে।
Step 1: স্প্রিং ব্যাচ কনফিগারেশন
@Configuration
@EnableBatchProcessing
public class RemoteBatchConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
private DataSource dataSource;
@Bean
public ItemReader<User> reader() {
// Configuring remote partitioning reader
}
@Bean
public ItemProcessor<User, User> processor() {
return new UserItemProcessor();
}
@Bean
public ItemWriter<User> writer() {
// Configuring remote partitioning writer
}
@Bean
public Step partitionedStep() {
return stepBuilderFactory.get("partitionedStep")
.partitioner("partitionedStep", new RemoteUserPartitioner())
.step(step1()) // Actual step that processes data
.build();
}
@Bean
public Job remotePartitionedJob() {
return jobBuilderFactory.get("remotePartitionedJob")
.start(partitionedStep())
.build();
}
}
Step 2: Remote Partitioner
RemoteUserPartitioner
ক্লাস মূলত পার্টিশন তৈরি করে এবং বিভিন্ন মেশিন বা সার্ভারে তথ্য পাঠানোর জন্য ব্যবহৃত হয়।
public class RemoteUserPartitioner implements Partitioner {
@Override
public Map<String, ExecutionContext> partition(int gridSize) {
Map<String, ExecutionContext> partitionMap = new HashMap<>();
// Distribute partitions across different worker nodes
return partitionMap;
}
}
বিষয় | Local Partitioning | Remote Partitioning |
---|---|---|
কোডের অবস্থান | একই JVM বা মেশিনে কাজ করে। | একাধিক JVM বা মেশিনে কাজ করে। |
পারফরম্যান্স | ছোট স্কেল প্রসেসিংয়ের জন্য উপযুক্ত। | বড় স্কেল প্রসেসিং এবং ক্লাস্টারিংয়ের জন্য উপযুক্ত। |
স্কেলেবিলিটি | স্কেলিং সীমাবদ্ধ (একই মেশিনে)। | উচ্চ স্কেলেবিলিটি এবং একাধিক মেশিনে প্রসেসিংয়ের ক্ষমতা। |
কমপ্লেক্সিটি | সহজ কনফিগারেশন, কমপ্লেক্সিটি কম। | আরও জটিল কনফিগারেশন এবং মেসেজিং সিস্টেমের প্রয়োজন হয়। |
উদাহরণ | একই সার্ভারে ডেটা প্রসেসিং। | ডিস্ট্রিবিউটেড সিস্টেমে কাজ করার জন্য (Master-Worker Architecture)। |
স্প্রিং ব্যাচে Local Partitioning এবং Remote Partitioning দুটি অত্যন্ত গুরুত্বপূর্ণ কৌশল যা ব্যাচ প্রসেসিংয়ের কর্মক্ষমতা এবং স্কেলেবিলিটি বৃদ্ধি করতে ব্যবহৃত হয়।
আপনার প্রকল্পের আকার এবং প্রক্রিয়ার জটিলতা অনুসারে আপনি যে কোনো একটি পার্টিশনিং কৌশল বেছে নিতে পারেন।
স্প্রিং ব্যাচ (Spring Batch) হলো একটি ফ্রেমওয়ার্ক যা উচ্চ-পারফরম্যান্স ব্যাচ প্রসেসিং এর জন্য ব্যবহৃত হয়। এটি ডেটা প্রসেসিংয়ের জন্য নির্ভরযোগ্য এবং স্কেলেবল সমাধান প্রদান করে। স্প্রিং ব্যাচ সাধারণত ব্যাচ জব (Batch Job) চালানোর সময় ডেটা রিড, প্রসেস এবং রাইট করার জন্য ব্যবহৃত হয়।
পার্টিশনিং (Partitioning) স্প্রিং ব্যাচের একটি কৌশল যা বড় বড় ডেটাসেটকে ছোট ছোট অংশে ভাগ করে সমান্তরালভাবে প্রসেস করতে সহায়তা করে, ফলে পারফরম্যান্স বাড়ে।
স্প্রিং ব্যাচে পার্টিশনিং দুইভাবে করা যায়:
নিচের উদাহরণে একটি স্প্রিং ব্যাচ জব কনফিগার করা হয়েছে যেখানে বড় ডেটাসেটকে পার্টিশনে ভাগ করে সমান্তরালভাবে প্রসেস করা হচ্ছে।
public class Employee {
private Long id;
private String name;
private String department;
// Getter এবং Setter
}
@Bean
public ItemReader<Employee> itemReader() {
return new FlatFileItemReaderBuilder<Employee>()
.name("employeeReader")
.resource(new ClassPathResource("employees.csv"))
.delimited()
.names("id", "name", "department")
.fieldSetMapper(new BeanWrapperFieldSetMapper<>() {{
setTargetType(Employee.class);
}})
.build();
}
@Bean
public ItemProcessor<Employee, Employee> itemProcessor() {
return employee -> {
employee.setDepartment(employee.getDepartment().toUpperCase());
return employee;
};
}
@Bean
public ItemWriter<Employee> itemWriter() {
return items -> items.forEach(System.out::println);
}
@Bean
public Step slaveStep(StepBuilderFactory stepBuilderFactory, ItemReader<Employee> itemReader,
ItemProcessor<Employee, Employee> itemProcessor, ItemWriter<Employee> itemWriter) {
return stepBuilderFactory.get("slaveStep")
.<Employee, Employee>chunk(10)
.reader(itemReader)
.processor(itemProcessor)
.writer(itemWriter)
.build();
}
@Bean
public Step masterStep(StepBuilderFactory stepBuilderFactory, TaskExecutorPartitionHandler partitionHandler) {
return stepBuilderFactory.get("masterStep")
.partitioner("slaveStep", partitioner())
.partitionHandler(partitionHandler)
.build();
}
@Bean
public Partitioner partitioner() {
return gridSize -> {
Map<String, ExecutionContext> partitions = new HashMap<>();
for (int i = 0; i < gridSize; i++) {
ExecutionContext context = new ExecutionContext();
context.putInt("partitionNumber", i);
partitions.put("partition" + i, context);
}
return partitions;
};
}
@Bean
public Job partitioningJob(JobBuilderFactory jobBuilderFactory, Step masterStep) {
return jobBuilderFactory.get("partitioningJob")
.start(masterStep)
.build();
}
@Bean
public TaskExecutorPartitionHandler partitionHandler(Step slaveStep) {
TaskExecutorPartitionHandler handler = new TaskExecutorPartitionHandler();
handler.setStep(slaveStep);
handler.setTaskExecutor(taskExecutor());
handler.setGridSize(5);
return handler;
}
@Bean
public TaskExecutor taskExecutor() {
return new SimpleAsyncTaskExecutor("partitioning-");
}
এই কনফিগারেশনে, ডেটা ফাইলটি ৫টি পার্টিশনে বিভক্ত হবে এবং প্রতিটি পার্টিশন সমান্তরালভাবে প্রসেস হবে।
Read more