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

同一spring批处理是否可以同时从不同的多个线程用不同的作业参数调用

康泽宇
2023-03-14

我们的要求是同时写多个文件。我们正在使用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());

如果它在一个线程中运行,它就可以正常工作。当它被多个线程调用时,我们将得到以下错误

有谁能帮我弄明白是什么地方出了问题吗?

共有1个答案

宗增
2023-03-14

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月