Spring Batch Job Configuration

Java Technologies - স্প্রিং ব্যাচ (Spring Batch)
143
143

Spring Batch ফ্রেমওয়ার্কে, Job কনফিগারেশন একটি গুরুত্বপূর্ণ অংশ যা ব্যাচ প্রসেসিং এর মাধ্যমে ডেটার বড় সেটগুলি প্রসেস করার জন্য ব্যবহৃত হয়। একটি Job একাধিক Steps নিয়ে গঠিত হয় এবং প্রতিটি Step একটি নির্দিষ্ট কাজ বা প্রক্রিয়া সম্পাদন করে। Spring Batch অ্যাপ্লিকেশন কনফিগারেশনে Job কনফিগারেশন সম্পূর্ণরূপে JobBuilderFactory এবং StepBuilderFactory এর মাধ্যমে করা হয়।

Spring Batch কনফিগারেশন দুটি প্রধান অংশে বিভক্ত:

  1. Job Configuration – একটি ব্যাচ জব সেট আপ করা এবং নির্ধারণ করা।
  2. Step Configuration – প্রতিটি স্টেপের জন্য কাজের বিস্তারিত কনফিগারেশন।

Spring Batch Job Configuration এর প্রধান উপাদানসমূহ

  1. Job: এটি ব্যাচ প্রসেসিংয়ের মূল একক। Job বিভিন্ন Step নিয়ে গঠিত হয়, যেখানে প্রতিটি Step একটি নির্দিষ্ট কাজ (যেমন ডেটা রিড, প্রসেসিং, বা রাইট) সম্পাদন করে।
  2. Step: একটি Step হল একটি নির্দিষ্ট কাজ বা প্রসেস, যা ব্যাচের একটি অংশ হিসেবে কাজ করে। একাধিক Step একটি Job তৈরি করে।
  3. ItemReader, ItemProcessor, ItemWriter:
    • ItemReader: ডেটা উৎস থেকে ডেটা পড়ার জন্য ব্যবহৃত হয়।
    • ItemProcessor: ডেটার উপর কোনও পরিবর্তন বা প্রক্রিয়া করা হয়।
    • ItemWriter: প্রক্রিয়া করা ডেটা আউটপুট ডেটা উৎসে লেখার জন্য ব্যবহৃত হয়।

Spring Batch Job Configuration উদাহরণ

Spring Batch এ একটি Job কনফিগার করতে কিছু ধাপ অনুসরণ করতে হয়:

১. Job এবং Step কনফিগারেশন

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();
    }
}

এখানে:

  • Job তৈরি করা হচ্ছে, যা একটি Step নিয়ে গঠিত।
  • প্রতিটি Step একটি নির্দিষ্ট কাজ করবে, যেমন ডেটা রিড, প্রক্রিয়া বা ডেটাবেসে লেখা।
  • chunk(10) দ্বারা প্রতিটি ট্রানজেকশন 10টি আইটেম নিয়ে কাজ করবে।

২. ItemReader, ItemProcessor, এবং ItemWriter কনফিগারেশন

  • ItemReader: এটি ডেটা রিড করতে ব্যবহৃত হয়, যেমন ফাইল বা ডেটাবেস থেকে ডেটা রিড করা।
  • ItemProcessor: এটি ডেটা প্রসেস করার জন্য ব্যবহৃত হয়, যেমন ডেটার উপর কোনো পরিবর্তন বা ফিল্টার প্রয়োগ করা।
  • ItemWriter: এটি প্রক্রিয়া করা ডেটা আউটপুটে লেখার জন্য ব্যবহৃত হয়, যেমন ডেটাবেস বা ফাইলে লেখা।
@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();
}
  • ItemReader: ফাইল থেকে users.csv ডেটা রিড করবে এবং User অবজেক্টে ম্যাপ করবে।
  • ItemProcessor: firstName ফিল্ডকে বড় হাতের অক্ষরে পরিবর্তন করবে।
  • ItemWriter: প্রক্রিয়া করা ডেটা users টেবিলে ইনসার্ট করবে।

৩. JobLauncher এবং JobExecution

স্প্রিং বুটে 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());
}

এখানে:

  • JobLauncher: এটি ব্যাচ Job চালানোর জন্য ব্যবহৃত হয়।
  • JobParameters: Job এর জন্য অতিরিক্ত প্যারামিটার প্রদান করা হয় (যেমন ডেটা ফাইল, বা প্রোফাইল অনুযায়ী কনফিগারেশন)।
  • JobExecution: Job এর চলমান অবস্থা এবং ফলাফল ট্র্যাক করতে ব্যবহৃত হয়।

৪. Job Repository এবং Job Execution Tracking

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();
}

এখানে:

  • JobRepository: Job এর মেটাডেটা ট্র্যাক করার জন্য ব্যবহৃত হয়।
  • JobExecution: Job এর চলমান অবস্থা (যেমন SUCCESS বা FAILURE) ট্র্যাক করা হয়।

৫. Job Parameters এবং Dynamic Job Execution

স্প্রিং বুটে JobParameters এর মাধ্যমে আপনি ডাইনামিকভাবে Job চালাতে পারেন, যার মাধ্যমে বিভিন্ন প্যারামিটার হিসেবে ইনপুট প্রদান করা হয়।

JobParameters jobParameters = new JobParametersBuilder()
        .addString("inputFile", "data.csv")
        .toJobParameters();

jobLauncher.run(importUserJob, jobParameters);

এখানে:

  • JobParameters ব্যবহার করে আপনি ডাইনামিকভাবে Job এ প্যারামিটার পাস করতে পারেন, যেমন একটি ইনপুট ফাইল।

Spring Batch Job Configuration এর সুবিধা

  1. ডেটা প্রসেসিং স্কেলেবিলিটি: Spring Batch আপনাকে সহজেই বৃহৎ পরিমাণ ডেটা প্রসেস করতে সাহায্য করে, যা স্কেলেবল এবং দক্ষ।
  2. অটো-কমপ্লিট কনফিগারেশন: ItemReader, ItemProcessor, এবং ItemWriter এর সাথে সহজে কাজ করা যায়।
  3. পুনরায় চালানো (Restartability): কোন ব্যাচ প্রসেস মাঝপথে বন্ধ হয়ে গেলে সহজে পুনরায় চালানো যায়।
  4. ট্রানজেকশনাল প্রসেসিং: Spring Batch ডেটাবেসে ব্যাচ প্রক্রিয়ার জন্য ট্রানজেকশন ম্যানেজমেন্ট সিস্টেম প্রদান করে।
  5. জব মেটাডেটা ট্র্যাকিং: Spring Batch আপনাকে ব্যাচ কাজের স্ট্যাটাস এবং প্রগ্রেস ট্র্যাক করতে সহায়তা করে।

সারসংক্ষেপ

Spring Batch Job Configuration একটি জটিল এবং শক্তিশালী কার্যক্ষমতা প্রদান করে যা ব্যাচ প্রসেসিংয়ের জন্য প্রয়োজনীয় সমস্ত কনফিগারেশন ও টুল সরবরাহ করে। Job, Step, ItemReader, ItemProcessor, এবং ItemWriter এর মাধ্যমে আপনি খুব সহজে ডেটা রিড, প্রক্রিয়া এবং রাইট করতে পারেন। Spring Batch আপনাকে স্কেলেবিলিটি, পুনরায় চালানোর সুবিধা, এবং ট্রানজেকশন ম্যানেজমেন্ট প্রদান করে, যা বড় পরিসরে ডেটা প্রসেসিংয়ের জন্য অত্যন্ত কার্যকর।

Content added By

Spring Batch এ Job কি এবং তার কাজের প্রক্রিয়া

96
96

Spring Batch একটি শক্তিশালী ফ্রেমওয়ার্ক যা বড় আকারের ডেটা প্রক্রিয়া (batch processing) করার জন্য ব্যবহৃত হয়। Job Spring Batch-এ একটি কেন্দ্রীয় কনসেপ্ট, যা একটি বা একাধিক Step এর মাধ্যমে ডেটা প্রক্রিয়া সম্পন্ন করে। Job হলো এক ধরনের কাজ যা ডেটা এক্সট্র্যাকশন, ট্রান্সফরমেশন এবং লোডিং (ETL) কার্যক্রম সম্পাদন করতে ব্যবহৃত হয়।

Spring Batch এ Job এর সংজ্ঞা

Job হলো একটি টাস্ক যা বিভিন্ন কাজ বা Step নিয়ে গঠিত। প্রতিটি Step ডেটা প্রক্রিয়া বা কোনো নির্দিষ্ট কাজ সম্পাদন করে। Job এ কয়েকটি Step থাকতে পারে এবং প্রতিটি Step তার নিজস্ব কাজ (যেমন, ডেটা রিড, প্রসেস, বা রাইট) সম্পন্ন করে। Job সাধারণত একটি হাই-লেভেল প্রক্রিয়া, যা এর ভিতরে থাকা স্টেপগুলির কার্যকারিতা একত্রিত করে।

Job এর মূল উপাদান:

  • Step: Job-এর অংশ যা নির্দিষ্ট কাজ সম্পাদন করে (যেমন, ডেটা রিড, প্রসেস বা রাইট)। প্রতিটি Step আলাদাভাবে কার্যকরী হতে পারে এবং তার নিজস্ব ইনপুট ও আউটপুট থাকতে পারে।
  • ItemReader, ItemProcessor, ItemWriter: Step-এর মধ্যে ডেটা রিড, প্রসেস এবং রাইট করার জন্য ব্যবহৃত উপাদান।

Spring Batch এ Job এর কাজের প্রক্রিয়া

Spring Batch এ Job সাধারণত তিনটি মূল ধাপে কাজ করে:

  1. Job Execution: Job শুরু হওয়ার পরে এক বা একাধিক Step একে একে কার্যকরী হয়।
  2. Step Execution: প্রতিটি Step ডেটা প্রক্রিয়া করার জন্য একটি নির্দিষ্ট কার্যপ্রণালী সম্পাদন করে।
  3. Job Completion: সব Step সম্পন্ন হলে Job সফলভাবে বা ব্যর্থভাবে শেষ হয়।

Job এর কাজের প্রক্রিয়া: বিস্তারিত বর্ণনা

  1. Job Configuration:
    প্রথমে একটি Job কনফিগার করা হয়, যাতে Job-এর ভেতরে বিভিন্ন Step থাকে। প্রতিটি Step এর মধ্যে একটি নির্দিষ্ট কার্যকলাপ (ItemReader, ItemProcessor, ItemWriter) নির্ধারিত হয়। Job এবং Step গুলি JobLauncher দিয়ে রান করা হয়।
  2. Step Execution:
    প্রতিটি Step নিজস্ব কাজ শুরু করার আগে তার নির্দিষ্ট কনফিগারেশন বা ডেটা প্রস্তুতি গ্রহণ করে। Step সাধারণত নিম্নলিখিত স্টেপগুলির মাধ্যমে কাজ করে:
    • ItemReader: Step প্রথমে ডেটা রিড করে (যেমন, ডেটাবেস থেকে, ফাইল থেকে বা অন্য কোনো উৎস থেকে)।
    • ItemProcessor: পরে এই রিড করা ডেটার উপর প্রক্রিয়া (transform) করা হয়।
    • ItemWriter: শেষে, প্রসেস করা ডেটা কোথাও (যেমন, ডেটাবেস, ফাইল) রাইট করা হয়।
  3. Job Completion:
    সব Step সফলভাবে সম্পন্ন হলে, Job সম্পন্ন হয়ে যায় এবং JobExecution এর স্ট্যাটাস "COMPLETED" হয়ে যায়। যদি কোনো Step ব্যর্থ হয়, তাহলে JobExecution এর স্ট্যাটাস "FAILED" হয়ে যায়।

Spring Batch এ Job এর উদাহরণ

ধরা যাক, আমাদের একটি Job তৈরি করতে হবে যা একটি CSV ফাইল থেকে ডেটা পড়ে, তা প্রসেস করে এবং ডেটাবেসে সেভ করে।

১. Job Configuration:

@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();
    }
}

২. ItemProcessor Class:

public class UserItemProcessor implements ItemProcessor<User, User> {
    @Override
    public User process(User item) throws Exception {
        // নাম ক্যাপিটালাইজ করুন
        item.setName(item.getName().toUpperCase());
        return item;
    }
}

৩. User Entity:

public class User {
    private Long id;
    private String name;
    private String email;

    // Getters and Setters
}

৪. CSV File (users.csv):

1,John,john@example.com
2,Jane,jane@example.com
3,David,david@example.com

Job Execution Process

  1. Job Initialization:
    importUserJob Job তৈরি হয় এবং এটি একটি Step এর মধ্যে চলবে (এখানে Step1)। Job Execution শুরু হয়।
  2. Step Execution:
    Step1 শুরু হয়, যেখানে ItemReader CSV ফাইল থেকে ডেটা রিড করে, ItemProcessor ডেটাকে প্রসেস করে (নামকে ক্যাপিটালাইজ করে), এবং ItemWriter ডেটাবেসে সেভ করে।
  3. Job Completion:
    Step1 সম্পন্ন হলে, Job শেষ হয়ে যায়। যদি Step সফল হয়, Job Execution সফলভাবে "COMPLETED" স্ট্যাটাস পায়, এবং কোনো ত্রুটি হলে "FAILED" স্ট্যাটাস দেখা যাবে।

Job Execution এবং Job Parameters

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 প্রসেস, ডেটা মাইগ্রেশন, রিপোর্টিং এবং বিলিং সিস্টেমের মতো কার্যক্রম সহজে এবং দক্ষতার সাথে সম্পাদন করা যায়।

Content added By

XML এবং Java-based Job Configuration

94
94

স্প্রিং ব্যাচ (Spring Batch) একটি শক্তিশালী ফ্রেমওয়ার্ক যা বড় পরিমাণ ডাটা প্রসেসিংয়ের জন্য ব্যবহৃত হয়। এতে ব্যাচ প্রসেসের বিভিন্ন ধাপ এবং স্টেপ কনফিগার করার জন্য দুটি প্রধান কনফিগারেশন পদ্ধতি রয়েছে: XML কনফিগারেশন এবং Java-based কনফিগারেশন। স্প্রিং ব্যাচে XML এবং Java-based কনফিগারেশন দুটি নির্দিষ্ট ভাবে ব্যবহৃত হয়, এবং দুটি কনফিগারেশন স্টাইলই যথেষ্ট জনপ্রিয়।

এখানে আমরা এই দুই কনফিগারেশন পদ্ধতির ব্যবহার এবং তাদের পার্থক্য সম্পর্কে আলোচনা করব।


XML-based Job Configuration

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 কনফিগার করা হয়েছে, যা ব্যাচ প্রসেসিংয়ের ধাপগুলিকে সংজ্ঞায়িত করে। একাধিক স্টেপের মাধ্যমে একটি জব কনফিগার করা হয়েছে এবং ব্যাচ প্রসেসিং সম্পন্ন হয়।

XML-based Configuration এর সুবিধা:

  • স্পষ্ট কনফিগারেশন এবং শাখায় ভাগ করা সহজ।
  • বড় অ্যাপ্লিকেশনগুলিতে গঠনমূলক কনফিগারেশন সুবিধা প্রদান করে।
  • স্প্রিং ফ্রেমওয়ার্কের ক্লাসের মধ্যে গভীর সম্পর্ক রয়েছে, তাই XML ফাইলের মাধ্যমে স্পষ্টভাবে কনফিগারেশন করা সম্ভব।

Java-based Job Configuration

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 ক্লাসের মাধ্যমে কনফিগার করা হয়েছে। এটি খুবই ফ্লেক্সিবল এবং কাস্টমাইজেশন সহজ করে।

Java-based Configuration এর সুবিধা:

  • টাইপ সেফটি এবং এডিটর সাপোর্ট পাওয়া যায়।
  • কোডের মাধ্যমে কনফিগারেশন করা অনেক বেশি স্পষ্ট এবং ডিবাগিং করা সহজ।
  • কমপ্লেক্স কনফিগারেশন এবং প্রোগ্রাম্যাটিক নিয়ন্ত্রণ সহজ হয়।

XML এবং Java-based Configuration এর পার্থক্য

বৈশিষ্ট্যXML-based ConfigurationJava-based Configuration
কনফিগারেশন স্টাইলXML ফাইল ব্যবহার করা হয়Java কোডের মধ্যে কনফিগারেশন করা হয়
ফ্লেক্সিবিলিটিতুলনামূলকভাবে কমঅনেক বেশি ফ্লেক্সিবল
প্রত্যাহারের সহজতাXML ফাইলের মাধ্যমে সহজকোডের মাধ্যমে আরো সহজ এবং ডিবাগযোগ্য
টাইপ সেফটিসাধারণত কমটাইপ সেফ এবং IDE সাপোর্ট রয়েছে
কাস্টমাইজেশনXML কনফিগারেশন অনুযায়ীকোডে কাস্টম লজিক প্রয়োগ করা যায়

সারাংশ

স্প্রিং ব্যাচে XML-based এবং Java-based কনফিগারেশন উভয় পদ্ধতি ব্যবহৃত হয়। XML-based কনফিগারেশন একটি দীর্ঘ সময়ের জন্য ব্যবহৃত হলেও, Java-based কনফিগারেশন বেশি আধুনিক এবং আরো ফ্লেক্সিবল। Java-based কনফিগারেশন স্প্রিং অ্যাপ্লিকেশনের কোডিং প্রক্রিয়াকে আরো পরিষ্কার, টাইপ সেফ এবং ডিবাগযোগ্য করে তোলে। দুইটি পদ্ধতিই স্প্রিং ব্যাচের শক্তিশালী কাজের জন্য যথেষ্ট কার্যকর, তবে আপনার প্রজেক্টের প্রয়োজন অনুযায়ী আপনি একটি বেছে নিতে পারেন।


Content added By

Job Parameters এবং JobExecutionContext

119
119

স্প্রিং ব্যাচ (Spring Batch) একটি শক্তিশালী ফ্রেমওয়ার্ক যা ব্যাচ প্রসেসিংয়ের জন্য ব্যবহৃত হয়। এর মাধ্যমে আমরা একটি বা একাধিক স্টেপে কাজ করতে পারি এবং প্রতিটি কাজের মধ্যে প্রক্রিয়া নির্ধারণ করতে পারি। এই প্রক্রিয়াগুলোর মধ্যে Job Parameters এবং JobExecutionContext দুটি গুরুত্বপূর্ণ উপাদান, যা ব্যাচ প্রসেসের মধ্যে ডেটা শেয়ার এবং কনফিগারেশন পরিচালনা করতে সাহায্য করে। এই দুটি উপাদানকে স্পষ্টভাবে বোঝা গেলে ব্যাচ প্রোসেসিং আরও কার্যকরী এবং নিয়ন্ত্রিত করা যায়।

Job Parameters

Job Parameters হল সেই ভ্যালু যা একটি স্প্রিং ব্যাচ জব চালানোর সময় পাস করা হয়। এগুলি সাধারণত ইনপুট হিসাবে ব্যবহার করা হয় এবং ব্যাচ জবের execution শুরু করার সময় বিভিন্ন প্রপার্টি বা কনফিগারেশন ভ্যালু হিসাবে প্রেরণ করা হয়। Job Parameters এর মাধ্যমে আমরা বিভিন্ন ধরনের ইনপুট কনফিগারেশন বা তথ্য জব এক্সিকিউশন শুরু করার আগে সেট করতে পারি, যেমন— ডেটা ফাইলের লোকেশন, ডেটাবেস কানেকশন ডিটেইলস, সময় বা নির্দিষ্ট কোনও কাস্টম প্যারামিটার।

Job Parameters এর উদাহরণ:

  1. এনভায়রনমেন্ট ভ্যালু: যেমন, প্রোডাকশন অথবা ডেভেলপমেন্ট পরিবেশের জন্য বিভিন্ন প্যারামিটার পাস করা।
  2. ফাইল লোকেশন: কোন ফাইল থেকে ডেটা পড়তে হবে বা কোথায় আউটপুট লিখতে হবে, সে সম্পর্কিত প্যারামিটার।
  3. টাইমস্ট্যাম্প: বিশেষ সময়সীমায় ব্যাচ এক্সিকিউশন চালাতে চান, সে সম্পর্কিত প্যারামিটার।

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

JobExecutionContext হল একটি কনটেক্সট অবজেক্ট যা একটি Job এর execution চলাকালে বা শেষ হওয়ার পর ব্যাচ প্রসেসে প্রয়োজনীয় তথ্য বা অবস্থা (state) সংরক্ষণ করতে ব্যবহৃত হয়। এটি একটি জবের মধ্যে পারস্পরিক অবস্থা বা ডেটা শেয়ার করতে সাহায্য করে এবং এটি কেবল ব্যাচ প্রসেসের চলমান স্টেপগুলির মধ্যে ডেটা শেয়ার করতে ব্যবহৃত হয়।

JobExecutionContext-এর মাধ্যমে, আপনি একটি জবের execution এর সময় প্রয়োজনীয় intermediate ফলাফল বা স্টেট সংরক্ষণ করতে পারেন, যা পরবর্তী স্টেপে কাজে আসতে পারে। একে আপনি মূলত ডেটা ক্যাশিং বা অবস্থা ট্র্যাকিংয়ের জন্য ব্যবহার করতে পারেন।

JobExecutionContext এর ব্যবহার:

যখন একটি জব 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 এর মধ্যে পার্থক্য

বৈশিষ্ট্যJob ParametersJobExecutionContext
ব্যবহারজব শুরু করার সময় ইনপুট হিসেবে ব্যবহৃত প্যারামিটার।জব চলাকালে বা শেষে ডেটা বা স্টেট সংরক্ষণের জন্য ব্যবহৃত।
লাইট-ওয়েটহ্যাঁ, এটি সাধারণত স্ট্রিং এবং অন্যান্য প্রিমিটিভ টাইপ প্যারামিটার ধারণ করে।এটি সাধারণত অবজেক্টগুলো ধারণ করে এবং জবের execution চলাকালীন তথ্য রাখে।
ডেটার ধরনস্ট্রিং, লং, ডাবল, ডেট টাইপ ডেটা।কোনো ধরনের অবজেক্ট (যেমন, Integer, List, Map, ইত্যাদি)।
কোন সময় ব্যবহার করা হয়?জব রান করার সময় পাস করা হয়।এক বা একাধিক স্টেপে ডেটা শেয়ার করতে ব্যবহৃত হয়।

সারাংশ

Job Parameters এবং JobExecutionContext দুটি অত্যন্ত গুরুত্বপূর্ণ উপাদান যা স্প্রিং ব্যাচে ব্যাচ প্রসেসিংকে আরো গতিশীল এবং কার্যকরী করে তোলে। Job Parameters ব্যবহার করে আপনি ব্যাচ জব চালানোর জন্য প্রয়োজনীয় ইনপুট প্যারামিটার পাস করতে পারেন, আর JobExecutionContext ব্যবহারের মাধ্যমে আপনি ব্যাচ জব চলাকালে বা শেষে স্টেট বা মধ্যবর্তী ডেটা সংরক্ষণ করতে পারেন। এই দুটি উপাদান ব্যাচ প্রোসেসিংয়ের নিয়ন্ত্রণ এবং ফলাফল ট্র্যাকিং সহজ করে তোলে।

Content added By

উদাহরণ সহ Spring Batch Job তৈরি

137
137

স্প্রিং ব্যাচ (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 ডিপেনডেন্সি ডেটাবেস সংযোগের জন্য ব্যবহৃত হবে।


২. Batch Job তৈরি করা

স্প্রিং ব্যাচে একটি Job তৈরি করতে, প্রথমে Step তৈরি করতে হয়। একটি Job একাধিক Step নিয়ে গঠিত হতে পারে, যেখানে প্রতিটি Step একটি নির্দিষ্ট কার্যক্রম সম্পাদন করে।

Step 1: Data Model (Entity) তৈরি করা

ধরা যাক আমরা একটি সিম্পল 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 ফিল্ড রয়েছে।


Step 2: ItemReader, ItemProcessor, এবং ItemWriter তৈরি করা

স্প্রিং ব্যাচে ItemReader, ItemProcessor, এবং ItemWriter ব্যবহার করে ব্যাচে ডেটা পড়া, প্রক্রিয়া করা এবং লেখা হয়।

  • ItemReader: ডেটা পড়ার জন্য।
  • ItemProcessor: ডেটা প্রক্রিয়া করার জন্য।
  • ItemWriter: ডেটা লেখার জন্য।
ItemReader
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 ক্লাস ডেটা পড়ার জন্য একটি সিম্পল লিস্ট ব্যবহার করছে।

ItemProcessor
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 ক্লাস নামের প্রথম অক্ষরগুলো বড় করে দেয়।

ItemWriter
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 কনসোল আউটপুটে ব্যবহারকারীর নাম লিখবে।


Step 3: Batch Job Configuration

এখন, আমরা একটি 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 এর মাধ্যমে ডেটা একটি নির্দিষ্ট আকারে প্রসেস করা হয়। এখানে আমরা chunk(2) ব্যবহার করেছি, অর্থাৎ প্রতি ২টি রেকর্ডে একটি ব্যাচ প্রক্রিয়া করা হবে।
  • Job কনফিগারেশন তৈরি করা হয়েছে, যা একটিই Step নিয়েছে।

Step 4: Application Run Configuration

স্প্রিং বুট অ্যাপ্লিকেশন চালানোর জন্য মূল ক্লাস তৈরি করা:

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 ব্যবহার করতে পারেন।

Content added By
Promotion