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

Spring批处理分区步骤未运行

单于高逸
2023-03-14

我试图配置我的第一个多线程作业。我们有大约200,000条记录的主目录,我们需要处理。我想将文件分解为10个文件并处理它们。拆分文件tasklet工作正常

主步骤在我的配置中运行,但从步骤不运行。下面是我的配置。

分割者:

<bean id="partitioner"
    class="org.springframework.batch.core.partition.support.MultiResourcePartitioner"
    scope="step">
    <property name="resources" value="#{jobParameters['urlFilesPath']}" />
</bean>

MultiResourceItemReader:

<bean id="multiResourceItemReader"
    class="org.springframework.batch.item.file.MultiResourceItemReader"
    scope="step">
    <property name="resources" value="#{jobParameters['urlFilesPath']}" />
    <property name="delegate" ref="urlFileItemReader" />
    <property name="strict" value="true" />
    <property name="saveState" value="false" />
</bean>

FlatFileItemWriter:

<bean id="urlFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader"
scope="step">
    <property name="lineMapper" ref="passThroughLineMapper" />      
    <property name="resource" value="#{stepExecutionContext['fileName']}" /> 
    <property name="saveState" value="true" /> 
</bean>

作业配置:

<batch:job id="importJob" job-repository="jobRepository">
    <batch:step id="fileSplitter" next="readURLFileRunner">
        <batch:tasklet ref="fileSplittingTasklet"
            transaction-manager="transactionManager" />
    </batch:step>

    <batch:step id="readURLFileRunner">
        <batch:partition step="readURLFile" partitioner="partitioner">
            <batch:handler grid-size="10" task-executor="taskExecutor" />
        </batch:partition>
    </batch:step>
</batch:job>

从属步骤配置:

<batch:step id="readURLFile">
    <batch:tasklet transaction-manager="transactionManager"
        task-executor="taskExecutor" throttle-limit="10">
        <batch:chunk reader="multiResourceItemReader" processor="urlFileItemProcessor"
            writer="validURLItemWriter" commit-interval="200" skip-limit="100">
            <batch:skippable-exception-classes>
                <batch:include class="java.net.MalformedURLException" />
                <batch:include class="java.net.URISyntaxException" />
                <batch:include class="java.net.UnknownHostException" />
            </batch:skippable-exception-classes>
        </batch:chunk>
        <batch:listeners>
            <batch:listener ref="malformedURLExceptionListener" />
            <batch:listener ref="uriSyntaxExceptionListener" />
            <batch:listener ref="unknownHostExceptionListener" />
        </batch:listeners>
    </batch:tasklet>
    <batch:end on="COMPLETED" />
</batch:step>

请告知我做错了什么。我没有看到处理器urlFileItemProcessor

更新我遵循@dimzak给出的答案。但我仍然没有看到正在执行的步骤readURLFile和来自urlFileItemProcessor的记录器

org.springframework.batch.repeat.support.TaskExecutorRepeatTemplate - Starting repeat context.

我怀疑我配置步骤范围的方式。

步进镜配置

<bean class="org.springframework.batch.core.scope.StepScope">
    <property name="autoProxy" value="true"/>
    <property name="proxyTargetClass" value="true"/>
</bean>

在Spring论坛上,我读到了multiResourceItemReader的委托属性不需要在步骤范围内。当我从urlFileItemReader中删除scope=“step”时,我得到了以下异常。

    INFO : 26 Sep 2014 00:10:58,811 - org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor - Initializing ExecutorService  'taskExecutor'
INFO : 26 Sep 2014 00:10:59,066 - org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor - Shutting down ExecutorService 'taskExecutor'
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'urlFileItemReader' defined in class path resource [beansBatchService.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanExpressionException: Expression parsing failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Field or property 'stepExecutionContext' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext'
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:547)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at com.chw.hma.service.batch.jobrunner.MainJobRunner.run(MainJobRunner.java:29)
    at com.chw.hma.service.batch.jobrunner.MainJobRunner.main(MainJobRunner.java:21)
Caused by: org.springframework.beans.factory.BeanExpressionException: Expression parsing failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Field or property 'stepExecutionContext' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext'
    at org.springframework.context.expression.StandardBeanExpressionResolver.evaluate(StandardBeanExpressionResolver.java:146)
    at org.springframework.beans.factory.support.AbstractBeanFactory.evaluateBeanDefinitionString(AbstractBeanFactory.java:1364)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.evaluate(BeanDefinitionValueResolver.java:214)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:186)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1456)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1197)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
    ... 12 more
Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Field or property 'stepExecutionContext' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext'
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:217)
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:85)
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:78)
    at org.springframework.expression.spel.ast.CompoundExpression.getValueRef(CompoundExpression.java:49)
    at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:85)
    at org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:102)
    at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:94)
    at org.springframework.context.expression.StandardBeanExpressionResolver.evaluate(StandardBeanExpressionResolver.java:143)
    ... 18 more

请指教。

更新日期:2014年9月27日

按照@dimzak的建议发布任务执行器等

<bean id="taskExecutor"
    class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <property name="corePoolSize" value="10" />
    <property name="maxPoolSize" value="10" />
</bean>

<bean id="jobRepository"
    class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
    <property name="transactionManager" ref="transactionManager" />
    <property name="dataSource" ref="dataSource" />
    <property name="databaseType" value="mySQL" />
</bean>

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

共有1个答案

符学
2023-03-14

MultiResourcePartitioner采用文件:/scraser/spliturl*并以不同的步骤拆分每个文件,如spliturl1、spliturl2。

之后,在从步骤中,您只需读取此步骤的特定文件。因此,您的配置应该没有MultiResourceItemReader

<batch:step id="readURLFile">
    <batch:tasklet transaction-manager="transactionManager"
        task-executor="taskExecutor" throttle-limit="10">
        <batch:chunk reader="urlFileItemReader" processor="urlFileItemProcessor"
            writer="validURLItemWriter" commit-interval="200" skip-limit="100">
            <batch:skippable-exception-classes>
                <batch:include class="java.net.MalformedURLException" />
                <batch:include class="java.net.URISyntaxException" />
                <batch:include class="java.net.UnknownHostException" />
            </batch:skippable-exception-classes>
        </batch:chunk>
        <batch:listeners>
            <batch:listener ref="malformedURLExceptionListener" />
            <batch:listener ref="uriSyntaxExceptionListener" />
            <batch:listener ref="unknownHostExceptionListener" />
        </batch:listeners>
    </batch:tasklet>
    <batch:end on="COMPLETED" />
</batch:step>
 类似资料:
  • 我正在尝试为分区配置Spring批处理步骤。这里很好的示例显示了一个关于“ID范围”的分区,但我不知道如何从“数据页”范围开始。 在我的顺序步骤中,我有: null

  • 给定一个使用分区的Spring批处理作业,是否可能有多个分区步骤? 例如: 在上述示例中,是否可以将另一个添加到(最好不需要为每个分区步骤提供分区器)?如果没有,是否有其他方法来配置多个步骤,这些步骤将针对每个分区逐个执行?

  • 我们在POC中使用远程分区,处理大约2000万条记录。为了处理这些记录,slave需要一些大约5000行的静态元数据。我们当前的POC使用EhCache从数据库一次将元数据加载到从机中,并将其放入缓存中,这样子用户调用就可以从缓存中获取这些数据,从而获得更好的性能。 现在,由于我们使用远程分区,我们的从机大约有20个MDP/线程,因此每个消息侦听器首先调用以从数据库获取元数据,因此基本上每个远程机

  • 使用Spring Batch 3.0.4.Release。 我将作业配置为使用分区步骤。从机步骤使用块大小1。任务执行器中有六个线程。我使用从六到数百的各种网格大小来运行这个测试。我的网格大小是从StepExecutions的数量,我希望==我的分区器创建的ExecutionContexts的数量。 下面是Java配置代码:

  • 我正在尝试修复Spring Batch中的一个问题,这个问题最近一直困扰着我们的系统。我们有一份工作,在大多数情况下都很好。下载和处理数据是一个多步骤的工作。 问题是有时工作会爆棚。也许我们试图连接到的服务器抛出了错误,或者我们在工作进行到一半时关闭了服务器。此时,下次我们的quartz调度程序尝试运行该作业时,它似乎什么也不做。以下是此作业定义的删节版本: 委婉地说,我是Spring Batch

  • 我对spring batch基本上是新手。第一步,我从SFTP服务器获取一个文件,并使用JSch将其传输到本地目录。第二步,我读取本地目录中的文件,并将内容写入数据库。问题在于,在某些情况下,只执行saveDruchAltransaction(步骤2),而不执行getRemoteFile(步骤1) 配置类: 读者: 作家: 微线程: 我不知道该怎么做...我一直在尝试我从各地找到的东西。请帮忙谢谢