我们可以创建同一个java(spring)批处理作业的多个实例吗?

时间:2011-11-11 10:41:18

标签: java spring concurrency quartz-scheduler spring-batch

我正在使用quartz来安排弹簧批处理作业。

作业从文件夹(具有多个文件)中读取文件进行一些处理并将其复制到另一个文件夹。

是否可以创建多个作业实例,这些实例将同时运行,读取多个文件?

我的问题是:

在Spring批处理中,是否可以生成同一作业的多个实例?我正在使用石英计划表?

2 个答案:

答案 0 :(得分:3)

在Spring Batch中,如果您为每个JobParameters调用提供了不同的jobLauncher.run(),则可以启动多个作业。如果配置了适当的任务执行程序,Spring配置中的jobLauncher将在单独的线程中生成每个作业:

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

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"
    p:corePoolSize="5"
    p:maxPoolSize="30" />

答案 1 :(得分:1)

可以使用Quartz,使用MethodInvokingJobDetailFactoryBean,例如:

<bean id="myjob"
    class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject">
        <ref bean="someBean" />
    </property>
    <property name="targetMethod" value="someMethod" />
    <!-- The concurrent property is already true by default
    <property name="concurrent" value="true" />
     -->
</bean>

引用Spring documentation

  

默认情况下,Quartz Jobs是无状态的,导致作业可能互相干扰。如果为同一JobDetail指定两个触发器,则可能在第一个作业完成之前,第二个作业将启动。如果JobDetail类实现Stateful接口,则不会发生这种情况。第二个作业在第一个作业完成之前不会开始。要使MethodInvokingJobDetailFactoryBean产生的作业非并发,请将concurrent标志设置为false。