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

spring batch ItemReader FlatFileItemReader将光标设置为从特定行开始读取,或将行设置为动态跳过

梅宏盛
2023-03-14

在springbatch quartz设置中,我使用FlatFileItemReader读取CSV文件。我想设置读卡器的光标,以使用读卡器的给定参数启动下一个jobinstance。可能吗?

<bean id="cvsFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
    <!-- Read a csv file -->
    <property name="resource" value="classpath:cvs/input/report.csv" />

    <property name="lineMapper">
        <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
            <property name="lineTokenizer">
                <bean
                    class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
                    <property name="names" value="id,impressions" />
                </bean>
            </property>
            <property name="fieldSetMapper">
                <bean
                    class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
                    <property name="prototypeBeanName" value="report" />
                </bean>
            </property>
        </bean>
    </property>

</bean>

这样做的目的是继续读取下一次执行中上次失败的文件。我为customWriter中写入的每一行输入一个整数'writecursor'。

public void write(List<? extends Report> items) throws Exception {

System.out.println("writer..." + items.size() + " > ");     
for(Report item : items){
    System.out.println("writing item id: " + item.getId());     
    System.out.println(item);

}
//getting stepExecution by implementing StepExecutionListener
this.stepExecution.getExecutionContext().putInt("writecursor", ++writecursor);

}

现在,在自定义ItemReadListener中,我想获取更新写库值,然后跳过顶部的行开始从写库读取

public class CustomItemReaderListener implements ItemReadListener<Report>, StepExecutionListener {

    ApplicationContext context = ApplicationContextUtils.getApplicationContext();
    private StepExecution stepExecution;
    @Override
    public void beforeRead() {
        //Skip lines somehow
    }

我看到的另一个可能的解决方案是在项目阅读器中动态设置linestoskip。这里有一个线程http://thisisurl.com/dynamic-value-for-linestoskip-in-itemreader但还没有回答。这里,http://forum.spring.io/forum/spring-projects/batch/100950-accessing-job-execution-context-from-itemwriter

共有2个答案

陆雅志
2023-03-14

实现要跳过的行的一个更简单的方法是:

在xml中创建一个读取器平面文件读取器,将读取器自动连接到步骤执行侦听器的beforstep,如下所示

public class CustomStepListener implements StepExecutionListener {

    @Autowired
    @Qualifier("cvsFileItemReader")
    FlatFileItemReader cvsFileItmRdr;

    @Override
    public void  beforeStep(StepExecution stepExecution) {
        System.out.println("StepExecutionListener -------- beforeStep");            
        cvsFileItmRdr.setLinesToSkip(4);
    }

    @Override
    public ExitStatus afterStep(StepExecution stepExecution) {
        System.out.println("StepExecutionListener - afterStep");
        return null;
    }

}

这对我来说很好。。。。。

弘浩博
2023-03-14

使用FlatFileItemReader.linesToSkip属性设置注入作业参数值。

<bean id="myReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
    <property name="linesToSkip" value="file:#{jobParameters['cursor']}" />
</bean>
 类似资料:
  • 问题内容: 我的表中有一行我不想更改(曾经)。 是否可以将MySQL行设置为READ-ONLY,以便不能以任何方式更新它?如果是这样,怎么办? 如果不是,是否可以在该行的某一列中设置一个永久值,以使其无法更改?如果是这样,怎么办? 谢谢。 问题答案: 这可能是业务逻辑,可能不属于您的数据存储层。但是,仍然可以使用触发器来实现。 如果将要更新“锁定”记录,则可以创建引发错误的触发器;由于 在执行 该

  • 问题内容: 我想知道如何逆转置成: 那么,如何只考虑值> 0 来转置结果in中的列? 问题答案: MySQL没有UNPIVOT函数,但是您可以使用将列转换为行。 基本语法为: 对于您的情况,您声明需要动态列的解决方案。如果真是这样,那么您将需要使用准备好的语句来生成动态SQL: 参见带有演示的SQL Fiddle

  • 我正在使用React-useState创建状态为的对象。在成功调用API后,将更新为数据对象。 我有一个表单可以更改此状态,但我还有一个取消按钮。单击“取消”时,如何将此状态恢复为其初始值(API调用后)? 我应该创建另一个状态变量和存储初始状态在那里,然后更新我的状态基于?

  • 问题内容: 我对此有一个文件模拟:… 我想从存在“ HDK1001”字样的行开始阅读,并在世界“ HDK7564”字样处结束阅读 我尝试使用此代码,但无法执行限制 请帮帮我 问题答案: 试试这个代码。

  • 问题内容: 对于matlpotlib来说我还很陌生,我发现刻度线定位器和标签令人困惑,所以请多多包涵。我发誓我已经搜寻了几个小时。 我有一个这样的数据框“框架”(相关列): 其中,工作日名称是索引,而工作日编号是一列。此框架中没有日期时间对象。 我把这个变成了一个数字。 我需要将x轴用作数值,因为我想稍后添加一个散点图,这对于字符串值是不可能的。 这样可以 所以基本上我希望我的xticks是“ d

  • 问题内容: Hai Guys,我想将光标设置在文本框上长度为14的位置,该位置将没有值。.我知道最初的光标将是0,但我希望它是14 问题答案: IE在设置光标位置时使用的方法与Firefox,Opera和Chrome不同。最好创建一个辅助函数,它将为您完成。我将其用于自己的需求。 最后一件事是从onfocus处理程序中调用它。 祝好运