当前位置: 首页 > 知识库问答 >
问题:

Spring批处理运行JobLauncher

徐新荣
2023-03-14

我在我的项目中集成了Spring Batch,我在运行JobLauncher时遇到了问题。

在我的类JobLauncher我有这个:

  public class XXXJobLauncher {
@Autowired
@Qualifier("testJob")
Job testJob;

@Autowired
JobLauncher jobLauncher;

@ServiceActivator
public void run(FileMetaData fileMetaData) {
    ///

    JobParametersBuilder jobParametersBuilder = new JobParametersBuilder();
    jobParametersBuilder.addString("uuiid", fileMetaData.getUuid());
    jobParametersBuilder.addLong("id", dataImport.getId());

    try {
        jobLauncher.run(testJob, jobParametersBuilder.toJobParameters());
    } catch (JobExecutionAlreadyRunningException | JobRestartException | JobParametersInvalidException | JobInstanceAlreadyCompleteException e) {
        e.printStackTrace();
    }
}

对于配置,我使用XML配置:

配置批处理。xml:

     <import resource="classpath:job-config.xml"/>

<bean id="jobRepositoryFactory" class="org.springframework.batch.core.explore.support.JobExplorerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="tablePrefix" value="BATCH_"/>
</bean>

<bean id="jobRepository" class="org.springframework.batch.core.repository.support.SimpleJobRepository"
      factory-bean="jobRepositoryFactory"/>

<bean id="batchTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"
      destroy-method="shutdown">
    <property name="corePoolSize" value="6"/>
    <property name="allowCoreThreadTimeOut" value="true"/>
    <property name="waitForTasksToCompleteOnShutdown" value="true"/>
</bean>

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

在作业配置中。我有:

   <batch:job id="testJob"
           incrementer="incrementer"
           job-repository="jobRepository">
    <batch:step id="Step1">
        <batch:tasklet throttle-limit="4"
                       transaction-manager="transactionManager"
                       task-executor="batchTaskExecutor">
            <batch:chunk reader="XXXReader"
                         processor="passThroughItemProcessor"
                         writer="XXXWriter"
                         skip-limit="100"
                         commit-interval="10">
                <batch:skippable-exception-classes>
                    <batch:include class="org.springframework.batch.item.file.FlatFileParseException"/>
                </batch:skippable-exception-classes>
                <batch:listeners>
                    <batch:listener ref="XXXListener"/>
                </batch:listeners>
            </batch:chunk>
        </batch:tasklet>
    </batch:step>
</batch:job>

<bean id="XXXReader"
      class="com.reader.XXXReader"
      scope="step">
    <constructor-arg value="#{jobParameters[uuiid]}" name="uuiid"/>
</bean>

<bean id="XXXWriter"
      class="com.writer.XXXWriter"
      scope="step">
    <constructor-arg value="#{jobParameters[ id]}" name="id"/>
</bean>

<bean id="XXXListener"
      class="com.listener.XXXListener">
</bean>

<bean id="passThroughItemProcessor" class="org.springframework.batch.item.support.PassThroughItemProcessor"/>

<bean id="incrementer" class="org.springframework.batch.core.launch.support.RunIdIncrementer"/>

当我在类JobLauncher中调试时,它会在jobLuancher中停止。运行,我也不例外,似乎SpringBatch无法识别reader和whriter!!有什么建议吗?

共有1个答案

丁阳炎
2023-03-14

我解决了batchConfig中的问题。xml:

<batch:job-repository id="jobRepository"
                      data-source="dataSource"
                      transaction-manager="batchTransactionManager"/>

<bean class="org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor">
    <property name="jobRegistry" ref="jobRegistry"/>
</bean>

<bean id="jobRegistry" class="org.springframework.batch.core.configuration.support.MapJobRegistry"/>

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

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

<bean id="batchTaskExecutor"
      class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"
      destroy-method="shutdown">
    <property name="corePoolSize" value="4"/>
    <property name="allowCoreThreadTimeOut" value="true"/>
    <property name="waitForTasksToCompleteOnShutdown" value="true"/>
</bean>

<bean id="jobExplorer"
      class="org.springframework.batch.core.explore.support.JobExplorerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
</bean>
 类似资料:
  • 我的Spring批处理过程运行了两次。 在这里阅读这个链接后,我添加了到我的application.yml.但是作业本身没有运行。 然后我尝试对我的作业配置类进行一些修改。我将实例变量移动到方法参数,希望能解决这个问题。但是再也没有运气了。 配置类 AppConfig.java更新 日志: 从日志中,您可以注意到 ***********处理器**********打印两次。(处理器每次打印两次,因为

  • 当我使用Spring批处理管理运行长时间运行的批处理作业的多个实例时,它会在达到jobLauncher线程池任务执行程序池大小后阻止其他作业运行。但是从cron中提取多个工作似乎效果不错。下面是作业启动器配置。 Spring批处理管理员Restful API是否使用不同于xml配置中指定的作业启动器?

  • 我正在使用spring批处理读取CSV文件并使用controller触发器将其写入DB。在启动应用程序时,在我从浏览器url中点击之前,我会在启动时看到来自阅读器的打印语句。虽然它不为我的处理器或写入器打印它,它们是在单独的类中,我已经自动连线。是因为读者是豆子吗?

  • 我不知道如何使用调用Spring批处理中定义的作业,文档细节对我来说是不够的。 我遵循了Spring Batch官方指南,使用Java注释(例如)在Spring Batch中编写作业,因为我希望避免使用XML配置文件来描述作业、步骤等。 到目前为止我已经: 配置类(见下文),我使用AnnotaIon将定义、、、和(带有的所有内容放入其中。 具有方法的类,该方法具有并具有注释,以导入处理作业中的数据

  • 我有一个作业流,我希望以以下方式运行它: 作业流将从Job1开始。在Job1成功完成后,Job1将同时启动Job2和Job4。 Job2和Job4将并行运行。 在Job2成功完成后,Job2将启动Job3。 在Job4成功完成后,Job4将启动Job5。 下面是job1.xml和job1的作业启动器类的代码片段: job1.xml uijobLauncher.java “job2,Job3”对和“

  • 问题内容: 运行main方法时,将执行作业。这样我无法弄清楚如何控制作业的执行。例如,您如何安排作业,访问作业执行或设置作业参数的方式。 我试图注册自己的JobLauncher 但是当我尝试在主要方法中使用它时: 当加载上下文时,该作业再次执行,而当我尝试手动运行它时,我得到了。有没有办法防止自动作业执行? 问题答案: 通过设置可以防止作业执行 在application.properties中。或