【问题标题】:How to write a spring batch step without an itemwriter如何在没有 itemwriter 的情况下编写 spring 批处理步骤
【发布时间】:2014-10-05 11:35:59
【问题描述】:

我正在尝试使用以下配置来配置没有项目编写器的弹簧批处理步骤。但是我得到错误说那个作家 元素既没有“writer”属性也没有元素。

我浏览了链接spring batch : Tasklet without ItemWriter。但无法解决问题。 谁能告诉我在我提到的代码 sn-p 中要进行的具体更改

<batch:job id="helloWorldJob">
        <batch:step id="step1">
            <batch:tasklet>
                <batch:chunk reader="cvsFileItemReader"
                    commit-interval="10">
                </batch:chunk>
            </batch:tasklet>
        </batch:step>
    </batch:job>

    <bean id="cvsFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader">

        <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,sales,qty,staffName,date" />
                    </bean>
                </property>
                <property name="fieldSetMapper">
                    <bean class="com.mkyong.ReportFieldSetMapper" />

                    <!-- if no data type conversion, use BeanWrapperFieldSetMapper to map by name
                    <bean
                        class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
                        <property name="prototypeBeanName" value="report" />
                    </bean>
                     -->
                </property>
            </bean>
        </property>

    </bean>

【问题讨论】:

  • 为什么你想要基于块的阅读,但之后放弃一切?为什么只看书不写东西?对于基于块的处理,读取器和写入器是强制性的,只有处理器是可选的,这很有意义,因为读取而不写入实际上没有意义......
  • 为什么 tasklet 不适合你?我在一个小任务中调用一个过程,它工作得很好。如果你不需要(为什么你需要)基于块的阅读,那为什么不使用一个简单的 tasklet 呢?

标签: spring spring-batch


【解决方案1】:

对于基于块的步骤读取器和写入器是必需的。
如果您不想要编写器,请使用不执行任何操作的无操作 ItemWriter。

编辑:
无操作实现是接口 tha 的空实现......什么都没有!
只需让您的类使用空方法实现理想的接口即可。

无操作 ItemWriter:

public class NoOpItemWriter implements ItemWriter {
  void write(java.util.List<? extends T> items) throws java.lang.Exception {
    // no-op
  }
}

【讨论】:

  • 你能告诉我如何在上面的例子中配置一个无操作的项目写入器。我是一个初学者,因此需要一些基本的帮助。提前谢谢。
  • 非常感谢..在您发布 NoOpItemWriter 之前实现了实现.. 或者在我发布相同的问题之后..无论如何谢谢..:)
  • @Luca Basso Ricci - 因为我们需要指定处理器的输入和输出类型以及编写器的输入类型,所以处理器在这里返回null 是否足够?此外,由于这里没有写入任何内容,因此将块大小指定为尽可能高是否明智?关于块大小/提交间隔值的任何建议?
  • 想补充一点,虽然这适用于 itemwriter,但它不适用于 itemreader。反之则需要一个小任务。这篇文章的详细信息:stackoverflow.com/questions/48590704/…
【解决方案2】:

我希望你能得到答案,但我想为其他读者解释一下,当我们使用块时,通常我们声明读取器、处理器和写入器。在块中读取器和写入器是强制性的,处理器是可选的。在您的情况下,如果您不需要编写器,那么您需要创建一个实现 ItemWriter 的类。覆盖 write 方法并将其保留为空白。现在创建一个 writer 类的 bean 并将其作为 writer 的引用传递。

<batch:step id="recordProcessingStep" >
        <batch:tasklet>
            <batch:chunk reader="fileReader" processor="recordProcessor"
                writer="rocordWriter" commit-interval="1" />
        </batch:tasklet>
    </batch:step>

您的 writer 类将如下所示。

public class RecordWriter<T> implements ItemWriter<T> {
@Override
public void write(List<? extends T> items) throws Exception {
    // TODO Auto-generated method stub

}

}

【讨论】:

    【解决方案3】:

    maven repo 你可以找到框架“spring-batch-samples”。
    在这个框架中你会发现这个 Writer :

    org.springframework.batch.sample.support.DummyItemWriter
    

    【讨论】:

    • 此编写器仅用于测试或演示目的,而非生产代码,因为它调用Thread.sleep(500);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 2019-12-16
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多