我正在使用quartz来安排弹簧批处理作业。
作业从文件夹(具有多个文件)中读取文件进行一些处理并将其复制到另一个文件夹。
是否可以创建多个作业实例,这些实例将同时运行,读取多个文件?
我的问题是:
在Spring批处理中,是否可以生成同一作业的多个实例?我正在使用石英计划表?
答案 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>
默认情况下,Quartz Jobs是无状态的,导致作业可能互相干扰。如果为同一JobDetail指定两个触发器,则可能在第一个作业完成之前,第二个作业将启动。如果JobDetail类实现Stateful接口,则不会发生这种情况。第二个作业在第一个作业完成之前不会开始。要使MethodInvokingJobDetailFactoryBean产生的作业非并发,请将concurrent标志设置为false。