是否可以通过 MultiResourceItemReader 处理 currentResource 以使其在 beforeStep 方法中可用。请提供工作代码示例。我尝试将多源资源阅读器引用注入 stepexecutionlistener ,但是spring cglib只接受要注入的接口类型,我不知道是否使用 ItemReader 或 ItemStream 界面。
答案 0 :(得分:4)
MultiResourceItemReader
now has方法getCurrentResource()
,返回当前Resource
。
答案 1 :(得分:1)
currentResource
检索MultiResourceItemReader
。如果您需要此API增强功能,请在Spring Batch JIRA。currentResource
有吸气剂,它的值在beforeStep()
中也无效。它在open()
和close()
之间有效。答案 2 :(得分:1)
如果您使用Partition Step和Binding Input Data to Steps概念
,则可以简单的代码示例,并发限制1来模仿“串行”处理:
<bean name="businessStep:master" class="org.springframework.batch.core.partition.support.PartitionStep">
<property name="jobRepository" ref="jobRepository"/>
<property name="stepExecutionSplitter">
<bean class="org.springframework.batch.core.partition.support.SimpleStepExecutionSplitter">
<constructor-arg ref="jobRepository"/>
<constructor-arg ref="concreteBusinessStep"/>
<constructor-arg>
<bean class="org.spring...MultiResourcePartitioner" scope="step">
<property name="resources" value="#{jobParameters['input.file.pattern']}"/>
</bean>
</constructor-arg>
</bean>
</property>
<property name="partitionHandler">
<bean class="org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler">
<property name="taskExecutor">
<bean class="org.springframework.core.task.SimpleAsyncTaskExecutor">
<property name="concurrencyLimit" value="1" />
</bean>
</property>
<property name="step" ref="concreteBusinessStep"/>
</bean>
</property>
</bean>
<bean id="whateverClass" class="..." scope="step">
<property name="resource" value="#{stepExecutionContext['fileName']}" />
</bean>
示例步骤配置:
<job id="renameFilesPartitionJob">
<step id="businessStep"
parent="businessStep:master" />
</job>
<step id="concreteBusinessStep">
<tasklet>
<chunk reader="itemReader"
writer="itemWriter"
commit-interval="5" />
</tasklet>
</step>
潜在的缺点:
答案 3 :(得分:0)
使用 MultiResourceItemReader 中的 getCurrentResource()方法,更新stepExecution。示例代码如下
private StepExecution stepExecution;
@Override
public Resource getCurrentResource() {
this.stepExecution.getJobExecution().getExecutionContext().put("FILE_NAME", super.getCurrentResource().getFilename());
return super.getCurrentResource();
}
@BeforeStep
public void beforeStep(StepExecution stepExecution) {
this.stepExecution = stepExecution;
}
答案 4 :(得分:0)
如果你让你正在阅读的项目实现ResourceAware,当前资源被设置为阅读
public class MyItem implements ResourceAware {
private Resource resource;
//others
public void setResource(Resource resource) {
this.resource = resource;
}
public Resource getResource() {
return resource;
}
}
在您的阅读器、处理器或编写器中
myItem.getResource()
将返回它从中加载的资源