Spring ‌Batch چیست؟

من حسین کورائی قصد دارم در این مقاله توضیحاتی در خصوص شناخت Spring Batch ارائه دهم. بسیاری از برنامه های کاربردی در حوزه سازمانی نیاز به پردازش انبوه برای انجام کارها دارند. مانند :

  • پردازش خودکار و پیچیده حجم زیادی از اطلاعات که بیشترین کارایی را داراست بدون تعامل کاربر پردازش می‌شود. این عملیات معمولاً شامل رویدادهای مبتنی بر زمان است (مانند محاسبات پایان ماه، اعلامیه‌ها، یا مکاتبات).
  • بسیاری از برنامه‌ها محاسبات پیچیده‌ی را به‌صورت دوره‌ای و یا لحظه‌ای بر روی داده‌های بزرگ انجام می‌دهند. به عنوان مثال تعیین مزایای بیمه یا تعدیل نرخ.
  • ادغام اطلاعاتی که معمولاً از سیستم‌های داخلی و خارجی دریافت می شود و نیاز به قالب بندی، اعتبارسنجی و پردازش رکورد‌ها دارد. پردازش Batch برای پردازش میلیاردها تراکنش روزانه برای شرکت‌ها استفاده می‌شود.

تعریف Spring ‌Batch :

Spring Batch یک فریم‌ورک ساده و جامع است که برای توسعه عملیات روزانه سیستم های سازمانی ضروری است. Spring Batch بر اساس ویژگی‌های فریم‌ورک Spring (بهره‌وری، رویکرد توسعه مبتنی بر POJO ، و سهولت استفاده عمومی) شرایطی را برای توسعه‌دهندگان فراهم می‌کند که به سرویس‌های پیشرفته‌تری از امکانات enterprise فریم ورک دسترسی داشته‌باشند.

این فریم‌ورک از معماری سنتی Batch که در آن یک ریپازیتوری مسئولیت زمان‌بندی و تعامل با سایر jobها را بر عهده دارد، استفاده می‌کند. که در این جا یک job می‌تواند بیش از یک مرحله به طول بیانجامد. در هر مرحله دنباله‌ای از اعمال همچون خواندن داده‌ها، پردازش و نوشتن آن‌ها انجام می‌شود.

 

کاربرد‌ها :

  1. خواندن تعداد زیادی رکورد از دیتابیس، فایل یا صف
  2. پردازش داده‌ها با روش‌های مختلف
  3. نوشتن داده به صورت اصلاح شده
  4. انجام فرایندها به صورت دوره‌ای
  5. اجرای همزمان jobها به صورت موازی
  6. اجرای موازی انبوه
  7. راه اندازی مجدد دستی یا برنامه ریزی شده پس از خرابی
  8. تراکنش دسته ای، برای مواردی با اندازه دسته کوچک procedures/scripts ذخیره شده

 

معماری Spring ‌Batch :

Spring Batch با تست بر روی گروه‌های متنوعی از کاربران طراحی شده‌است. شکل زیر نشان‌دهنده معماری لایه‌ای و سهولت استفاده از آن است.

 

فیچر‌های جدید Spring Batch 4.3 :

  • synchronized ItemStreamWriter جدید
  • JpaQueryProvider جدید برای نام نام‌گذاری کوئری ها
  • پیاده سازی جدید JpaCursorItemReader
  • پیاده سازی JobParametersIncrementer جدید
  • پشتیبانی از GraalVM
  • پشتیبانی از Java Records
    @Bean
    public FlatFileItemReader<Person> itemReader() {
      return new FlatFileItemReaderBuilder<Person>()
      .name("personReader")
      .resource(new FileSystemResource("persons.csv"))
      .delimited()
      .names("id", "name")
      .fieldSetMapper(new RecordFieldSetMapper<>(Person.class))
      .build();
    }

     

  • استفاده از نوشتار انبوه در RepositoryItemWriter
  • استفاده از نوشتار انبوه در MongoItemWriter
  • بهبود زمانبندی شروع/توقف job‌ها

 

Dependency :

همان‌طور که پیش‌تر بیان کردیم، Spring Batch جهت اجرا نیاز به دیتابیس SQLite دارد. از این‌رو ابتدا می‌بایست در فایل pom.xml موارد زیر را اضافه کنیم:

<dependency>
    <groupId>org.xerial</groupId>
    <artifactId>sqlite-jdbc</artifactId>
    <version>3.15.1</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-oxm</artifactId>
    <version>5.3.0</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.0</version>
</dependency>
<dependency>
    <groupId>org.springframework.batch</groupId>
    <artifactId>spring-batch-core</artifactId>
    <version>4.3.0</version>
</dependency>

 

و همین‌طور یک فایل Batch config با خصوصیات زیر :

<!-- connect to SQLite database -->
<bean id="dataSource"
  class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.sqlite.JDBC" />
    <property name="url" value="jdbc:sqlite:repository.sqlite" />
    <property name="username" value="" />
    <property name="password" value="" />
</bean>

<!-- create job-meta tables automatically -->
<jdbc:initialize-database data-source="dataSource">
    <jdbc:script
      location="org/springframework/batch/core/schema-drop-sqlite.sql" />
    <jdbc:script location="org/springframework/batch/core/schema-sqlite.sql" />
</jdbc:initialize-database>

<!-- stored job-meta in memory -->
<!-- 
<bean id="jobRepository" 
  class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean"> 
    <property name="transactionManager" ref="transactionManager" />
</bean> 
-->

<!-- stored job-meta in database -->
<bean id="jobRepository"
  class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="transactionManager" ref="transactionManager" />
    <property name="databaseType" value="sqlite" />
</bean>

<bean id="transactionManager" class=
  "org.springframework.batch.support.transaction.ResourcelessTransactionManager" />

<bean id="jobLauncher"
  class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
    <property name="jobRepository" ref="jobRepository" />
</bean>

 

و فایل job config :

<import resource="spring.xml" />

<bean id="record" class="com.baeldung.spring_batch_intro.model.Transaction"></bean>
<bean id="itemReader"
  class="org.springframework.batch.item.file.FlatFileItemReader">

    <property name="resource" value="input/record.csv" />

    <property name="lineMapper">
        <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
            <property name="lineTokenizer">
                <bean class=
                  "org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
                    <property name="names" value="username,userid,transactiondate,amount" />
                </bean>
            </property>
            <property name="fieldSetMapper">
                <bean class="com.baeldung.spring_batch_intro.service.RecordFieldSetMapper" />
            </property>
        </bean>
    </property>
</bean>

<bean id="itemProcessor"
  class="com.baeldung.spring_batch_intro.service.CustomItemProcessor" />

<bean id="itemWriter"
  class="org.springframework.batch.item.xml.StaxEventItemWriter">
    <property name="resource" value="file:xml/output.xml" />
    <property name="marshaller" ref="recordMarshaller" />
    <property name="rootTagName" value="transactionRecord" />
</bean>

<bean id="recordMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="classesToBeBound">
        <list>
            <value>com.baeldung.spring_batch_intro.model.Transaction</value>
        </list>
    </property>
</bean>
<batch:job id="firstBatchJob">
    <batch:step id="step1">
        <batch:tasklet>
            <batch:chunk reader="itemReader" writer="itemWriter"
              processor="itemProcessor" commit-interval="10">
            </batch:chunk>
        </batch:tasklet>
    </batch:step>
</batch:job>

 

و در آخر

در این مقاله سعی شده که توضیحاتی پیرامون شناخت Spring Batch ارائه شود.

وبسایت میربزرگی قصد دارد تا با ارائه مقاله ها و تجربه‌های کاربردی شما را در زمینه یادگیری و رفع اشکالاتتان کمک کند. در صورت وجود هرگونه سوالی به من ایمیل بزنید.

 

ارسال دیدگاه

22 + = 32

در صورت نیاز و یا هر گونه مشکل ایمیل بزنید

پیام با موفقیت ثبت شد.
خطایی رخ داده است.