我们的要求是同时写多个文件。我们正在使用spring批处理来编写文件,并且我们正在从不同的线程中启动spring批处理。每个线程都有自己的应用程序上下文。因此我们可以确保单例bean不会跨多个线程共享。下面是我的代码片段。
<bean id="reportDataReader" class="com.test.ist.batch2.rrm.batch.readers.RRMItmeReader"
scope="step">
<property name="verifyCursorPosition" value="false" />
<property name="dataSource" ref="dataSource" />
<property name="sql" value="#{jobParameters['sqlquery']}" />
<property name="rowMapper" ref="valueMapper" />
<property name="fetchSize" value="5000" />
</bean>
<bean id="valueMapper" class="com.test.ist.batch2.rrm.batch.mappers.DBValueMapper" scope="step"></bean>
<bean id="velocityFileWritter"
class="com.test.ist.batch2.rrm.batch.writers.RRMVelocityFileWriter"
scope="step">
</bean>
<bean id="velocityEngine"
class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
<property name="velocityProperties">
<value>
resource.loader = class
class.resource.loader.class = org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
class.resource.loader.cache = true
class.resource.loader.modificationCheckInterval = 0
</value>
</property>
</bean>
<batch:job id="rrmReportGenJob">
<batch:step id="rrmReportGenStep">
<batch:tasklet>
<batch:chunk reader="reportDataReader" writer="velocityFileWritter"
commit-interval="${reportData.reader.commit-interval}">
</batch:chunk>
</batch:tasklet>
</batch:step>
</batch:job>
这就是我们调用html" target="_blank">spring批处理的方式。
ThreadPoolExecutor TPE=new ThreadPoolExecutor(10,10,1000000,TimeUnit.milliseconds,new LinkedBlockingQueue());PetReportGenerator RRG=新建PetReportGenerator(空);ThreadTest tt=new ThreadTest(new PetReportGenerator(null),“161”);ThreadTest tt2=新建ThreadTest(新建PetReportGenerator(null),“162”);ThreadTest TT3=新建ThreadTest(新建PetReportGenerator(null),“163”);ThreadTest TT4=新建ThreadTest(新建PetReportGenerator(null),“165”);执行(tt);执行(tt2);执行(tt3);执行(tt4);
在PetReportGenerator的构造函数中,我们正在初始化bean配置。下面是代码片段
public PetReportGenerator(ApplicationContext reportContext){
if(null == reportContext){
//if(null == appContext){
appContext=new ClassPathXmlApplicationContext("spring-batch-jobs.xml");
//}
}else{
setAppContext(reportContext);;
}
}
下面是我们如何调用spring批处理的代码摘录
作业jobToExecute=(Job)SpringUtils.getBean(jobName);JobParametersBuilder paramsBuilder=new JobParametersBuilder();//默认情况下,添加数据时间。这将有助于使用相同的参数paramsBuilder.AddLong(“job_time”,System.CurrentTimeMillis())再次执行相同的作业;if(!jobParams.isEmpty()){//验证输入字段。String sqlToUse=validator.validateInput(jobParams);for(map.entry条目:jobParams.entrySet()){
paramsBuilder.addString(entry.getKey(), entry.getValue());
}
}else{
throw new ReportGenerationException("Job input parameter is Empty");
}
jobexe=jobLauncher.run(jobToExecute, paramsBuilder.toJobParameters());
如果它在一个线程中运行,它就可以正常工作。当它被多个线程调用时,我们将得到以下错误
有谁能帮我弄明白是什么地方出了问题吗?
MapJobRepository
不是用于生产的。它不是线程安全的。如果您需要内存中作业存储库的性能(失去可重启性等),请使用内存中数据库,如hsqldb。
撇开这一点不谈,如果您使用的是线程安全组件,那么您没有理由不能用多个线程启动多个作业实例。
我配置了一个spring批处理作业,它在spring WebService中运行。这项工作有几个步骤。我已经在不同的tomcats中部署了这个webservice的两个实例(但两个实例都使用相同的mysql数据库)。 我希望用不同的参数在两个tomcats中同时运行spring批处理作业(每个tomcats中一个)。我没有使用分区,每个作业的参数是完全不同的。 我开始工作在一个汤姆猫和一切看起来很
使用spring batch/spring boot,是否可以在每个线程中使用不同的多次启动具有读取器、处理器和写入器的spring batch作业? 我的用例: 我有许多不同的文件夹,我需要观看。如果新文件进入一个文件夹,我需要调用该作业,并在作业处理期间锁定该文件夹。 这可能发生在不同数量的文件夹中,这就是为什么我需要一个spring批处理作业的多个实例,但每次使用不同的。 每个文件夹一个作业
我可以同时运行我的作业步骤,但我有点担心,如果我用不同的参数同时启动同一作业的多个实例,它将如何工作。 我正在使用importExchange作业导入Exchange数据,但如果我同时为不同的市场如美国市场、欧洲marktet启动importExchange作业。 Partitioner将输入exchange名称分区到不同的分区步骤执行上下文中,MessagePartitionHandler将st
我得和Spring批处理问题。都与通过命令行传入的JobParameters有关。 第一期: 为了从JobParameters获取路径,我使用BeforeStep注释加载JobParameters并将它们复制到局部变量上。不幸的是,这不起作用。变量将为并且执行失败,因为文件无法打开。 如何访问读取器中的作业参数?我想将文件路径作为命令行参数传入,然后读取这个文件。
如果我有两个作业,每个作业都写入不同的数据源,那么在它使用的数据源中写入Spring批处理元数据(jobExecution、结果、...)是有意义的。然而,Spring批处理似乎指示您有一个“主要”数据源用于该元数据。 我定义了两个数据源,都没有标记为主数据源,应用程序无法启动: 我尝试创建两个配置,每个配置都扩展DefaultBatchConfigrer: 另一个完全相同,只是工作和数据源不同。
我是冲刺批次的新手,我找不到问题的答案。 我正在尝试使用Spring引导和Spring批处理实现JOB。我的JOB需要一个参数,所以我像这样执行应用程序: java-jar-Dspring。配置文件。活动=gus/应用程序/botbit批处理/botbit-batch-1.0.0。jar——Spring。一批工作名称=persistCustomerSuccessMetrics日期=2015年12月