如何动态地将资源名称放在FlatFileItemWriter中

时间:2015-01-21 12:36:44

标签: java spring-batch

我想在ItemWriter中动态添加资源名称,名称的前缀来自ItemReader中调用的存储过程。 在每次读取时,值将不同,以便它将自动创建不同的文件。 这是片段: -

<bean id="achFlatFileWriter" class="org.springframework.batch.item.file.FlatFileItemWriter"
        scope="step">
        <property name="resource" value="#{jobParameters['settlementTimestamp']}**#{VALUE_FROM_READER}**.MPS.txt" />
        <property name="shouldDeleteIfExists" value="true" />
        <property name="lineAggregator">
            <bean
                class="org.springframework.batch.item.file.transform.FormatterLineAggregator">
                <property name="fieldExtractor">
                    <bean
                        class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
                        <property name="names" value="writeToFile" />
                    </bean>
                </property>
                <property name="format" value="%s" />
            </bean>
        </property>

    </bean>

这里VALUE_FROM_READER将来自读者, 我尝试通过监听器将值添加到作业上下文中,这没有用。任何方法将不胜感激。

3 个答案:

答案 0 :(得分:0)

您可以创建包含资源的bean。 您将其设置在阅读器中并在作者中阅读。

答案 1 :(得分:0)

使用JavaConfig的另一种方法,在Config文件中使用Property,在Reader中设置它并在writer中读取它。我已经快速设置了我的环境,因此您可以改进rosource name属性的范围,以避免多个/并发读/写。

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
....

public String getResourceName() {
        return resourceName;
    }

.....

@Bean
      public ItemReader<GeData> reader() throws Exception {     
        JdbcCursorItemReader<GeData> reader = new JdbcCursorItemReader<GeData>();
        reader.setDataSource(DBConfiguration.getDataSource());
        reader.setRowMapper(rowMapper);
        reader.setSql("....");
        setResourceName("resourceNameFromReader.txt");
        return reader;
    }

......
......

@Bean
    public ItemWriter<GeData> writer(DataSource dataSource) {   
        MyItemWriter writer = new MyItemWriter();  
        writer.setResource(new FileSystemResource("E:\\" + getResourceName()));
        return writer;
    }

我已在我的配置及其工作中尝试过。希望这会有所帮助。

答案 2 :(得分:0)

“ClassifierCompositeItemWriter”成功了。

以下是详细信息

在工作中 -

<chunk reader="achFileHeaderReader" processor="achFileContentProcessor" writer="achFileContentWriter" commit-interval="1" >
                <streams>
                    <stream ref="AItemWriter" />
                    <stream ref="BItemWriter" />
                    <stream ref="CItemWriter" />
                </streams>
            </chunk>

作家BEAN -

         

<bean id="classifier"  class="org.springframework.classify.BackToBackPatternClassifier">
<property name="routerDelegate">
    <bean class="com.abc.myabc.writer.ItemCodeClassifier" >
        <property name="contextInjector" ref="stepExecutionContextInjector"></property>
    </bean>
</property>
<property name="matcherMap">
    <map>
    <entry key="A" value-ref="AItemWriter" />
    <entry key="B" value-ref="BItemWriter" />
    <entry key="C" value-ref="CItemWriter" />
    </map>
</property>
</bean>

1.Inside ItemCodeClassifier编写用于返回资源后缀String的逻辑。

2.分别使用不同的资源名称将委托bean注入AItemWriter,BItemWriter,CItemWriter。

到目前为止,您必须硬编码不同的ItemWriters